aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/docs/en
diff options
context:
space:
mode:
authorMarien Fressinaud <dev@marienfressinaud.fr>2017-04-23 09:36:05 +0200
committerMarien Fressinaud <dev@marienfressinaud.fr>2017-04-24 23:08:43 +0200
commitafc38e43ec724c79b73e1a9fa68f33c56eb1add9 (patch)
treea90fbc79ce6bdd26b5c3304677770aa75ea5cda9 /docs/en
parentc3e17abcf02664ecfca1d82068ef441a6338c18a (diff)
downloadfreshrss-afc38e43ec724c79b73e1a9fa68f33c56eb1add9.tar.gz
freshrss-afc38e43ec724c79b73e1a9fa68f33c56eb1add9.zip
Provide documentation under ./docs
Diffstat (limited to 'docs/en')
-rw-r--r--docs/en/contributing.md55
-rw-r--r--docs/en/developers/01_First_steps.md194
-rw-r--r--docs/en/developers/02_Github.md11
-rw-r--r--docs/en/developers/03_Backend/01_Database_schema.md0
-rw-r--r--docs/en/developers/03_Backend/02_Minz.md27
-rw-r--r--docs/en/developers/03_Backend/03_External_libraries.md0
-rw-r--r--docs/en/developers/03_Backend/04_Changing_source_code.md15
-rw-r--r--docs/en/developers/03_Backend/05_Extensions.md334
-rw-r--r--docs/en/developers/04_Frontend/01_View_files.md15
-rw-r--r--docs/en/developers/04_Frontend/02_Design.md11
-rw-r--r--docs/en/developers/05_Release_new_version.md1
-rw-r--r--docs/en/img/doc.edit.pngbin0 -> 24939 bytes
-rw-r--r--docs/en/img/logo_freshrss.pngbin0 -> 14476 bytes
-rw-r--r--docs/en/img/users/anonymous_access.1.pngbin0 -> 28863 bytes
-rw-r--r--docs/en/img/users/feed.add.1.pngbin0 -> 7382 bytes
-rw-r--r--docs/en/img/users/feed.filter.1.pngbin0 -> 8118 bytes
-rw-r--r--docs/en/img/users/feed.filter.2.pngbin0 -> 1972 bytes
-rw-r--r--docs/en/img/users/refresh.1.pngbin0 -> 4945 bytes
-rw-r--r--docs/en/img/users/refresh.2.pngbin0 -> 8258 bytes
-rw-r--r--docs/en/img/users/refresh.3.pngbin0 -> 2182 bytes
-rw-r--r--docs/en/img/users/refresh.4.pngbin0 -> 3754 bytes
-rw-r--r--docs/en/img/users/refresh.5.pngbin0 -> 1948 bytes
-rw-r--r--docs/en/img/users/refresh.6.pngbin0 -> 282 bytes
-rw-r--r--docs/en/img/users/status.filter.0.7.pngbin0 -> 12605 bytes
-rw-r--r--docs/en/img/users/status.filter.0.8.pngbin0 -> 1601 bytes
-rw-r--r--docs/en/img/users/token.1.pngbin0 -> 28656 bytes
-rw-r--r--docs/en/index.md46
-rw-r--r--docs/en/users/01_Installation.md123
-rw-r--r--docs/en/users/02_First_steps.md26
-rw-r--r--docs/en/users/03_Main_view.md183
-rw-r--r--docs/en/users/04_Subscriptions.md33
-rw-r--r--docs/en/users/05_Configuration.md121
-rw-r--r--docs/en/users/06_Mobile_access.md1
-rw-r--r--docs/en/users/07_Frequently_Asked_Questions.md35
34 files changed, 1231 insertions, 0 deletions
diff --git a/docs/en/contributing.md b/docs/en/contributing.md
new file mode 100644
index 000000000..7f0c3da6c
--- /dev/null
+++ b/docs/en/contributing.md
@@ -0,0 +1,55 @@
+## Join us on the mailing lists
+
+Do you want to ask us some questions? Do you want to discuss with us? Don't hesitate to subscribe to our mailing lists!
+
+- The first mailing is destined to generic information, it should be adapted to users. [Join mailing@freshrss.org](https://freshrss.org/mailman/listinfo/mailing).
+- The second mailing is mainly for developers. [Join dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev)
+
+## Report a bug
+
+You found a bug? Don't panic, here are some steps to report it easily:
+
+1. Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/issues) (don't forget to use the search bar).
+2. If you find a similar bug, don't hesitate to post a comment to add more importance to the related ticket.
+3. If you didn't find it, [open a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new).
+
+If you have to create a new ticket, try to apply the following advices:
+
+- Give an explicit title to the ticket so it will be easier to find it later.
+- Be as exhaustive as possible in the description: what did you do? What is the bug? What are the steps to reproduce the bug?
+- We also need some information:
+ + Your FreshRSS version (on about page or `constants.php` file)
+ + Your server configuration: type of hosting, PHP version
+ + Your storage system (MySQL / MariaDB / PostgreSQL or SQLite)
+ + If possible, the related logs (PHP logs and FreshRSS logs under `data/users/your_user/log.txt`)
+
+## Fix a bug
+
+Did you want to fix a bug? To keep a great coordination between collaborators, you will have to follow these indications:
+
+1. Be sure the bug is associated to a ticket and say you work on it.
+2. [Fork this project repository](https://help.github.com/articles/fork-a-repo/).
+3. [Create a new branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). The name of the branch must be explicit and being prefixed by the related ticket id. For instance, `783-contributing-file` to fix [ticket #783](https://github.com/FreshRSS/FreshRSS/issues/783).
+4. Make your changes to your fork and [send a pull request](https://help.github.com/articles/using-pull-requests/) on the **dev branch**.
+
+If you have to write code, please follow [our coding style recommendations](http://doc2.freshrss.org/en/Developer_documentation/First_steps/Coding_style).
+
+**Tip:** if you are searching for bugs easy to fix, have a look at the « [New comers](https://github.com/FreshRSS/FreshRSS/labels/New%20comers) » ticket label.
+
+## Submit an idea
+
+You have great ideas, yes! Don't be shy and open [a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new) on our bug tracker to ask if we can implement it. The greatest ideas often come from the shyest suggestions!
+
+If your idea is nice, we'll have a look at it.
+
+## Contribute to internationalization (i18n)
+
+If you want to improve internationalization, please open a new ticket first and follow indications from « Fix a bug » section.
+
+Translations are present in the subdirectories of `./app/i18n/`.
+
+We are working on a better way to handle internationalization but don't hesitate to suggest any idea!
+
+## Contribute to documentation
+
+The documentation needs a lot of improvements in order to be more useful to new contributors and we are working on it. If you want to give some help, meet us on [the dedicated repository](https://github.com/FreshRSS/documentation)!
diff --git a/docs/en/developers/01_First_steps.md b/docs/en/developers/01_First_steps.md
new file mode 100644
index 000000000..e35dbda12
--- /dev/null
+++ b/docs/en/developers/01_First_steps.md
@@ -0,0 +1,194 @@
+# Environment configuration
+
+**TODO**
+
+# Project architecture
+
+**TODO**
+
+# Coding style
+
+If you want to contribute to the source code, it is important to follow the project coding style. The actual code does not follow it throughout the project, but every time we have an opportunity, we should fix it.
+
+Contributions which do not follow the coding style will be rejected as long as the coding style is not fixed.
+
+## Spaces, tabs and white spaces
+
+### Indent
+Code indent must use tabs.
+
+### Alignment
+
+Once the code is indented, it might be useful to align it to ease the reading. In that case, use spaces.
+
+```php
+$result = a_function_with_a_really_long_name($param1, $param2,
+ $param3, $param4);
+```
+
+### End of line
+
+The end of line character must be a line feed (LF) which is a default end of line on *NIX systems. This character must not follow other white spaces.
+
+It is possible to verify if there is white spaces before the end of line, with the following Git command:
+
+```bash
+# command to check files before adding them in the Git index
+git diff --check
+# command to check files after adding them in the Git index
+git diff --check --cached
+```
+
+### End of file
+
+Every file must end by an empty line.
+
+### With commas, dots and semi-columns
+
+There is no space before those characters but there is one after.
+
+### With operators
+
+There is a space before and after every operator.
+
+```php
+if ($a == 10) {
+ // do something
+}
+
+echo $a ? 1 : 0;
+```
+
+### With brackets
+
+There is no spaces in the brackets. There is no space before the opening bracket except if it is after a keyword. There is no space after the closing bracket except if it is followed by a curly bracket.
+
+```php
+if ($a == 10) {
+ // do something
+}
+
+if ((int)$a == 10) {
+ // do something
+}
+```
+
+### With chained functions
+
+It happens most of the time in Javascript files. When there is chained functions, closures and callback functions, it is hard to understand the code if not properly formatted. In those cases, we add a new indent level for the complete instruction and reset the indent for a new instruction on the same level.
+
+```javascript
+// First instruction
+shortcut.add(shortcuts.mark_read, function () {
+ //...
+ }, {
+ 'disable_in_input': true
+ });
+// Second instruction
+shortcut.add("shift+" + shortcuts.mark_read, function () {
+ //...
+ }, {
+ 'disable_in_input': true
+ });
+```
+
+## Line length
+
+Lines should be shorter than 80 characters. However, in some case, it is possible to extend that limit to 100 characters.
+
+With functions, parameters can be declared on different lines.
+
+```php
+function my_function($param_1, $param_2,
+ $param_3, $param_4) {
+ // do something
+}
+```
+
+## Naming
+
+All the code elements (functions, classes, methods and variables) must describe their usage in concise way.
+
+### Functions and variables
+
+They must follow the "snake case" convention.
+
+```php
+// a function
+function function_name() {
+ // do something
+}
+// a variable
+$variable_name;
+```
+
+### Methods
+
+They must follow the "lower camel case" convention.
+
+```php
+private function methodName() {
+ // do something
+}
+```
+
+### Classes
+
+They must follow the "upper camel case" convention.
+
+```php
+abstract class ClassName {}
+```
+
+## Encoding
+
+Files must be encoded with UTF-8 character set.
+
+## PHP 5.3 compatibility
+
+Do not get an array item directly from a function or a method. Use a variable.
+
+```php
+// code with PHP 5.3 compatibility
+$my_variable = function_returning_an_array();
+echo $my_variable[0];
+// code without PHP 5.3 compatibility
+echo function_returning_an_array()[0];
+```
+
+Do not use short array declaration.
+
+```php
+// code with PHP 5.3 compatibility
+$variable = array();
+// code without PHP 5.3 compatibility
+$variable = [];
+```
+
+## Miscellaneous
+
+### Operators
+They must be at the end of the line if a condition runs on more than one line.
+
+```php
+if ($a == 10 ||
+ $a == 20) {
+ // do something
+}
+```
+
+### End of file
+
+If the file contains only PHP code, the PHP closing tag must be omitted.
+
+### Arrays
+
+If an array declaration runs on more than one line, each element must be followed by a comma even the last one.
+
+```php
+$variable = array(
+ "value 1",
+ "value 2",
+ "value 3",
+);
+```
diff --git a/docs/en/developers/02_Github.md b/docs/en/developers/02_Github.md
new file mode 100644
index 000000000..c16a6d040
--- /dev/null
+++ b/docs/en/developers/02_Github.md
@@ -0,0 +1,11 @@
+# Reporting a bug or a suggestion
+
+**TODO**
+
+# Branching
+
+**TODO**
+
+# Sending a patch
+
+**TODO**
diff --git a/docs/en/developers/03_Backend/01_Database_schema.md b/docs/en/developers/03_Backend/01_Database_schema.md
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/en/developers/03_Backend/01_Database_schema.md
diff --git a/docs/en/developers/03_Backend/02_Minz.md b/docs/en/developers/03_Backend/02_Minz.md
new file mode 100644
index 000000000..cfbea15fe
--- /dev/null
+++ b/docs/en/developers/03_Backend/02_Minz.md
@@ -0,0 +1,27 @@
+# Models
+
+**TODO**
+
+# Controllers and actions
+
+**TODO**
+
+# Views
+
+**TODO**
+
+# Routing
+
+**TODO**
+
+# Writing URL
+
+**TODO**
+
+# Internationalisation
+
+**TODO**
+
+# Understanding internals
+
+**TODO**
diff --git a/docs/en/developers/03_Backend/03_External_libraries.md b/docs/en/developers/03_Backend/03_External_libraries.md
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/en/developers/03_Backend/03_External_libraries.md
diff --git a/docs/en/developers/03_Backend/04_Changing_source_code.md b/docs/en/developers/03_Backend/04_Changing_source_code.md
new file mode 100644
index 000000000..e8a5958e4
--- /dev/null
+++ b/docs/en/developers/03_Backend/04_Changing_source_code.md
@@ -0,0 +1,15 @@
+# Accessing the database
+
+**TODO**
+
+# Writing an action and its related view
+
+**TODO**
+
+# Authentication
+
+**TODO**
+
+# Logs
+
+**TODO** \ No newline at end of file
diff --git a/docs/en/developers/03_Backend/05_Extensions.md b/docs/en/developers/03_Backend/05_Extensions.md
new file mode 100644
index 000000000..c5c00ff08
--- /dev/null
+++ b/docs/en/developers/03_Backend/05_Extensions.md
@@ -0,0 +1,334 @@
+# Writing extensions for FreshRSS
+
+## About FreshRSS
+
+FreshRSS is an RSS / Atom feeds aggregator written in PHP since October 2012. The official site is located at [freshrss.org](http://freshrss.org) and its repository is hosted by Github: [github.com/FreshRSS/FreshRSS](https://github.com/FreshRSS/FreshRSS).
+
+## Problem to solve
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+## Understanding basic mechanics (Minz and MVC)
+
+**TODO** : move to 02_Minz.md
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### MVC Architecture
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### Routing
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+Code example:
+
+```php
+<?php
+
+class FreshRSS_hello_Controller extends Minz_ActionController {
+ public function indexAction() {
+ $this->view->a_variable = 'FooBar';
+ }
+
+ public function worldAction() {
+ $this->view->a_variable = 'Hello World!';
+ }
+}
+
+?>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### Views
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+Code example:
+
+```html
+<p>
+ This is a parameter passed from the controller: <?php echo $this->a_variable; ?>
+</p>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### Working with GET / POST
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+Code example:
+
+```php
+<?php
+
+$default_value = 'foo';
+$param = Minz_Request::param('bar', $default_value);
+
+// Display the value of the parameter `bar` (passed via GET or POST)
+// or "foo" if the parameter does not exist.
+echo $param;
+
+// Sets the value of the `bar` parameter
+Minz_Request::_param('bar', 'baz');
+
+// Will necessarily display "baz" since we have just forced its value.
+// Note that the second parameter (default) is optional.
+echo Minz_Request::param('bar');
+
+?>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### Access session settings
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### Working with URLs
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+```html
+<p>
+ Go to page <a href="http://example.com?c=hello&amp;a=world">Hello world</a>!
+</p>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+```php
+<?php
+
+$url_array = array(
+ 'c' => 'hello',
+ 'a' => 'world',
+ 'params' => array(
+ 'foo' => 'bar',
+ )
+);
+
+// Show something like .?c=hello&amp;a=world&amp;foo=bar
+echo Minz_Url::display($url_array);
+
+?>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+```php
+<?php
+
+// Displays the same as above
+echo _url('hello', 'world', 'foo', 'bar');
+
+?>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### Redirections
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+Code example:
+
+```php
+<?php
+
+$url_array = array(
+ 'c' => 'hello',
+ 'a' => 'world'
+);
+
+// Tells Minz to redirect the user to the hello / world page.
+// Note that this is a redirection in the Minz sense of the term, not a redirection that the browser will have to manage (HTTP code 301 or 302)
+// The code that follows forward() will thus be executed!
+Minz_Request::forward($url_array);
+
+// To perform a type 302 redirect, add "true".
+// The code that follows will never be executed.
+Minz_Request::forward($url_array, true);
+
+?>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+```php
+<?php
+
+$url_array = array(
+ 'c' => 'hello',
+ 'a' => 'world'
+);
+$feedback_good = 'Tout s\'est bien passé !';
+$feedback_bad = 'Oups, quelque chose n\'a pas marché.';
+
+Minz_Request::good($feedback_good, $url_array);
+
+// or
+
+Minz_Request::bad($feedback_bad, $url_array);
+
+?>
+```
+
+### Translation Management
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+```php
+<?php
+
+return array(
+ 'action' => array(
+ 'actualize' => 'Actualiser',
+ 'back_to_rss_feeds' => '← Retour à vos flux RSS',
+ 'cancel' => 'Annuler',
+ 'create' => 'Créer',
+ 'disable' => 'Désactiver',
+ ),
+ 'freshrss' => array(
+ '_' => 'FreshRSS',
+ 'about' => 'À propos de FreshRSS',
+ ),
+);
+
+?>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+Code example:
+
+```html
+<p>
+ <a href="<?php echo _url('index', 'index'); ?>">
+ <?php echo _t('gen.action.back_to_rss_feeds'); ?>
+ </a>
+</p>
+```
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+### Configuration management
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+## Write an extension for FreshRSS
+
+Here we are! We've talked about the most useful features of Minz and how to run FreshRSS correctly and it's about time to address the extensions themselves.
+
+An extension allows you to add functionality easily to FreshRSS without having to touch the core of the project directly.
+
+### Basic files and folders
+
+The first thing to note is that **all** extensions **must** be located in the `extensions` directory, at the base of the FreshRSS tree.
+An extension is a directory containing a set of mandatory (and optional) files and subdirectories.
+The convention requires that the main directory name be preceded by an "x" to indicate that it is not an extension included by default in FreshRSS.
+
+The main directory of an extension must contain at least two **mandatory** files:
+
+- A `metadata.json` file that contains a description of the extension. This file is written in JSON.
+- An `extension.php` file containing the entry point of the extension (which is a class that inherits Minz_Extension).
+
+Please note that there is a not a required link between the directory name of the extension and the name of the class inside `extension.php`,
+but you should follow our best practice:
+If you want to write a `HelloWorld` extension, the directory name should be `xExtension-HelloWorld` and the base class name `HelloWorldExtension`.
+
+In the file `freshrss/extensions/xExtension-HelloWorld/extension.php` you need the structure:
+```html
+class HelloWorldExtension extends Minz_Extension {
+ public function init() {
+ // your code here
+ }
+}
+```
+There is an example HelloWorld extension that you can download from [our GitHub repo](https://github.com/FreshRSS/xExtension-HelloWorld).
+
+You may also need additional files or subdirectories depending on your needs:
+
+- `configure.phtml` is the file containing the form to parameterize your extension
+- A `static/` directory containing CSS and JavaScript files that you will need for your extension (note that if you need to write a lot of CSS it may be more interesting to write a complete theme)
+- A `controllers` directory containing additional controllers
+- An `i18n` directory containing additional translations
+- `layout` and` views` directories to define new views or to overwrite the current views
+
+In addition, it is good to have a `LICENSE` file indicating the license under which your extension is distributed and a` README` file giving a detailed description of it.
+
+### The metadata.json file
+
+The `metadata.json` file defines your extension through a number of important elements. It must contain a valid JSON array containing the following entries:
+
+- `name` : the name of your extension
+- `author` : your name, your e-mail address ... but there is no specific format to adopt
+- `description` : a description of your extension
+- `version` : the current version number of the extension
+- `entrypoint` : Indicates the entry point of your extension. It must match the name of the class contained in the file `extension.php` without the suffix` Extension` (so if the entry point is `HelloWorld`, your class will be called` HelloWorldExtension`)
+- `type` : Defines the type of your extension. There are two types: `system` and` user`. We will study this difference right after.
+
+Only the `name` and` entrypoint` fields are required.
+
+### Choose between « system » or « user »
+
+A __user__ extension can be enabled by some users and not by others (typically for user preferences).
+
+A __system__ extension in comparison is enabled for every account.
+
+### Writing your own extension.php
+
+This file is the entry point of your extension. It must contain a specific class to function.
+As mentioned above, the name of the class must be your `entrypoint` suffixed by` Extension` (`HelloWorldExtension` for example).
+In addition, this class must be inherited from the `Minz_Extension` class to benefit from extensions-specific methods.
+
+Your class will benefit from four methods to redefine:
+
+- `install()` is called when a user clicks the button to activate your extension. It allows, for example, to update the database of a user in order to make it compatible with the extension. It returns `true` if everything went well or, if not, a string explaining the problem.
+- `uninstall()` is called when a user clicks the button to disable your extension. This will allow you to undo the database changes you potentially made in `install ()`. It returns `true` if everything went well or, if not, a string explaining the problem.
+- `init()` is called for every page load *if the extension is enabled*. It will therefore initialize the behavior of the extension. This is the most important method.
+- `handleConfigureAction()` is called when a user loads the extension management panel. Specifically, it is called when the `?c=extension&a=configured&e=name-of-your-extension` URL is loaded. You should also write here the behavior you want when validating the form in your `configure.phtml` file.
+
+In addition, you will have a number of methods directly inherited from `Minz_Extension` that you should not redefine:
+
+- The "getters" first: most are explicit enough not to detail them here - `getName()`, `getEntrypoint()`, `getPath()` (allows you to retrieve the path to your extension), `getAuthor()`, `getDescription()`, `getVersion()`, `getType()`.
+- `getFileUrl($filename, $type)` will return the URL to a file in the `static` directory. The first parameter is the name of the file (without `static /`), the second is the type of file to be used (`css` or` js`).
+- `registerController($base_name)` will tell Minz to take into account the given controller in the routing system. The controller must be located in your `Controllers` directory, the name of the file must be` <base_name>Controller.php` and the name of the `FreshExtension_<base_name>_Controller` class.
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
+
+- `registerViews()`
+- `registerTranslates()`
+- `registerHook($hook_name, $hook_function)`
+
+### The « hooks » system
+
+You can register at the FreshRSS event system in an extensions `init()` method, to manipulate data when some of the core functions are executed.
+
+```html
+class HelloWorldExtension extends Minz_Extension
+{
+ public function init() {
+ $this->registerHook('entry_before_display', array($this, 'renderEntry'));
+ }
+ public function renderEntry($entry) {
+ $entry->_content('<h1>Hello World</h1>' . $entry->content());
+ return $entry;
+ }
+}
+```
+The following events are available:
+
+- `entry_before_display` (`function($entry) -> Entry | null`) : will be executed every time an entry is rendered. The entry itself (instance of FreshRSS_Entry) will be passed as parameter.
+- `entry_before_insert` (`function($entry) -> Entry | null`) : will be executed when a feed is refreshed and new entries will be imported into the database. The new entry (instance of FreshRSS_Entry) will be passed as parameter.
+- `feed_before_insert` (`function($feed) -> Feed | null`) : will be executed when a new feed is imported into the database. The new feed (instance of FreshRSS_Feed) will be passed as parameter.
+- `post_update` (`function(none) -> none`) : **TODO** add documentation
+
+### Writing your own configure.phtml
+
+When you want to support user configurations for your extension or simply display some information, you have to create the `configure.phtml` file.
+
+**TODO** translate from [french version](https://github.com/FreshRSS/documentation/blob/master/fr/docs/developers/03_Backend/05_Extensions.md)
diff --git a/docs/en/developers/04_Frontend/01_View_files.md b/docs/en/developers/04_Frontend/01_View_files.md
new file mode 100644
index 000000000..5eb284dde
--- /dev/null
+++ b/docs/en/developers/04_Frontend/01_View_files.md
@@ -0,0 +1,15 @@
+# The .phtml files
+
+**TODO**
+
+# Writing a URL
+
+**TODO**
+
+# Displaying an icon
+
+**TODO**
+
+# Internationalisation
+
+**TODO**
diff --git a/docs/en/developers/04_Frontend/02_Design.md b/docs/en/developers/04_Frontend/02_Design.md
new file mode 100644
index 000000000..c2e622a08
--- /dev/null
+++ b/docs/en/developers/04_Frontend/02_Design.md
@@ -0,0 +1,11 @@
+# Template file
+
+**TODO**
+
+# Writing a new theme
+
+**TODO**
+
+# Overriding icons
+
+**TODO**
diff --git a/docs/en/developers/05_Release_new_version.md b/docs/en/developers/05_Release_new_version.md
new file mode 100644
index 000000000..e1a23c8ba
--- /dev/null
+++ b/docs/en/developers/05_Release_new_version.md
@@ -0,0 +1 @@
+**TODO**
diff --git a/docs/en/img/doc.edit.png b/docs/en/img/doc.edit.png
new file mode 100644
index 000000000..bc850e514
--- /dev/null
+++ b/docs/en/img/doc.edit.png
Binary files differ
diff --git a/docs/en/img/logo_freshrss.png b/docs/en/img/logo_freshrss.png
new file mode 100644
index 000000000..763b19cb1
--- /dev/null
+++ b/docs/en/img/logo_freshrss.png
Binary files differ
diff --git a/docs/en/img/users/anonymous_access.1.png b/docs/en/img/users/anonymous_access.1.png
new file mode 100644
index 000000000..cd4145e3e
--- /dev/null
+++ b/docs/en/img/users/anonymous_access.1.png
Binary files differ
diff --git a/docs/en/img/users/feed.add.1.png b/docs/en/img/users/feed.add.1.png
new file mode 100644
index 000000000..b6146857f
--- /dev/null
+++ b/docs/en/img/users/feed.add.1.png
Binary files differ
diff --git a/docs/en/img/users/feed.filter.1.png b/docs/en/img/users/feed.filter.1.png
new file mode 100644
index 000000000..e4738d1a0
--- /dev/null
+++ b/docs/en/img/users/feed.filter.1.png
Binary files differ
diff --git a/docs/en/img/users/feed.filter.2.png b/docs/en/img/users/feed.filter.2.png
new file mode 100644
index 000000000..5e8dd2899
--- /dev/null
+++ b/docs/en/img/users/feed.filter.2.png
Binary files differ
diff --git a/docs/en/img/users/refresh.1.png b/docs/en/img/users/refresh.1.png
new file mode 100644
index 000000000..a8c5f7ea0
--- /dev/null
+++ b/docs/en/img/users/refresh.1.png
Binary files differ
diff --git a/docs/en/img/users/refresh.2.png b/docs/en/img/users/refresh.2.png
new file mode 100644
index 000000000..1b97ab9ae
--- /dev/null
+++ b/docs/en/img/users/refresh.2.png
Binary files differ
diff --git a/docs/en/img/users/refresh.3.png b/docs/en/img/users/refresh.3.png
new file mode 100644
index 000000000..e80bfc29f
--- /dev/null
+++ b/docs/en/img/users/refresh.3.png
Binary files differ
diff --git a/docs/en/img/users/refresh.4.png b/docs/en/img/users/refresh.4.png
new file mode 100644
index 000000000..abbeb5cd4
--- /dev/null
+++ b/docs/en/img/users/refresh.4.png
Binary files differ
diff --git a/docs/en/img/users/refresh.5.png b/docs/en/img/users/refresh.5.png
new file mode 100644
index 000000000..fb3113300
--- /dev/null
+++ b/docs/en/img/users/refresh.5.png
Binary files differ
diff --git a/docs/en/img/users/refresh.6.png b/docs/en/img/users/refresh.6.png
new file mode 100644
index 000000000..0d78e3976
--- /dev/null
+++ b/docs/en/img/users/refresh.6.png
Binary files differ
diff --git a/docs/en/img/users/status.filter.0.7.png b/docs/en/img/users/status.filter.0.7.png
new file mode 100644
index 000000000..4516b937f
--- /dev/null
+++ b/docs/en/img/users/status.filter.0.7.png
Binary files differ
diff --git a/docs/en/img/users/status.filter.0.8.png b/docs/en/img/users/status.filter.0.8.png
new file mode 100644
index 000000000..5a0b9a3a1
--- /dev/null
+++ b/docs/en/img/users/status.filter.0.8.png
Binary files differ
diff --git a/docs/en/img/users/token.1.png b/docs/en/img/users/token.1.png
new file mode 100644
index 000000000..73ce65cf3
--- /dev/null
+++ b/docs/en/img/users/token.1.png
Binary files differ
diff --git a/docs/en/index.md b/docs/en/index.md
new file mode 100644
index 000000000..7a50b21c1
--- /dev/null
+++ b/docs/en/index.md
@@ -0,0 +1,46 @@
+# FreshRSS documentation
+
+The documentation has not been translated in English for yet. Here are some indication how to contribute.
+
+## How-to contribute?
+
+At the moment, FreshRSS documentation is far from being complete. We need all the help we can get to fill the blanks. If you are willing to contribute, this document provides basic directions to do it. If you want to know how documentation is generated on [doc.freshrss.org](http://doc.freshrss.org), please refer to the "How does it work?" section.
+
+1. [Fork the Github project](https://github.com/FreshRSS/documentation).
+2. Pull your fork on your computer or modify it directly on Github.
+3. The English documentation is located in the ```./en``` folder.
+4. The documentation use Markdown syntax. This syntax is pretty straightforward. If you need some guidance, read the [Github guide to Markdown](https://guides.github.com/features/mastering-markdown/).
+5. Make a "pull request" on the official repository.
+6. You are done! Your changes will go through a team review then merged. Then, we will update [doc.freshrss.org](http://doc.freshrss.org).
+
+## Translate the documentation.
+
+At the moment, the documentation is available in French for practical reasons. We are looking for people willing to translate it to English (or other languages). Please contact us on Github if you want to contribute. The process is identical to the later process except you will need to write the documentation in its own language folder, ```./en``` for English, ```./es``` for Spanish, etc.
+
+## How does it work?
+
+FreshRSS documentation is generated by [MkDocs](http://www.mkdocs.org/). It is a Python software which generates static sites designed for documentation.
+
+This repository contains only raw content in Markdown, images and configuration files (one per language).
+
+To generate the documentation website, you have to follow some few steps. First, make sure Python 2.7+ and `pip` are installed on your PC. Working in a virtual environment is better (`virtualenv`, `pew` or similar).
+
+```bash
+$ pip install mkdocs # Install MkDocs software
+$ cd ./en # Move to the English language directory
+$ mkdocs serve # Have a preview at http://127.0.0.1:8000
+$ # Build the website and push files onto your server
+$ mkdocs build --clean
+$ rsync -e ssh -P -rvzc --delete ./site/ user@server:/path/to/server/root/en
+```
+
+The `index.html` file is used to handle the home page and to support internationalised documentation since MkDocs doesn't support it yet.
+
+We use a custom version of readthedocs theme which include the fonts directly (i.e. instead of using Google servers). Tu use it, you have to copy/paste the theme directory in the language folders.
+
+```bash
+$ cd ./en
+$ cp -R ../readthedocs ./
+$ # OR with a symbolic link
+$ ln -s ../readthedocs ./
+```
diff --git a/docs/en/users/01_Installation.md b/docs/en/users/01_Installation.md
new file mode 100644
index 000000000..6c979fd42
--- /dev/null
+++ b/docs/en/users/01_Installation.md
@@ -0,0 +1,123 @@
+# Server requirements
+
+FreshRSS is a web application. This means you'll need a web server to run it. FreshRSS requirements are really low, so it could run on most shared host servers.
+
+You need to verify that your server can run FreshRSS before installing it. If your server has the proper requirements and FreshRSS does not work, please contact us to find a solution.
+
+| Software | Recommended | Works also with |
+| ----------- | ---------------- | ----------------------------- |
+| Web server | **Apache 2** | Nginx |
+| PHP | **PHP 5.3.7+** | PHP 5.2+ |
+| PHP modules | Required: libxml, cURL, PDO_MySQL, PCRE and ctype. \\ Required (32-bit only): GMP \\Recommanded: JSON, Zlib, mbstring, iconv, ZipArchive | |
+| Database | **MySQL 5.0.3+** | SQLite 3.7.4+ |
+| Browser | **Firefox** | Chrome, Opera, Safari or IE9+ |
+
+## Important notice
+
+FreshRSS **CAN** work with PHP 5.3.3. To do so, we are using specific functions available in the ''password_compat'' library for the form authentication. This library is compatible with PHP >= 5.3.7 but some older version include the patch.
+It all depends on the distribution:
+
+* CentOS and RHEL 6.5 are supported.
+* On the other hand, **Debian with PHP 5.3.3 is not**! ([For more information](https://github.com/ircmaxell/password_compat#requirements))
+
+# Getting the appropriate version of FreshRSS
+
+FreshRSS has three different releases or branches. Each branch has its own release frequency. So it is better if you spend some time to understand the purpose of each release.
+
+## Stable release
+
+[Download](https://github.com/FreshRSS/FreshRSS/archive/master.zip)
+
+This release is done when we consider that our goal concerning the new features and the stability is reached. It could happen that we make two releases in a really short time if we have a really good coding pace. In reality, we are all working on our spare time, so we release every few months. But this version is really stable, tested thoroughly and you should not face any major bugs.
+
+## Development release
+
+[Download](https://github.com/FreshRSS/FreshRSS/archive/dev.zip)
+
+As its name suggests, it is the working release for developers. **This release is unstable!** If you want to keep track of enhancements on a daily basis, you can use it. But keep in mind that you need to follow the branch activity on Github (via [the branch RSS feed](https://github.com/FreshRSS/FreshRSS/commits/dev.atom) for instance). Some say that the main developers use it on a daily basis without problem. They may know what they are doing…
+
+# Apache installation
+
+This is an example Apache virtual hosts configuration file. It covers http and https configuration.
+
+```
+<VirtualHost *:80>
+ ServerName example.com
+ DocumentRoot /path/to/FreshRSS
+
+ ErrorLog ${APACHE_LOG_DIR}/freshrss_error.log
+ CustomLog ${APACHE_LOG_DIR}/freshrss_access.log combined
+
+ RewriteEngine on
+ RewriteCond %{SERVER_NAME} = example.com
+ RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
+</VirtualHost>
+
+<IfModule mod_ssl.c>
+<VirtualHost *:443>
+ ServerName example.com
+ DocumentRoot /path/to/FreshRSS
+
+ ErrorLog ${APACHE_LOG_DIR}/freshrss_error.log
+ CustomLog ${APACHE_LOG_DIR}/freshrss_access.log combined
+
+ SSLCertificateFile /path/to/server.crt
+ SSLCertificateKeyFile /path/to/server.key
+
+ # Optional letsencrypt config (uncomment) line below
+ #Include /etc/letsencrypt/options-ssl-apache.conf
+</VirtualHost>
+</IfModule>
+```
+
+# Nginx installation
+
+This is an example nginx configuration file. It covers http, https and php-fpm configuration.
+
+_You can find simpler config file but they may be incompatible with FreshRSS API._
+
+```
+server {
+ listen 80; # http on port 80
+ listen 443 ssl; # https on port 443
+
+ # https configuration
+ ssl on;
+ ssl_certificate /etc/nginx/server.crt;
+ ssl_certificate_key /etc/nginx/server.key;
+
+ # your server's url(s)
+ server_name example.com rss.example.com;
+
+ # the folder p of your FreshRSS installation
+ root /srv/FreshRSS/p/;
+
+ index index.php index.html index.htm;
+
+ # nginx log files
+ access_log /var/log/nginx/rss.access.log;
+ error_log /var/log/nginx/rss.error.log;
+
+ # php files handling
+ # this regex is mandatory because of the API
+ location ~ ^.+?\.php(/.*)?$ {
+ fastcgi_pass unix:/var/run/php5-fpm.sock;
+ fastcgi_split_path_info ^(.+\.php)(/.*)$;
+ # By default, the variable PATH_INFO is not set under PHP-FPM
+ # But FreshRSS API greader.php need it. If you have a "Bad Request" error, double check this var !
+ fastcgi_param PATH_INFO $fastcgi_path_info;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ }
+
+ location / {
+ try_files $uri $uri/ index.php;
+ }
+}
+```
+
+A step-by-step tutorial is available [in french](http://www.pihomeserver.fr/2013/05/08/raspberry-pi-home-server-installer-un-agregateur-de-flux-rss-pour-remplacer-google-reader/).
+
+# Security
+
+**TODO**
diff --git a/docs/en/users/02_First_steps.md b/docs/en/users/02_First_steps.md
new file mode 100644
index 000000000..96ee264a6
--- /dev/null
+++ b/docs/en/users/02_First_steps.md
@@ -0,0 +1,26 @@
+Learning how to handle a new application is not always easy. We build FreshRSS to be intuitive, but you will need some guidance to get your hand on it.
+
+This section guides you to the pages you need as a new comer.
+
+[After you installed the application](01_Installation.md), the first step is to add one or more feeds. You have few options:
+
+1. [Add a feed manually](04_Subscriptions.md#adding-a-feed)
+2. [Import an OPML or JSON file](04_Subscriptions.md#import-and-export)
+3. [Use the bookmarklet](04_Subscriptions.md#use-bookmarklet)
+4. [Firefox integration](04_Subscriptions.md#firefox-subscription-service)
+
+Once you have added your feeds to FreshRSS, it is time to read them. You have access to three reading modes:
+
+1. [The normal view](03_Main_view.md#normal-view) which allows you to display and read quickly new articles
+2. [The global view](03_Main_view.md#global-view) which allows you to see in one glance the status of your feeds
+3. [The reader view](03_Main_view.md#reader-view) which allows you to have a nice reading experience.
+
+Now that you know the basic usages, it is time to configure FreshRSS to improve your reading experience. It has a lot of options, so play with them to find your perfect configuration. However, here is few resources to help you:
+
+* [Organize your feeds in categories](04_Subscriptions.md#feed-management)
+* [Change the home page](05_Configuration.md#changing-the-view)
+* [Choose the reading options](05_Configuration.md#reading-options)
+* [Refresh feeds](03_Main_view.md#refreshing-feeds)
+* [Filter articles](03_Main_view.md#filtering-articles) for a fast access to a selection
+* [Search an article](03_Main_view.md#searching-articles) published some time ago
+* [Access your feeds on a mobile device](06_Mobile_access.md)
diff --git a/docs/en/users/03_Main_view.md b/docs/en/users/03_Main_view.md
new file mode 100644
index 000000000..53b0beaf2
--- /dev/null
+++ b/docs/en/users/03_Main_view.md
@@ -0,0 +1,183 @@
+# Normal view
+
+**TODO**
+
+# Global view
+
+**TODO**
+
+# Reader view
+
+**TODO**
+
+# Refreshing feeds
+
+To use FreshRSS at its full potential, it needs to grab subscribed feeds new articles. To do so, you have several methods available.
+
+## Automatic update
+
+This is the recommended method since you can forget about it once it is configured.
+
+### With the actualize_script.php script
+
+This method is available only if you have access to the installation server scheduled tasks.
+
+The script is named *actualize_script.php* and is located in the *app* folder. The scheduled task syntax will not be explained here. However, here is [a quick introduction to crontab](http://www.adminschoice.com/crontab-quick-reference/) that might help you.
+
+Here is an example to trigger article update every hour.
+
+```cron
+0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1
+```
+
+
+### Online cron
+
+If you do not have access to the installation server scheduled task, you can still automate the update process.
+
+To do so, you need to create a scheduled task, which need to call a specific URL: https://your.server.net/FreshRSS/p/i/?c=feed&a=actualize (it could be different depending on your installation). Depending on your application authentication method, you need to adapt the scheduled task.
+
+#### No authentication
+
+This is the most straightforward since you have a public instance; there is nothing special to configure:
+
+```cron
+0 * * * * curl 'https://your.server.net/FreshRSS/p/i/?c=feed&a=actualize'
+```
+
+### Form or Persona authentication
+
+In those cases, if you configure the application to allow anonymous reading, you can also allow anonymous user to update feeds (“Allow anonymous refresh of the articles”).
+
+![Anonymous access configuration](../img/users/anonymous_access.1.png)
+
+The URL used in the previous section becomes accessible and therefore, you can use the same syntax for the scheduled task.
+
+You can also configure an authentication token to grant a special right on the server.
+
+![Token configuration](../img/users/token.1.png)
+
+The scheduled task syntax to use will be the following:
+
+```cron
+0 * * * * curl 'https://your.server.net/FreshRSS/p/i/?c=feed&a=actualize&token=my-token'
+```
+
+
+### HTTP authentication
+
+In that case, the syntax in the two previous section are unusable. It means that you need to provide your credentials to the scheduled task. **Note that this method is highly discouraged since it means that your credentials will be in plain sight!**
+
+```cron
+0 * * * * curl -u alice:password123 'https://your.server.net/FreshRSS/p/i/?c=feed&a=actualize'
+```
+
+## Manual update
+
+If you cannot or do not want to use the automatic methods, you can make it manually. There is two ways, the partial or the complete update.
+
+### Complete update
+
+This update occurs on all feeds. To trigger it, you need to click on the navigation menu update link.
+
+![Navigation menu](../img/users/refresh.1.png)
+
+When the update starts, a progress bar appears and changes while feeds are processed.
+
+![Progress bar](../img/users/refresh.5.png)
+
+### Partial update
+
+This update occurs on the selected feed only. To trigger it, you need to click on the feed menu update link.
+
+![Feed menu](../img/users/refresh.2.png)
+
+# Filtering articles
+
+While the number of articles stored by FreshRSS increase, it is important to have efficient filters to display only a subset of the articles. There is several methods with different criterion. Most of the time, those methods can be combined.
+
+##By category
+
+It is the easiest method. The only thing to do is clicking on the category title in the side panel. There is two special categories on top of that panel:
+
+ * *Main feed* which displays only articles from feeds marked as available in that category
+ * *Favourites* which displays only articles marked as favourites
+
+##By feed
+
+There is several methods to filter articles by feed:
+
+ * by clicking the feed title in the side panel
+ * by clicking the feed title in the article details
+ * by filtering in the feed options from the side panel
+ * by filtering in the feed configuration
+
+![Feed filter](../img/users/feed.filter.1.png)
+
+##By status
+
+Each article has two attributes, which can be combined. The first attribute indicates if the article was read or not. The second attribute indicates if the article was marked as favorite or not.
+
+With version 0.7, attribute filters are available in the article display dropdown list. With this version, it is not possible to combine those filters. For instance, it is not possible to display only read and favourite articles.
+
+![Attribute filters in 0.7](../img/users/status.filter.0.7.png)
+
+Starting with version 0.8, all attribute filters are visible as toggle icons. They can be combined. As any combination is possible, some have the same result. For instance, the result for all filters selected is the same as no filter selected.
+
+![Attribute filters in 0.8](../img/users/status.filter.0.8.png)
+
+By default, this filter displays only unread articles
+
+##By content
+
+It is possible to filter articles by their content by inputting a string in the search field.
+
+##With the search field
+
+It is possible to use the search field to further refine results:
+
+* by author: `author:name` or `author:'composed name'`
+* by title: `intitle:keyword` or `intitle:'composed keyword'`
+* by URL: `inurl:keyword` or `inurl:'composed keyword'`
+* by tag: `#tag`
+* by free-text: `keyword` or `'composed keyword'`
+* by date of discovery, using the [ISO 8601 time interval format](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals): `date:<date-interval>`
+ * From a specific day, or month, or year:
+ * `date:2014-03-30`
+ * `date:2014-03` or `date:201403`
+ * `date:2014`
+ * From a specific time of a given day:
+ * `date:2014-05-30T13`
+ * `date:2014-05-30T13:30`
+ * Between two given dates:
+ * `date:2014-02/2014-04`
+ * `date:2014-02--2014-04`
+ * `date:2014-02/04`
+ * `date:2014-02-03/05`
+ * `date:2014-02-03T22:00/22:15`
+ * `date:2014-02-03T22:00/15`
+ * After a given date:
+ * `date:2014-03/`
+ * Before a given date:
+ * `date:/2014-03`
+ * For a specific duration after a given date:
+ * `date:2014-03/P1W`
+ * For a specific duration before a given date:
+ * `date:P1W/2014-05-25T23:59:59`
+ * For the past duration before now (the trailing slash is optional):
+ * `date:P1Y/` or `date:P1Y` (past year)
+ * `date:P2M/` (past two months)
+ * `date:P3W/` (past three weeks)
+ * `date:P4D/` (past four days)
+ * `date:PT5H/` (past five hours)
+ * `date:PT30M/` (past thirty minutes)
+ * `date:PT90S/` (past ninety seconds)
+ * `date:P1DT1H/` (past one day and one hour)
+* by date of publication, using the same format: `pubdate:<date-interval>`
+
+Beware that there is no space between the operator and the value.
+
+Some operators can be used negatively, to exclude articles, with the same syntax as above, but prefixed by a `!` or `-`:
+`-author:name`, `-intitle:keyword`, `-inurl:keyword`, `-#tag`, `!keyword`.
+
+It is also possible to combine operators to have a very sharp filter, and it is allowed to have multiple instances of `author:`, `intitle:`, `inurl:`, `#`, and free-text.
diff --git a/docs/en/users/04_Subscriptions.md b/docs/en/users/04_Subscriptions.md
new file mode 100644
index 000000000..0772be4cc
--- /dev/null
+++ b/docs/en/users/04_Subscriptions.md
@@ -0,0 +1,33 @@
+# Adding a feed
+
+**TODO**
+
+# Import and export
+
+**TODO**
+
+# Use bookmarklet
+
+**TODO**
+
+# Feed management
+
+**TODO**
+
+# Firefox subscription service
+
+You can manually add your FreshRSS app to the list of Firefox subscription services which will enable you to subscribe to sites which provide a feed link using the Firefox built-in "Subscribe" button. An in-depth process is described in the [official documentation](https://developer.mozilla.org/en-US/Firefox/Releases/2/Adding_feed_readers_to_Firefox) but you can use the following steps:
+
+ 1. Open about:config in Firefox
+
+ 2. Search for "browser.contentHandlers.types." and note the highest number following the returned strings (ie if yo see browser.contentHandlers.types.1.something up to browser.contentHandlers.types.5.somethingelse etc. the highest number is 5). Your contentHandler will have to have a free number so just pick one higher than currently registered (you would chose six in above example).
+
+ 3. You will have to add three new strings to your about config (replace %NUMBER% with the number from previous step and example.com with your installation address):
+
+ | Preference name | Value | Note |
+ | -------------------------------------------- | ---------------------------------------------------------- | --------------------------------------------------------- |
+ | browser.contentHandlers.types.%NUMBER%.title | **FreshRSS** | Use any name you would like (ie. "My feeds") |
+ | browser.contentHandlers.types.%NUMBER%.type | **application/vnd.mozilla.maybe.feed** | Do not change this value! |
+ | browser.contentHandlers.types.%NUMBER%.uri | **http://EXAMPLE.COM/FreshRss/i?c=feed&a=add&url_rss=%s** | Replace base url with yours and switch to https (if used) |
+
+ 4. Restart Firefox and you can subscribe to sites with the Firefox built-in "Subscribe" button. Just select the name you set under the first Preference name from the dropdown (you can also make it default with the checbox) and you will be redirected to FreshRSS subscription settings (you must be logged in).
diff --git a/docs/en/users/05_Configuration.md b/docs/en/users/05_Configuration.md
new file mode 100644
index 000000000..f8ac56cd7
--- /dev/null
+++ b/docs/en/users/05_Configuration.md
@@ -0,0 +1,121 @@
+
+# Display
+
+## Language
+
+At the moment, FreshRSS is available in French and English. After you confirm your choice, the whole interface will be displayed in the chosen language.
+
+There are parts of FreshRSS that are not translated and are not intended to be translated. For now, the logs visible in the application as well as the one generated by the script of automatic update are part of it.
+
+## Theme
+
+In matters of taste and color, there can be no disputes. This is why FreshRSS offers six official themes:
+
+ * *Blue Lagoon* by **Mister aiR**
+ * *Dark* by **AD**
+ * *Flat design* by **Marien Fressinaud**
+ * *Origine* by **Marien Fressinaud**
+ * *Pafat* by **Plopoyop**
+ * *Screwdriver* by **Mister aiR**
+
+If none of these are suitable for you, it is always possible to create your own.
+
+To select a theme, simply scroll through the themes and select a theme that appears. After confirmation, the theme will be applied to the interface.
+
+## Content width
+
+There are some who prefer short lines of text while others prefer to maximize the available screen space. To satisfy the maximum number of people it is possible to choose the width of the displayed content. There are four settings available:
+
+ * **Fine** which displays content up to 550 pixels
+ * **Medium** which displays content up to 800 pixels
+ * **Large** which displays content up to 1000 pixels
+ * **No limit** which displays the content on 100% of the available space
+
+## Article icons
+
+**TODO**
+
+## HTML5 notification timout
+
+After the automatic updates of the feeds, FreshRSS uses the HTML5 notification API to notify of the arrival of new articles.
+
+The duration of this notification can be set. By default, the value is 0.
+
+# Reading
+
+**TODO**
+
+# Archiving
+
+**TODO**
+
+# Sharing
+
+**TODO**
+
+# Shortcuts
+
+**TODO**
+
+# User queries
+
+**TODO**
+
+# Users
+
+**TODO**
+
+## Authentication methods
+
+### HTTP Authentication (Apache)
+
+ 1. User control is based on the .htaccess file
+ 2. It is best practice to place the .htaccess file in ./i/ subdirecotry so API and other third party services can work.
+ 3. If you want to limit all access to registered users only, place the file in the directory of FreshRSS or in a parent directory. Note that PubsubHubbub and API will not work!
+ 4. Example .htaccess file for a user "marie":
+
+```
+AuthUserFile /home/marie/repertoire/.htpasswd
+AuthGroupFile /dev/null
+AuthName "Chez Marie"
+AuthType Basic
+Require user marie
+```
+
+More information can be found in [Apache documentation](http://httpd.apache.org/docs/trunk/howto/auth.html#gettingitworking).
+
+# Subscription management
+
+## Information
+
+**TODO**
+
+## Archivage
+
+**TODO**
+
+## Login
+
+**TODO**
+
+## Advanced
+
+### Retrieve a truncated stream
+
+The question comes up regularly, so we will try to clarify here how one can retrieve a truncated RSS feed with FreshRSS. Please note that the process is absolutely not "user friendly", but it works :)
+
+Also know that this way you are generating much more traffic to the originating sites and that they can block you accordingly. The performance of FreshRSS is also imapcted because you have to fetch the contents of the articles one by one. So it's a feature to use sparingly!
+
+What is meant by "CSS path of articles on the original site" actually corresponds to the "path" consisting of IDs and classes (which in html, matches the id and class attributes) to retrieve only the interesting part that corresponds to the article. Ideally, this path starts with an id (which is unique to the page).
+
+#### Example 1: Rue89
+
+To find this path, you must go to the address of one of the truncated articles (for example http://www.rue89.com/2013/10/15/prof-maths-jai-atteint-lextase-dihn-pedagogie-inversee-246635). You must then look for the "block" of HTML corresponding to the content of the article (in the source code!).
+
+We find here that the block that encompasses only the content of the article is ```<div class="content clearfix">```. We will only use the ".content" class here. Nevertheless, as said above, it is best to start the path with an id. If we go back to the parent block, this is the block ```<div id="article">``` and that's perfect! The path will be ```#article .content```.
+
+#### Add the corresponding classes to the articles CSS path on the feed configuration page. Examples:
+
+* Rue89: ```#article .content```
+* PCINpact: ```#actu_content```
+* Lesnumériques: ```article#body div.text.clearfix``` \ No newline at end of file
diff --git a/docs/en/users/06_Mobile_access.md b/docs/en/users/06_Mobile_access.md
new file mode 100644
index 000000000..e1a23c8ba
--- /dev/null
+++ b/docs/en/users/06_Mobile_access.md
@@ -0,0 +1 @@
+**TODO**
diff --git a/docs/en/users/07_Frequently_Asked_Questions.md b/docs/en/users/07_Frequently_Asked_Questions.md
new file mode 100644
index 000000000..6391c55f5
--- /dev/null
+++ b/docs/en/users/07_Frequently_Asked_Questions.md
@@ -0,0 +1,35 @@
+We may not have answered all of your questions in the previous sections. The FAQ contains some questions that have not been answered elsewhere.
+
+## What is /i at the end of the application URL?
+
+Of course, ```/i``` has a purpose! We used it for performance and usability:
+
+* it allows to serve icons, images, styles and scripts without cookies. Whitout that trick, those files will be downloaded more often, specially when the form or the Personna authentications are used. Also, HTTP requests will be heavier.
+* ```./p/``` public root can be served without any HTTP access restrictions. Whereas it could be implemented in ```./p/i/```.
+* It spares from having problems while serving public resources like ```favicon.ico```, ```robots.txt```, etc.
+* It allows to display the logo instead of a white page while hitting a restriction or a delay during the loading process.
+
+## Why robots.txt is located in a sub-folder?
+
+To increase security, FreshRSS is hosted in two sections. The first section is public (```./p``` folder) and the second section is private (everything else). Therefore the ```robots.txt``` file is located in ```./p``` sub-folder.
+
+As explained in the [security section](/en/User_documentation/Installation/Security), it is highly recommended to make only the public section available at the domain level. With that configuration, ```./p``` is the root folder for http://demo.freshrss.org/, thus making ```robots.txt``` available at the root of the application.
+
+The same rule applies for ```favicon.ico``` and ```.htaccess```.
+
+## Why do I have errors while registering a feed?
+
+There can be different origins for that problem.
+The feed syntax can be invalid, it can be unrecognized by the SimplePie library. the hosting server can be the root of the problem, FreshRSS can be buggy.
+The first step is to identify what causes the problem.
+Here are the steps to follow:
+
+1. __Verify if the feed syntax is valid__ with the [W3C on-line tool](http://validator.w3.org/feed/ "RSS and Atom feed validator"). If it is not valid, there is nothing we can do.
+1. __Verify SimplePie validation__ with the [SimplePie on-line tool](http://simplepie.org/demo/ "SimplePie official demo"). If it is not recognized, there is nothing we can do.
+1. __Verify FreshRSS integration__ with the [demo](http://demo.freshrss.org "FreshRSS official demo"). If it is not working, you need to [create an issue on Github](https://github.com/FreshRSS/FreshRSS/issues/new "Create an issue for FreshRSS") so we can have a look at it. If it is working, there is probably something fishy with the hosting server.
+
+Here is a list of feed which don't work:
+
+* http://foulab.org/fr/rss/Foulab_News: is not a W3C valid feed (November 2014)
+* http://eu.battle.net/hearthstone/fr/feed/news: is not a W3C valid feed (Novembre 2014)
+* http://webseriesmag.blogs.liberation.fr/we/atom.xml: is not working for the user but succeed on all the described validations (November 2014) \ No newline at end of file