diff --git a/doc/_static/breathe.css b/doc/_static/breathe.css
index 96e5a497..2a1534b0 100644
--- a/doc/_static/breathe.css
+++ b/doc/_static/breathe.css
@@ -14,3 +14,15 @@
.container .breathe-sectiondef {
width: inherit;
}
+
+.github-btn {
+ border: 0;
+ overflow: hidden;
+}
+
+.jumbotron {
+ background-size: 100% 4px;
+ background-repeat: repeat-y;
+ color: white;
+ text-align: center;
+}
diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html
index 6e8372f3..079184da 100644
--- a/doc/_templates/layout.html
+++ b/doc/_templates/layout.html
@@ -1,5 +1,28 @@
{% extends "!layout.html" %}
+{% block header %}
+{% if pagename == "index" %}
+
+
+
C++ Format
+
Small, safe and fast formatting library for C++
+
+
+
+{% endif %}
+{% endblock %}
+
{% block footer %}
{{ super() }}
diff --git a/doc/conf.py b/doc/conf.py
index 172299a7..cb2b4403 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -46,7 +46,7 @@ source_suffix = '.rst'
#source_encoding = 'utf-8-sig'
# The master toctree document.
-master_doc = 'index'
+#master_doc = 'contents'
# General information about the project.
project = u'C++ Format'
diff --git a/doc/contents.rst b/doc/contents.rst
new file mode 100644
index 00000000..c66257f7
--- /dev/null
+++ b/doc/contents.rst
@@ -0,0 +1,10 @@
+##########
+C++ Format
+##########
+
+.. toctree::
+ :maxdepth: 2
+
+ usage
+ reference
+ syntax
diff --git a/doc/index.rst b/doc/index.rst
index c66257f7..72311cf8 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -1,10 +1,155 @@
-##########
-C++ Format
-##########
+Overview
+========
-.. toctree::
- :maxdepth: 2
+C++ Format (cppformat) is an open-source formatting library for C++.
+It can be used as a safe alternative to printf or as a fast
+alternative to IOStreams.
- usage
- reference
- syntax
+.. _format-api:
+
+Format API
+----------
+
+The replacement-based Format API provides a safe alternative to ``printf``,
+``sprintf`` and friends with comparable or `better performance
+`_.
+The `format string syntax `_ is similar
+to the one used by `str.format `_
+in Python:
+
+.. code:: c++
+
+ fmt::format("The answer is {}", 42);
+
+The ``fmt::format`` function returns a string "The answer is 42". You can use
+``fmt::MemoryWriter`` to avoid constructing ``std::string``:
+
+.. code:: c++
+
+ fmt::MemoryWriter w;
+ w.write("Look, a {} string", 'C');
+ w.c_str(); // returns a C string (const char*)
+
+The ``fmt::print`` function performs formatting and writes the result to a file:
+
+.. code:: c++
+
+ fmt::print(stderr, "System error code = {}\n", errno);
+
+The file argument can be omitted in which case the function prints to
+``stdout``:
+
+.. code:: c++
+
+ fmt::print("Don't {}\n", "panic");
+
+If your compiler supports C++11, then the formatting functions are implemented
+with variadic templates. Otherwise variadic functions are emulated by generating
+a set of lightweight wrappers. This ensures compatibility with older compilers
+while providing a natural API.
+
+The Format API also supports positional arguments useful for localization:
+
+.. code:: c++
+
+ fmt::print("I'd rather be {1} than {0}.", "right", "happy");
+
+.. _write-api:
+
+Write API
+---------
+
+The concatenation-based Write API (experimental) provides a
+`fast `_
+stateless alternative to IOStreams:
+
+.. code:: c++
+
+ fmt::MemoryWriter out;
+ out << "The answer in hexadecimal is " << hex(42);
+
+.. _safety:
+
+Safety
+------
+
+The library is fully type safe, automatic memory management prevents buffer overflow,
+errors in format strings are reported using exceptions. For example, the code
+
+.. code:: c++
+
+ fmt::format("The answer is {:d}", "forty-two");
+
+throws a ``FormatError`` exception with description
+"unknown format code 'd' for string", because the argument
+``"forty-two"`` is a string while the format code ``d``
+only applies to integers.
+
+Where possible, errors are catched at compile time. For example, the code
+
+.. code:: c++
+
+ fmt::format("Cyrillic letter {}", L'\x42e');
+
+produces a compile-time error because wide character ``L'\x42e'`` cannot be
+formatted into a narrow string. You can use a wide format string instead:
+
+.. code:: c++
+
+ fmt::format(L"Cyrillic letter {}", L'\x42e');
+
+For comparison, writing a wide character to ``std::ostream`` results in
+its numeric value being written to the stream (i.e. 1070 instead of letter 'ю' which
+is represented by ``L'\x42e'`` if we use Unicode) which is rarely what is needed.
+
+.. _portability:
+
+Portability
+-----------
+
+C++ Format is highly portable. Here is an incomplete list of operating systems and
+compilers where it has been tested and known to work:
+
+* 64-bit (amd64) GNU/Linux with GCC 4.4.3, `4.6.3 `_,
+ 4.7.2, 4.8.1 and Intel C++ Compiler (ICC) 14.0.2
+
+* 32-bit (i386) GNU/Linux with GCC 4.4.3, 4.6.3
+
+* Mac OS X with GCC 4.2.1 and Clang 4.2, 5.1.0
+
+* 64-bit Windows with Visual C++ 2010 and
+ `2013 `_
+
+* 32-bit Windows with Visual C++ 2010
+
+Although the library uses C++11 features when available, it also works with older
+compilers and standard library implementations.
+
+The output of all formatting functions is consistent across platforms. In particular,
+formatting a floating-point infinity always gives ``inf`` while the output
+of ``printf`` is platform-dependent in this case. For example,
+
+.. code::
+
+ fmt::print("{}", std::numeric_limits::infinity());
+
+always prints ``inf``.
+
+.. _ease-of-use:
+
+Ease of Use
+-----------
+
+C++ Format has small self-contained code base consisting of a single header file
+and a single source file and no external dependencies. A permissive BSD `license
+`_ allows using the library both
+in open-source and commercial projects.
+
+.. raw:: html
+
+ GitHub Repository
+
+