diff --git a/README.md b/README.md
index 1d7b310440..7538aca2d5 100644
--- a/README.md
+++ b/README.md
@@ -4,10 +4,73 @@
+
+
+[![GitHub Release](https://img.shields.io/github/v/release/orhun/git-cliff?style=flat&labelColor=1C2C2E&color=C96329&logo=GitHub&logoColor=white)](https://github.com/orhun/git-cliff/releases)
+[![Crate Release](https://img.shields.io/crates/v/git-cliff?style=flat&labelColor=1C2C2E&color=C96329&logo=Rust&logoColor=white)](https://crates.io/crates/git-cliff/)
+[![Coverage](https://img.shields.io/codecov/c/gh/orhun/git-cliff?style=flat&labelColor=1C2C2E&color=C96329&logo=Codecov&logoColor=white)](https://codecov.io/gh/orhun/git-cliff)
+
+[![Continuous Integration](https://img.shields.io/github/workflow/status/orhun/git-cliff/Continuous%20Integration?style=flat&labelColor=1C2C2E&color=BEC5C9&logo=GitHub%20Actions&logoColor=BEC5C9)](https://github.com/orhun/git-cliff/actions?query=workflow%3A%22Continuous+Integration%22)
+[![Continuous Deployment](https://img.shields.io/github/workflow/status/orhun/git-cliff/Continuous%20Deployment?style=flat&labelColor=1C2C2E&color=BEC5C9&logo=GitHub%20Actions&logoColor=BEC5C9&label=deploy)](https://github.com/orhun/git-cliff/actions?query=workflow%3A%22Continuous+Deployment%22)
+[![Docker Builds](https://img.shields.io/docker/cloud/build/orhunp/git-cliff?style=flat&labelColor=1C2C2E&color=BEC5C9&label=docker&logo=Docker&logoColor=BEC5C9)](https://hub.docker.com/r/orhunp/git-cliff)
+[![Documentation](https://img.shields.io/docsrs/git-cliff-core?style=flat&labelColor=1C2C2E&color=BEC5C9&logo=Rust&logoColor=BEC5C9E)](https://docs.rs/git-cliff-core/)
+
+
+
+## About
+
+**git-cliff** can generate [changelog](https://en.wikipedia.org/wiki/Changelog) files from the [Git](https://git-scm.com/) history by utilizing [conventional commits](#conventional_commits) as well as regex-powered [custom parsers](#commit_parsers). The [changelog template](#templating) can be customized with a [configuration file](#configuration-file) to match the desired format.
+
+- [About](#about)
+- [Installation](#installation)
+ - [From crates.io](#from-cratesio)
+ - [Binary Releases](#binary-releases)
+- [Usage](#usage)
+ - [Command Line Arguments](#command-line-arguments)
+- [Configuration File](#configuration-file)
+ - [changelog](#changelog)
+ - [header](#header)
+ - [body](#body)
+ - [trim](#trim)
+ - [footer](#footer)
+ - [git](#git)
+ - [conventional_commits](#conventional_commits)
+ - [commit_parsers](#commit_parsers)
+ - [filter_commits](#filter_commits)
+ - [tag_pattern](#tag_pattern)
+ - [skip_tags](#skip_tags)
+- [Templating](#templating)
+ - [Context](#context)
+ - [Conventional Commits](#conventional-commits)
+ - [Non-Conventional Commits](#non-conventional-commits)
+ - [Syntax](#syntax)
+- [Examples](#examples)
+ - [Simple](#simple)
+ - [Other](#other)
+- [Docker](#docker)
+- [GitHub Action](#github-action)
+- [Similar Projects](#similar-projects)
+- [License](#license)
+- [Copyright](#copyright)
+
## Installation
+### From crates.io
+
+[git-cliff](crates.io/crates/git-cliff) can be installed from crates.io:
+
+```sh
+cargo install git-cliff
+```
+
+### Binary Releases
+
+See the available binaries for different operating systems/architectures from the [releases page](https://github.com/orhun/git-cliff/releases).
+
## Usage
+### Command Line Arguments
+
```
git-cliff [FLAGS] [OPTIONS] [RANGE]
```
@@ -41,9 +104,219 @@ git-cliff [FLAGS] [OPTIONS] [RANGE]
Sets the commit range to process
```
-### Docker
+## Configuration File
+
+**git-cliff** configuration file supports [TOML](https://github.com/toml-lang/toml) (preferred) and [YAML](https://yaml.org) formats.
+
+See [cliff.toml](./cliff.toml) for an example.
+
+### changelog
+
+This section contains the configuration options for changelog generation.
+
+```toml
+[changelog]
+header = "Changelog"
+body = """
+{% for group, commits in commits | group_by(attribute="group") %}
+ ### {{ group | upper_first }}
+ {% for commit in commits %}
+ - {{ commit.message | upper_first }}
+ {% endfor %}
+{% endfor %}
+"""
+trim = true
+footer = ""
+```
+
+#### header
+
+Header text that will be added to the beginning of the changelog.
+
+#### body
+
+Body template that represents a single release in the changelog.
+
+See [templating](#templating) for more detail.
+
+#### trim
+
+If set to `true`, leading and trailing whitespaces are removed from the [body](#body).
+
+It is useful for adding indentation to the template for readability, as shown [in the example](#changelog).
+
+#### footer
+
+Footer text that will be added to the end of the changelog.
+
+### git
+
+This section contains the parsing and git related configuration options.
+
+```toml
+[git]
+conventional_commits = true
+commit_parsers = [
+ { message = "^feat*", group = "Features"},
+ { message = "^fix*", group = "Bug Fixes"},
+ { message = "^doc*", group = "Documentation"},
+ { message = "^perf*", group = "Performance"},
+ { message = "^refactor*", group = "Refactor"},
+ { message = "^style*", group = "Styling"},
+ { message = "^test*", group = "Testing"},
+]
+filter_commits = false
+tag_pattern = "v[0-9]*"
+skip_tags = "v0.1.0-beta.1"
+```
+
+#### conventional_commits
+
+If set to `true`, parses the commits according to the [Conventional Commits specifications](https://www.conventionalcommits.org).
+
+> The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with SemVer, by describing the features, fixes, and breaking changes made in commit messages.
+
+> The commit message should be structured as follows:
+
+```
+[optional scope]:
+
+[optional body]
+
+[optional footer(s)]
+```
+
+e.g. `feat(parser): add ability to parse arrays`
+
+#### commit_parsers
+
+An array of commit parsers for determining the commit groups by using regex.
+
+Examples:
+
+- `{ message = "^feat*", group = "Features"}`
+ - Group the commit as "Features" if the commit message (description) starts with "feat".
+- `{ body = ".*security", group = "Security"}`
+ - Group the commit as "Security" if the commit body contains "security".
+- `{ message = ".*deprecated", body = ".*deprecated", group = "Deprecation"}`
+ - Group the commit as "Deprecation" if the commit body and message contains "deprecated".
+- `{ message = "^revert*", skip = true}`
+ - Skip processing the commit if the commit message (description) starts with "revert".
+
+#### filter_commits
-The easiest way of running **git-cliff** (in the git root directory) is to use the [available tags](https://hub.docker.com/repository/docker/orhunp/git-cliff/tags) from [Docker Hub](https://hub.docker.com/repository/docker/orhunp/git-cliff):
+If set to `true`, commits that are not matched by [commit parsers](#commit_parsers) are filtered out.
+
+#### tag_pattern
+
+A glob pattern for matching the git tags.
+
+e.g. It processes the same tags as the output of the following git command:
+
+```sh
+git tag --list 'v[0-9]*'
+```
+
+#### skip_tags
+
+A regex for skip processing the matched tags.
+
+## Templating
+
+A template is a text where variables and expressions get replaced with values when it is rendered.
+
+### Context
+
+Context is the model that holds the required data for a template rendering. The [JSON](https://en.wikipedia.org/wiki/JSON) format is used in the following examples for the representation of a context.
+
+#### Conventional Commits
+
+> conventional_commits = **true**
+
+For a [conventional commit](#conventional_commits) like this,
+
+```
+[scope]:
+
+[body]
+
+[footer]
+```
+
+following context is generated to use for templating:
+
+
+```json
+// represents a release
+{
+ "version": "v0.1.0-rc.21",
+ "commits": [
+ {
+ "id": "e795460c9bb7275294d1fa53a9d73258fb51eb10",
+ "group": "", // overrided by commit_parsers
+ "scope": "[scope]",
+ "message": "",
+ "body": "[body]",
+ "footer": "[footer]",
+ "breaking": false
+ }
+ ],
+ "commit_id": "a440c6eb26404be4877b7e3ad592bfaa5d4eb210", // release commit
+ "timestamp": 1625169301,
+ "previous": {} // previous release
+}
+```
+
+#### Non-Conventional Commits
+
+> conventional_commits = **false**
+
+If [conventional_commits](#conventional_commits) is set to `false`, then some of the fields are omitted from the context or squashed into the `message` field:
+
+
+```json
+// represents a release
+{
+ "version": "v0.1.0-rc.21",
+ "commits": [
+ {
+ "id": "e795460c9bb7275294d1fa53a9d73258fb51eb10",
+ "group": "", // overrided by commit_parsers
+ "message": "", // whole commit message including description, footer, etc.
+ }
+ ],
+ "commit_id": "a440c6eb26404be4877b7e3ad592bfaa5d4eb210", // release commit
+ "timestamp": 1625169301,
+ "previous": {} // previous release
+}
+```
+
+### Syntax
+
+**git-cliff** uses [Tera](https://github.com/Keats/tera) as a template engine which has a syntax based on [Jinja2](http://jinja.pocoo.org/) and [Django](https://docs.djangoproject.com/en/3.1/topics/templates/) templates.
+
+There are 3 kinds of delimiters and those cannot be changed:
+
+- `{{` and `}}` for expressions
+- `{%` or `{%-` and `%}` or `-%}` for statements
+- `{#` and `#}` for comments
+
+See the [Tera Documentation](https://tera.netlify.app/docs/#templates) for more information about [control structures](https://tera.netlify.app/docs/#control-structures), [built-ins](https://tera.netlify.app/docs/#built-ins), etc.
+
+## Examples
+
+### Simple
+
+TODO
+
+### Other
+
+- [Setting the release notes for GitHub releases using git-cliff-action](./.github/workflows/cd.yml)
+- [Setting the changelog as a message of an annotated tag](./release.sh)
+
+## Docker
+
+The easiest way of running **git-cliff** (in the git root directory with [configuration file](#configuration-file) present) is to use the [available tags](https://hub.docker.com/repository/docker/orhunp/git-cliff/tags) from [Docker Hub](https://hub.docker.com/repository/docker/orhunp/git-cliff):
```sh
docker run -t -v "$(pwd)":/app/ orhunp/git-cliff:latest
@@ -57,7 +330,28 @@ docker run -t -v "$(pwd)":/app/ docker.pkg.github.com/orhun/git-cliff/git-cliff:
Also, you can build the image yourself using `docker build -t git-cliff .` command.
-## Examples
+## GitHub Action
+
+It is possible to generate changelogs using [GitHub Actions](https://docs.github.com/en/actions) via [git-cliff-action](https://github.com/orhun/git-cliff-action).
+
+```yml
+- name: Generate a changelog
+ uses: orhun/git-cliff-action@v1
+ with:
+ config: cliff.toml
+ args: --verbose
+ env:
+ OUTPUT: CHANGELOG.md
+```
+
+See the [repository](https://github.com/orhun/git-cliff-action) for other [examples](https://github.com/orhun/git-cliff-action#examples).
+
+## Similar Projects
+
+- [clog-cli](https://github.com/clog-tool/clog-cli) - Generate beautiful changelogs from your Git commit history
+- [relnotes](https://crates.io/crates/relnotes) - A tool to automatically generate release notes for your project.
+- [cocogitto](https://github.com/oknozor/cocogitto) - A set of CLI tools for the conventional commit
+and semver specifications.
## License