├── .gitignore ├── content ├── _index.md ├── admin │ ├── _index.md │ ├── asynchronous.md │ ├── backup.md │ ├── common_errors.md │ ├── console_commands.md │ ├── custom_css.md │ ├── installation │ │ ├── _index.md │ │ ├── installation.md │ │ ├── requirements.md │ │ ├── rightaccess.md │ │ └── virtualhosts.md │ ├── internal_settings.md │ ├── mailer.md │ ├── parameters.md │ └── upgrade │ │ ├── _index.md │ │ ├── query-upgrade-21-22.md │ │ ├── query-upgrade-22-23.md │ │ ├── query-upgrade-23-24.md │ │ └── query-upgrade-25-26.md ├── apps │ ├── _index.md │ ├── android.md │ └── ios.md ├── developer │ ├── _index.md │ ├── api │ │ ├── _index.md │ │ ├── methods.md │ │ ├── oauth.md │ │ └── resources.md │ ├── back-end.md │ ├── docker.md │ ├── documentation.md │ ├── front_end.md │ ├── paywall.md │ ├── testsuite.md │ └── translate.md └── user │ ├── _index.md │ ├── articles │ ├── _index.md │ ├── annotations.md │ ├── download.md │ ├── restricted.md │ ├── save.md │ └── share.md │ ├── configuration │ ├── _index.md │ ├── password.md │ ├── rss.md │ ├── settings.md │ ├── tagging_rules.md │ └── user_information.md │ ├── create_account.md │ ├── errors_during_fetching.md │ ├── faq.md │ ├── filters.md │ ├── import │ ├── Elcurator.md │ ├── Instapaper.md │ ├── Pinboard.md │ ├── Pocket.md │ ├── Readability.md │ ├── _index.md │ ├── wallabagv1.md │ └── wallabagv2.md │ ├── interface.md │ └── tags.md ├── go.mod ├── go.sum ├── hugo.yaml ├── netlify.toml ├── package.json ├── public └── _redirects └── static └── img ├── admin └── id_piwik.png ├── user ├── 2FA_form.png ├── activated_account.png ├── android_configuration_connection_test.de.png ├── android_configuration_connection_test.en.png ├── android_configuration_connection_test_success.de.png ├── android_configuration_connection_test_success.en.png ├── android_configuration_feed_credentials_automatically_filled_in.de.png ├── android_configuration_feed_credentials_automatically_filled_in.en.png ├── android_configuration_filled_in.de.png ├── android_configuration_filled_in.en.png ├── android_configuration_get_feed_credentials.de.png ├── android_configuration_get_feed_credentials.en.png ├── android_configuration_saved_feed_update.de.png ├── android_configuration_saved_feed_update.en.png ├── android_configuration_screen.de.png ├── android_configuration_screen.en.png ├── android_configuration_scroll_bottom.de.png ├── android_configuration_scroll_bottom.en.png ├── android_unread_feed_synced.de.png ├── android_unread_feed_synced.en.png ├── android_welcome_screen.de.png ├── android_welcome_screen.en.png ├── annotations_1.png ├── annotations_2.png ├── annotations_3.png ├── browser_api_management.en.png ├── browser_client_description.en.png ├── browser_client_secret.en.png ├── download_article.png ├── download_articles.png ├── export_v1.png ├── export_v2.png ├── export_wllbg_1.png ├── export_wllbg_2.png ├── filters.png ├── import_wallabagv1.png ├── import_wllbg.png ├── ios_client_secret.en.png ├── ios_credentials.en.png ├── ios_main_app.en.png ├── ios_wallabag_address.en.png ├── ios_welcome.en.png ├── login_form.png ├── paywall_auth.png ├── refetch.png ├── registration_form.png ├── rename-tags.gif ├── sent_email.png ├── share.png ├── topbar.png ├── wallabag_config_2fa_otp.png ├── wallabag_configuration.png ├── wallabag_interface_account_menu.png ├── wallabag_interface_filter.png ├── wallabag_interface_homepage.png ├── wallabag_interface_toolbar.png └── wallabagger │ ├── opt-checklist.png │ ├── opt-client.png │ ├── opt-clientfields.png │ ├── opt-ext-optlink.png │ ├── opt-granted.png │ ├── opt-menu.png │ ├── opt-spaceintags.png │ ├── opt-url.png │ ├── use-article.png │ ├── use-articletags.png │ ├── use-deletedialog.png │ ├── use-deleteicon.png │ ├── use-domain.png │ ├── use-editicon.png │ ├── use-edittitle.png │ ├── use-error.png │ ├── use-flagsicons.png │ ├── use-flagsset.png │ ├── use-foundtag.png │ ├── use-icon.png │ ├── use-icons.png │ ├── use-saving.png │ ├── use-tagsarea.png │ └── use-title.png └── wallabag.png /.gitignore: -------------------------------------------------------------------------------- 1 | /public/* 2 | !/public/_redirects 3 | -------------------------------------------------------------------------------- /content/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: wallabag documentation 3 | cascade: 4 | type: docs 5 | --- 6 | 7 | ![wallabag logo](/img/wallabag.png) 8 | 9 | [**wallabag**](https://wallabag.org/) is a read-it-later application: it saves a web page by keeping content only. Elements like navigation or ads are deleted. 10 | 11 | The main documentation for this application is organized into multiple sections: 12 | 13 | {{< cards >}} 14 | {{< card link="user" title="User" icon="user" >}} 15 | {{< card link="apps" title="Apps" icon="device-mobile" >}} 16 | {{< card link="admin" title="Administration" icon="server" >}} 17 | {{< card link="developer" title="Development" icon="terminal" >}} 18 | {{< /cards >}} 19 | -------------------------------------------------------------------------------- /content/admin/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Administrator 3 | weight: 3 4 | --- 5 | 6 | This section is for those who manage wallabag instances. 7 | 8 | You'll find below the main topics for administration. 9 | Use the left menu for the other topics. 10 | 11 | {{< cards >}} 12 | {{< card link="installation" title="Installation" icon="server" >}} 13 | {{< card link="parameters" title="Parameters" icon="cog" >}} 14 | {{< card link="backup" title="Backup" icon="save" >}} 15 | {{< card link="upgrade" title="Upgrade" icon="refresh" >}} 16 | {{< /cards >}} 17 | -------------------------------------------------------------------------------- /content/admin/asynchronous.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Asynchronous 3 | weight: 6 4 | --- 5 | 6 | To launch asynchronous tasks (useful for large imports), we can use RabbitMQ or Redis. 7 | 8 | ## Install RabbitMQ for asynchronous tasks 9 | 10 | ### Requirements 11 | 12 | You need to have RabbitMQ installed on your server. 13 | 14 | ### Installation 15 | 16 | ``` 17 | wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc 18 | apt-key add rabbitmq-signing-key-public.asc 19 | apt-get update 20 | apt-get install rabbitmq-server 21 | ``` 22 | 23 | ### Configuration and launch 24 | 25 | ``` 26 | rabbitmq-plugins enable rabbitmq_management # (useful to have a web interface, available at http://localhost:15672/ (guest/guest) 27 | rabbitmq-server -detached 28 | ``` 29 | 30 | ### Stop RabbitMQ 31 | 32 | ``` 33 | rabbitmqctl stop 34 | ``` 35 | 36 | ### Configure RabbitMQ in wallabag 37 | 38 | Edit your `app/config/parameters.yml` file to edit RabbitMQ 39 | configuration. The default one should be ok: 40 | 41 | ``` 42 | rabbitmq_host: localhost 43 | rabbitmq_port: 5672 44 | rabbitmq_user: guest 45 | rabbitmq_password: guest 46 | rabbitmq_prefetch_count: 10 # read http://www.rabbitmq.com/consumer-prefetch.html 47 | ``` 48 | 49 | ### Enable RabbitMQ in wallabag 50 | 51 | In internal settings, in the **Import** section, enable RabbitMQ (with 52 | the value 1). 53 | 54 | ### Launch RabbitMQ consumer 55 | 56 | Depending on which service you want to import from you need to enable 57 | one (or many if you want to support many) cron job: 58 | 59 | ``` 60 | # for Pocket import 61 | bin/console rabbitmq:consumer --env=prod import_pocket -w 62 | 63 | # for Readability import 64 | bin/console rabbitmq:consumer --env=prod import_readability -w 65 | 66 | # for Instapaper import 67 | bin/console rabbitmq:consumer --env=prod import_instapaper -w 68 | 69 | # for wallabag v1 import 70 | bin/console rabbitmq:consumer --env=prod import_wallabag_v1 -w 71 | 72 | # for wallabag v2 import 73 | bin/console rabbitmq:consumer --env=prod import_wallabag_v2 -w 74 | 75 | # for Firefox import 76 | bin/console rabbitmq:consumer --env=prod import_firefox -w 77 | 78 | # for Chrome import 79 | bin/console rabbitmq:consumer --env=prod import_chrome -w 80 | ``` 81 | 82 | Install Redis for asynchronous tasks 83 | ------------------------------------ 84 | 85 | In order to launch asynchronous tasks (useful for huge imports for 86 | example), we can use Redis. 87 | 88 | ### Requirements 89 | 90 | You need to have Redis installed on your server. 91 | 92 | ### Installation 93 | 94 | ``` 95 | apt-get install redis-server 96 | ``` 97 | 98 | ### Launch 99 | 100 | The server might be already running after installing, if not you can 101 | launch it using: 102 | 103 | ``` 104 | redis-server 105 | ``` 106 | 107 | ### Configure Redis in wallabag 108 | 109 | Edit your `app/config/parameters.yml` file to edit Redis configuration. 110 | The default one should be ok: 111 | 112 | ``` 113 | redis_host: localhost 114 | redis_port: 6379 115 | ``` 116 | 117 | ### Enable Redis in wallabag 118 | 119 | In internal settings, in the **Import** section, enable Redis (with the 120 | value 1). 121 | 122 | ### Launch Redis consumer 123 | 124 | Depending on which service you want to import from you need to enable 125 | one (or many if you want to support many) cron job: 126 | 127 | ``` 128 | # for Pocket import 129 | bin/console wallabag:import:redis-worker --env=prod pocket -vv >> /path/to/wallabag/var/logs/redis-pocket.log 130 | 131 | # for Readability import 132 | bin/console wallabag:import:redis-worker --env=prod readability -vv >> /path/to/wallabag/var/logs/redis-readability.log 133 | 134 | # for Instapaper import 135 | bin/console wallabag:import:redis-worker --env=prod instapaper -vv >> /path/to/wallabag/var/logs/redis-instapaper.log 136 | 137 | # for wallabag v1 import 138 | bin/console wallabag:import:redis-worker --env=prod wallabag_v1 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v1.log 139 | 140 | # for wallabag v2 import 141 | bin/console wallabag:import:redis-worker --env=prod wallabag_v2 -vv >> /path/to/wallabag/var/logs/redis-wallabag_v2.log 142 | 143 | # for Firefox import 144 | bin/console wallabag:import:redis-worker --env=prod firefox -vv >> /path/to/wallabag/var/logs/redis-firefox.log 145 | 146 | # for Chrome import 147 | bin/console wallabag:import:redis-worker --env=prod chrome -vv >> /path/to/wallabag/var/logs/redis-chrome.log 148 | ``` 149 | 150 | If you want to launch the import only for some messages and not all, you 151 | can specify this number (here 12) and the worker will stop right after 152 | the 12th message : 153 | 154 | ``` 155 | bin/console wallabag:import:redis-worker --env=prod pocket -vv --maxIterations=12 156 | ``` 157 | -------------------------------------------------------------------------------- /content/admin/backup.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Backup 3 | weight: 4 4 | --- 5 | 6 | If you make a mistake with your wallabag and lose data, 7 | or you need to move your wallabag to another server, you'll want to 8 | backup your data. This article describes what you need to backup. 9 | 10 | ## Basic settings 11 | 12 | wallabag stores some basic parameters (like SMTP server or database 13 | backend) in the file app/config/parameters.yml. 14 | 15 | ## Database 16 | 17 | As wallabag supports different kinds of databases, the way to perform the 18 | backup depends on the database you use, so you need to refer to the 19 | vendor documentation. 20 | 21 | Here's some examples: 22 | 23 | - MySQL: 24 | - PostgreSQL: 25 | 26 | 27 | ### SQLite 28 | 29 | To backup the SQLite database, you just need to copy the directory 30 | data/db from the wallabag application directory. 31 | 32 | ## Pictures 33 | 34 | The pictures retrieved by wallabag are stored under `web/assets/images`. 35 | -------------------------------------------------------------------------------- /content/admin/common_errors.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Common errors 3 | weight: 2 4 | --- 5 | 6 | Here is a list of common errors that we have seen in GitHub's issues. 7 | 8 | ## Migration script assumes quote table names are enabled for MySQL 9 | 10 | If during migration you experience problems with MySQL with an error like this: 11 | 12 | > SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"wallabag_entry" ADD uuid LONGTEXT DEFAULT NULL' at line 1 13 | 14 | This means you should enable the `ANSI_QUOTES` of `SQL_MODE`. 15 | 16 | You can do that in your `app/config/config.yml` file: 17 | 18 | ```yaml 19 | # Doctrine Configuration 20 | doctrine: 21 | dbal: 22 | # ... 23 | options: 24 | # PDO::MYSQL_ATTR_INIT_COMMAND 25 | 1002: "SET SQL_MODE=ANSI_QUOTES" 26 | ``` 27 | 28 | [Related issue](https://github.com/wallabag/wallabag/issues/3036) 29 | 30 | ## "Incorrect string value" with MySQL 31 | 32 | If when adding an article you got a MySQL error like: 33 | 34 | > SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x98\x89}}). 48 | 49 | [Related issue](https://github.com/wallabag/wallabag/issues/2976) 50 | -------------------------------------------------------------------------------- /content/admin/console_commands.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Console Commands 3 | weight: 5 4 | --- 5 | 6 | wallabag has a number of CLI commands to manage various tasks. You 7 | can list all the commands by executing `bin/console` in the wallabag 8 | folder. 9 | 10 | Each command has help accessible through `bin/console help %command%`. 11 | 12 | > If you're in a production environment, remember to add `--env=prod` to each 13 | command. 14 | 15 | Notable commands 16 | ---------------- 17 | 18 | From Symfony: 19 | 20 | - `assets:install`: May be helpful if assets are missing. 21 | - `cache:clear`: Should be run after each update (included in make update). 22 | - `doctrine:migrations:status`: Outputs the status of your database migrations. 23 | - `fos:user:activate`: Manually activates a user. 24 | - `fos:user:change-password`: Changes a password for a user. 25 | - `fos:user:create`: Creates a user. 26 | - `fos:user:deactivate`: Deactivates a user (not deleted). 27 | - `fos:user:demote`: Removes a role from a user, typically admin rights. 28 | - `fos:user:promote`: Adds a role to a user, typically admin rights. 29 | - `rabbitmq:*`: May be useful if you're using RabbitMQ. 30 | 31 | Custom to wallabag: 32 | 33 | - `wallabag:clean-downloaded-images`: Cleans downloaded images which are no longer associated with an entry. 34 | - `wallabag:clean-duplicates`: Removes all entry duplicates for one user or all users. 35 | - `wallabag:entry:reload`: Reloads entries. 36 | - `wallabag:export`: Exports all entries for a user. You can choose the output path of the file. 37 | - `wallabag:generate-hashed-urls`: Generates hashed URLs for each entry. 38 | - `wallabag:import`: Imports entries in different formats to a user account. 39 | - `wallabag:import:redis-worker`: Useful if you use Redis. 40 | - `wallabag:install`: (re)Installs wallabag. 41 | - `wallabag:tag:all`: Tags all entries for a user using their tagging rules. 42 | - `wallabag:user:show`: Shows the details for a user. 43 | - `wallabag:user:list`: Lists all existing users. 44 | 45 | wallabag:clean-downloaded-images 46 | ------------------------- 47 | 48 | This command cleans downloaded images which are no more associated to an entry. This is useful if you enabled "Download images locally" before 2.4.0 because there were a bug in removing images from an entry when you removed that entry. 49 | 50 | Usage: 51 | 52 | ``` 53 | wallabag:clean-downloaded-images 54 | ``` 55 | 56 | Options: 57 | - `--dry-run`: Don't remove images, just dump number of images which might be removed 58 | 59 | 60 | wallabag:clean-duplicates 61 | ------------------------- 62 | 63 | This command helps you clean your articles list in case of duplicates. 64 | 65 | Usage: 66 | 67 | ``` 68 | wallabag:clean-duplicates [] 69 | ``` 70 | 71 | Arguments: 72 | 73 | - username: User to clean 74 | 75 | 76 | wallabag:entry:reload 77 | --------------------- 78 | 79 | This command reloads entries. 80 | 81 | Usage: 82 | 83 | ``` 84 | wallabag:entry:reload [] 85 | ``` 86 | 87 | Arguments: 88 | - username: Reload entries only for the given user. 89 | 90 | 91 | wallabag:export 92 | --------------- 93 | 94 | This command helps you export all entries for a user. 95 | 96 | Usage: 97 | 98 | ``` 99 | wallabag:export [] 100 | ``` 101 | 102 | Arguments: 103 | 104 | - username: User from which to export entries 105 | - filepath: Path of the exported file 106 | 107 | 108 | wallabag:generate-hashed-urls 109 | --------------- 110 | 111 | This command helps you generate hashes of the URL of each entry to check through the API if a URL is already saved. Only available since 2.4.0. 112 | 113 | Usage: 114 | 115 | ``` 116 | wallabag:generate-hashed-urls 117 | ``` 118 | 119 | Arguments: 120 | 121 | - username: User to process entries 122 | 123 | 124 | wallabag:import 125 | --------------- 126 | 127 | This command helps you import entries from a JSON export. 128 | 129 | Usage: 130 | 131 | ``` 132 | wallabag:import [--] 133 | ``` 134 | 135 | Arguments: 136 | 137 | - username: User to populate 138 | - filepath: Path to the JSON file 139 | 140 | Options: 141 | 142 | - `--importer=IMPORTER`: The importer to use: v1, v2, instapaper, pinboard, readability, firefox or chrome [default: "v1"] 143 | - `--markAsRead=MARKASREAD`: Mark all entries as read [default: false] 144 | - `--useUserId`: Use user id instead of username to find account 145 | - `--disableContentUpdate`: Disable fetching updated content from URL 146 | 147 | 148 | wallabag:import:redis-worker 149 | ---------------------------- 150 | 151 | This command helps you launch Redis worker. 152 | 153 | Usage: 154 | 155 | ``` 156 | wallabag:import:redis-worker [--] 157 | ``` 158 | 159 | Arguments: 160 | 161 | - serviceName: Service to use: wallabag_v1, wallabag_v2, pocket, readability, pinboard, firefox, chrome or instapaper 162 | 163 | Options: 164 | 165 | - `--maxIterations[=MAXITERATIONS]`: Number of iterations before stopping [default: false] 166 | 167 | 168 | wallabag:install 169 | ---------------- 170 | 171 | This command helps you install or re-install wallabag. 172 | 173 | Usage: 174 | 175 | ``` 176 | wallabag:install 177 | ``` 178 | 179 | 180 | wallabag:tag:all 181 | ---------------- 182 | 183 | This command helps you tag all entries using tagging rules. 184 | 185 | Usage: 186 | 187 | ``` 188 | wallabag:tag:all 189 | ``` 190 | 191 | Arguments: 192 | - username: User to tag entries for. 193 | 194 | 195 | wallabag:user:show 196 | ------------------ 197 | 198 | This command shows the details for a user. 199 | 200 | Usage: 201 | 202 | ``` 203 | wallabag:user:show 204 | ``` 205 | 206 | Arguments: 207 | - username: User to show details for. 208 | 209 | 210 | wallabag:user:list 211 | ------------------ 212 | 213 | This command lists all existing users. 214 | 215 | Usage: 216 | 217 | ``` 218 | wallabag:user:list [] 219 | ``` 220 | 221 | Arguments: 222 | - search: Filter the list with the given search term. The search is done on users' username, name, and email 223 | 224 | Options: 225 | - `--limit=LIMIT`: Max number of users displayed in the list 226 | -------------------------------------------------------------------------------- /content/admin/custom_css.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Custom CSS 3 | weight: 3 4 | --- 5 | 6 | {{< callout type="info" >}} 7 | Available since version 2.4.0. 8 | {{< /callout >}} 9 | 10 | You can apply custom styles to your wallabag instance. 11 | 12 | 1. Create a file named `custom.css` in the `web/` directory 13 | 2. Put any CSS you want inside. It'll be automatically loaded on each wallabag page 14 | 15 | This option is instance-wide and can't be adjusted per user. 16 | -------------------------------------------------------------------------------- /content/admin/installation/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Installation 3 | weight: 1 4 | --- 5 | 6 | - [Requirements]({{< relref "requirements.md" >}}) 7 | - [Installation]({{< relref "installation.html" >}}) 8 | - [Virtual Hosts]({{< relref "virtualhosts.html" >}}) 9 | - [Right Access]({{< relref "rightaccess.html" >}}) 10 | 11 | (Here should be added a few warnings on shared hosting for instance) 12 | -------------------------------------------------------------------------------- /content/admin/installation/installation.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Installation 3 | weight: 2 4 | --- 5 | 6 | ## On a dedicated web server (recommended way) 7 | 8 | To install wallabag itself, you must run the following commands: 9 | 10 | ```bash 11 | git clone https://github.com/wallabag/wallabag.git 12 | cd wallabag && make install 13 | ``` 14 | 15 | If it's your first installation, you can safely answer "yes" when asking to reset the database. 16 | 17 | Now, read the next step to create your virtual host, then 18 | access your wallabag. 19 | 20 | {{< callout type="info" >}} 21 | To define parameters with environment variables, you have to set these variables with `SYMFONY__` prefix, for example, `SYMFONY__DATABASE_DRIVER`. 22 | You can have a look at [Symfony documentation](http://symfony.com/doc/current/cookbook/configuration/external_parameters.html). 23 | {{< /callout >}} 24 | 25 | {{< callout type="info" >}} 26 | If you want to use SQLite to store your data, please put `%kernel.root_dir%/../data/db/wallabag.sqlite` for the `database_path` parameter during installation. 27 | {{< /callout >}} 28 | 29 | {{< callout type="info" >}} 30 | If you're installing wallabag behind Squid as a reverse proxy, make sure to update your `squid.conf` configuration to include `login=PASS` in the `cache_peer` line. This is necessary for API calls to work properly. 31 | {{< /callout >}} 32 | 33 | ## On shared hosting 34 | 35 | We provide a package with all dependencies inside. The default 36 | configuration uses MySQL for the database. To add the setting for your database, please edit `app/config/parameters.yml`. Beware that passwords must be surrounded by single quotes ('). 37 | 38 | We have already created a user: the login and password are `wallabag`. 39 | 40 | With this package, wallabag doesn't check for mandatory extensions used 41 | in the application (these checks are made during `composer install` 42 | when you have a dedicated web server, see above). 43 | 44 | Execute this command to download and extract the latest package: 45 | 46 | ```bash 47 | wget https://wllbg.org/latest-v2-package && tar xvf latest-v2-package 48 | ``` 49 | 50 | You will find the [md5 hash of the latest package on our website](https://wallabag.org/en#download). 51 | 52 | The static package requires each command to be appended by `--env=prod` as the static package is only usable as a prod environment (dev environment is not supported and won't work at all). 53 | 54 | Now, read the next step to create your virtual host. 55 | 56 | You must create your first user by using the command `php bin/console wallabag:install --env=prod` 57 | If an error occurs at this step due to bad settings, you must clear the cache with `php bin/console cache:clear --env=prod` before you try again the previous command. 58 | 59 | Then you can access your wallabag. 60 | 61 | ## Usage of wallabag.it 62 | 63 | [wallabag.it](https://wallabag.it) is a paid service to use wallabag without installing it on a web server. 64 | 65 | This service always ships the latest release of wallabag. [You can create your account here](https://app.wallabag.it/). Try it for free: you'll get a 14-day free trial with no limitation (no credit card information required). 66 | 67 | ## Installation with Docker 68 | 69 | We provide you a Docker image to install wallabag easily. Have a look at 70 | our repository on [Docker Hub](https://hub.docker.com/r/wallabag/wallabag/) for more information. 71 | 72 | ### Command to launch container 73 | 74 | ```bash 75 | docker pull wallabag/wallabag 76 | ``` 77 | 78 | ## Installation on Cloudron 79 | 80 | Cloudron provides an easy way to install webapps on your server with a 81 | focus on sysadmin automation and keeping apps updated. wallabag is 82 | packaged as a Cloudron app and available to install directly from the 83 | store. 84 | 85 | [Install wallabag on your Cloudron](https://cloudron.io/store/org.wallabag.cloudronapp2.html) 86 | 87 | ## Installation on YunoHost 88 | 89 | YunoHost provides an easy way to install webapps on your server with a 90 | focus on sysadmin automation and keeping apps updated. wallabag is 91 | packaged as an official YunoHost app and is available to install directly from the 92 | official repository. 93 | 94 | [![Install wallabag with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=wallabag2) 95 | 96 | ## Installation on alwaysdata 97 | 98 | alwaysdata's Marketplace allows to easily install wallabag (and many other 99 | applications) on a Public or Private Cloud. 100 | 101 | [Install wallabag on alwaysdata](https://www.alwaysdata.com/en/marketplace/wallabag/) 102 | 103 | ## Installation on Synology 104 | 105 | The SynoCommunity provides a package to install wallabag on your Synology NAS. 106 | 107 | [Install wallabag with Synology](https://synocommunity.com/package/wallabag) 108 | -------------------------------------------------------------------------------- /content/admin/installation/requirements.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Requirements 3 | weight: 1 4 | --- 5 | 6 | wallabag is compatible with **PHP >= 7.4**. 7 | 8 | {{< callout type="info" >}} 9 | To install wallabag easily, we provide a `Makefile`, so you need to have the `make` tool. 10 | {{< /callout >}} 11 | 12 | ## Composer 13 | 14 | wallabag uses a large number of PHP libraries. 15 | These libraries must be installed with a tool called **Composer**. 16 | 17 | Check that the installed version is at least 1.8.0: 18 | 19 | composer --version 20 | 21 | If not, try to upgrade it using 22 | 23 | composer selfupdate 24 | 25 | If that command isn't recognized, please [re-install it](https://getcomposer.org/doc/00-intro.md). 26 | 27 | ## PHP Extensions 28 | 29 | You'll also need the following extensions. Some of these may already be activated, so you may not have to install all corresponding packages. 30 | 31 | - php-session 32 | - php-ctype 33 | - php-dom 34 | - php-hash 35 | - php-simplexml 36 | - php-json 37 | - php-gd 38 | - php-mbstring 39 | - php-xml 40 | - php-tidy 41 | - php-iconv 42 | - php-curl 43 | - php-gettext 44 | - php-tokenizer 45 | - php-bcmath 46 | - php-intl 47 | - php-fpm 48 | 49 | wallabag uses PDO to connect to the database, so you'll need one of the following: 50 | 51 | - pdo_mysql 52 | - pdo_pgsql 53 | - pdo_sqlite 54 | 55 | and its corresponding database server. 56 | -------------------------------------------------------------------------------- /content/admin/installation/rightaccess.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Right Access 3 | weight: 4 4 | --- 5 | 6 | ### Test environment 7 | 8 | When we just want to test wallabag, we just run the command `make run` 9 | to start our wallabag instance and everything will go smoothly because 10 | the user who started the project can access the current folder 11 | naturally, without any problem. 12 | 13 | ### Production environment 14 | 15 | As soon as we use Apache or Nginx to access our wallabag instance, 16 | and not the command `make run` to start it, we should take care to 17 | grant the correct rights on the correct folders to keep all the folders 18 | of the project safe. 19 | 20 | To do so, the folder name, known as `DocumentRoot` (for Apache) or 21 | `root` (for Nginx), has to be absolutely accessible by the Apache/Nginx 22 | user. Its name is generally `www-data`, `apache`, or `nobody` (depending 23 | on the Linux system used). 24 | 25 | So the folder `/var/www/wallabag/web` has to be accessible by this last 26 | one. But this may not be enough if we just care about this folder, 27 | because we could meet a blank page or get an error 500 when trying to 28 | access the homepage of the project. 29 | 30 | This is due to the fact that we will need to grant the same rights 31 | access on the folder `/var/www/wallabag/var` like those we gave on the 32 | folder `/var/www/wallabag/web`. Thus, we fix this problem with the 33 | following command: 34 | 35 | ```bash 36 | chown -R www-data:www-data /var/www/wallabag/var 37 | ``` 38 | 39 | It has to be the same for the following folders 40 | 41 | - /var/www/wallabag/bin/ 42 | - /var/www/wallabag/app/config/ 43 | - /var/www/wallabag/vendor/ 44 | - /var/www/wallabag/data/ 45 | - /var/www/wallabag/web/ 46 | 47 | by entering 48 | 49 | ```bash 50 | chown -R www-data:www-data /var/www/wallabag/bin 51 | chown -R www-data:www-data /var/www/wallabag/app/config 52 | chown -R www-data:www-data /var/www/wallabag/vendor 53 | chown -R www-data:www-data /var/www/wallabag/data/ 54 | chown -R www-data:www-data /var/www/wallabag/web/ 55 | ``` 56 | 57 | otherwise, sooner or later you will see these error messages: 58 | 59 | ``` 60 | Unable to write to the "bin" directory. 61 | file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied 62 | file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied 63 | ``` 64 | 65 | ### Additional rules for SELinux 66 | 67 | If SELinux is enabled on your system, you will need to configure 68 | additional contexts in order for wallabag to function properly. To check 69 | if SELinux is enabled, simply enter the following: 70 | 71 | `getenforce` 72 | 73 | This will return `Enforcing` if SELinux is enabled. Creating a new 74 | context involves the following syntax: 75 | 76 | `semanage fcontext -a -t ` 77 | 78 | For example: 79 | 80 | `semanage fcontext -a -t httpd_sys_content_t "/var/www/wallabag(/.*)?"` 81 | 82 | This will recursively apply the httpd_sys_content_t context to the 83 | wallabag directory and all underlying files and folders. The following 84 | rules are needed: 85 | 86 | | Full path | Context | 87 | | ------------- | ------------- | 88 | | /var/www/wallabag(/.\*)? | `httpd_sys_content_t` | 89 | | /var/www/wallabag/data(/.\*)? | `httpd_sys_rw_content_t` | 90 | | /var/www/wallabag/var/logs(/.\*)? | `httpd_log_t` | 91 | | /var/www/wallabag/var/cache(/.\*)? | `httpd_cache_t` | 92 | 93 | After creating these contexts, enter the following in order to apply 94 | your rules: 95 | 96 | `restorecon -R -v /var/www/wallabag` 97 | 98 | You can check contexts in a directory by typing `ls -lZ` and you can see 99 | all of your current rules with `semanage fcontext -l -C`. 100 | 101 | If you're installing the preconfigured latest-v2-package, then an 102 | additional rule is needed during the initial setup: 103 | 104 | `semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wallabag/var"` 105 | 106 | After you successfully access your wallabag and complete the initial 107 | setup, this context can be removed: 108 | 109 | ```bash 110 | semanage fcontext -d -t httpd_sys_rw_content_t "/var/www/wallabag/var" 111 | retorecon -R -v /var/www/wallabag/var 112 | ``` 113 | -------------------------------------------------------------------------------- /content/admin/installation/virtualhosts.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Virtual hosts 3 | weight: 3 4 | --- 5 | 6 | {{< callout type="info" >}} 7 | We assume that wallabag was installed in the `/var/www/wallabag` folder. 8 | {{< /callout >}} 9 | 10 | {{< callout type="warning" >}} 11 | The following configurations are given as examples, assuming that wallabag will be directly accessed at the root of `domain.tld` (or a `wallabag.domain.tld` subdomain). 12 | Installation in folders can work, but is not supported by the maintainers. 13 | {{< /callout >}} 14 | 15 | ## Configuration on Apache 16 | 17 | ### Using Apache and mod_php 18 | 19 | ```apache 20 | 21 | ServerName domain.tld 22 | ServerAlias www.domain.tld 23 | 24 | DocumentRoot /var/www/wallabag/web 25 | 26 | AllowOverride None 27 | Order Allow,Deny 28 | Allow from All 29 | 30 | 31 | Options +SymLinksIfOwnerMatch 32 | Options -MultiViews 33 | RewriteEngine On 34 | RewriteCond %{REQUEST_FILENAME} !-f 35 | RewriteRule ^(.*)$ app.php [QSA,L] 36 | 37 | 38 | 39 | # If you don't want this caching strategy for your assets 40 | # you have to comment the two following blocks 41 | 42 | ExpiresActive On 43 | ExpiresByType application/javascript A259200 44 | ExpiresByType image/avif "access plus 2592000 seconds" 45 | ExpiresByType image/gif "access plus 2592000 seconds" 46 | ExpiresByType image/jpg "access plus 2592000 seconds" 47 | ExpiresByType image/jpeg "access plus 2592000 seconds" 48 | ExpiresByType image/png "access plus 2592000 seconds" 49 | ExpiresByType image/webp "access plus 2592000 seconds" 50 | ExpiresByType text/css "access plus 2592000 seconds" 51 | 52 | 53 | 54 | 55 | Header set Cache-Control "max-age=2592000, public" 56 | 57 | 58 | Header set Cache-Control "max-age=2592000, public, immutable" 59 | 60 | 61 | Header set Cache-Control "max-age=2592000, private" 62 | 63 | 64 | 65 | # uncomment the following lines if you install assets as symlinks 66 | # or run into problems when compiling LESS/Sass/CoffeScript assets 67 | # 68 | # Options FollowSymlinks 69 | # 70 | 71 | # optionally disable the RewriteEngine for the asset directories 72 | # which will allow apache to simply reply with a 404 when files are 73 | # not found instead of passing the request into the full symfony stack 74 | 75 | 76 | RewriteEngine Off 77 | 78 | 79 | ErrorLog /var/log/apache2/wallabag_error.log 80 | CustomLog /var/log/apache2/wallabag_access.log combined 81 | 82 | ``` 83 | 84 | {{< callout type="warning" >}} 85 | Do not forget to activate the *rewrite* mod of Apache: 86 | `a2enmod rewrite && systemctl reload apache2` 87 | {{< /callout >}} 88 | 89 | Note for Apache 2.4, in the section ``, you have to replace the directives: 90 | 91 | ```apache 92 | AllowOverride None 93 | Order Allow,Deny 94 | Allow from All 95 | ``` 96 | 97 | by 98 | 99 | ```apache 100 | Require all granted 101 | ``` 102 | 103 | After reloading or restarting Apache, you should now be able to access wallabag at . 104 | 105 | ### Using Apache and PHP-FPM 106 | 107 | If you use PHP-FPM (via mod_proxy_fcgi or similar) then Apache must be 108 | instructed to *keep* the Authorization header in requests for the API to work. 109 | In Apache versions `>= 2.4.13` place the following in the section ``: 111 | 112 | ```apache 113 | CGIPassAuth On 114 | ``` 115 | 116 | In older Apache versions we have to set the header value as environment 117 | variable for the CGI process. For example, with mod_proxy_fcgi the following 118 | works, when placed somewhere next to the proxy definition: 119 | 120 | ```apache 121 | SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 122 | ``` 123 | 124 | ## Configuration on Nginx 125 | 126 | ```nginx 127 | server { 128 | server_name domain.tld www.domain.tld; 129 | root /var/www/wallabag/web; 130 | 131 | location / { 132 | # try to serve file directly, fallback to app.php 133 | try_files $uri /app.php$is_args$args; 134 | } 135 | location ~ ^/app\.php(/|$) { 136 | # You may need to replace /run/php/php7.0-fpm.sock below with 137 | # a different version, e.g. /run/php/php7.4-fpm.sock. The path 138 | # should refer to an existing file in the filesystem. 139 | # If, for some reason, you are still using PHP 5, 140 | # then replace /run/php/php7.0 by /var/run/php5 141 | fastcgi_pass unix:/run/php/php7.0-fpm.sock; 142 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 143 | include fastcgi_params; 144 | # When you are using symlinks to link the document root to the 145 | # current version of your application, you should pass the real 146 | # application path instead of the path to the symlink to PHP 147 | # FPM. 148 | # Otherwise, PHP's OPcache may not properly detect changes to 149 | # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 150 | # for more information). 151 | fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 152 | fastcgi_param DOCUMENT_ROOT $realpath_root; 153 | # Prevents URIs that include the front controller. This will 404: 154 | # http://domain.tld/app.php/some-path 155 | # Remove the internal directive to allow URIs like this 156 | internal; 157 | } 158 | 159 | # return 404 for all other php files not matching the front controller 160 | # this prevents access to other php files you don't want to be accessible. 161 | location ~ \.php$ { 162 | return 404; 163 | } 164 | 165 | error_log /var/log/nginx/wallabag_error.log; 166 | access_log /var/log/nginx/wallabag_access.log; 167 | } 168 | ``` 169 | 170 | After reloading or restarting nginx, you should now be able to access 171 | wallabag at . 172 | 173 | When you want to import large files into wallabag, you need to add this 174 | line in your nginx configuration 175 | `client_max_body_size XM; # allows file uploads up to X megabytes`. 176 | 177 | ## Configuration on lighttpd 178 | 179 | Edit your `lighttpd.conf` file and paste this configuration into it: 180 | 181 | ```lighttpd 182 | server.modules = ( 183 | "mod_fastcgi", 184 | "mod_access", 185 | "mod_alias", 186 | "mod_compress", 187 | "mod_redirect", 188 | "mod_rewrite", 189 | ) 190 | server.document-root = "/var/www/wallabag/web" 191 | server.upload-dirs = ( "/var/cache/lighttpd/uploads" ) 192 | server.errorlog = "/var/log/lighttpd/error.log" 193 | server.pid-file = "/var/run/lighttpd.pid" 194 | server.username = "www-data" 195 | server.groupname = "www-data" 196 | server.port = 80 197 | server.follow-symlink = "enable" 198 | index-file.names = ( "index.php", "index.html", "index.lighttpd.html") 199 | url.access-deny = ( "~", ".inc" ) 200 | static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) 201 | compress.cache-dir = "/var/cache/lighttpd/compress/" 202 | compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" ) 203 | include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port 204 | include_shell "/usr/share/lighttpd/create-mime.assign.pl" 205 | include_shell "/usr/share/lighttpd/include-conf-enabled.pl" 206 | dir-listing.activate = "disable" 207 | 208 | url.rewrite-if-not-file = ( 209 | "^/([^?]*)(?:\?(.*))?" => "/app.php?$1&$2", 210 | "^/([^?]*)" => "/app.php?=$1", 211 | ) 212 | ``` 213 | 214 | ## Configuration on Caddy 215 | 216 | ### Caddy 2 217 | 218 | The following configuration works on caddy 2 (tested on 2.3.0): 219 | 220 | ```caddy 221 | domain.tld { 222 | root * /var/www/wallabag/web 223 | file_server 224 | php_fastcgi unix//var/run/php7-fpm.sock { 225 | index app.php 226 | } 227 | try_files {path} {path}/ /app.php?{query} 228 | tls your@email.ru 229 | log { 230 | output file /var/log/caddy/wbg.access.log 231 | } 232 | } 233 | ``` 234 | 235 | ### Caddy 1 236 | 237 | For caddy server, configuration might be: 238 | 239 | ```caddy 240 | domain.tld { 241 | root /var/www/wallabag/web 242 | fastcgi / /var/run/php7-fpm.sock php { 243 | index app.php 244 | } 245 | rewrite / { 246 | to {path} {path}/ /app.php?{query} 247 | } 248 | tls your@email.ru 249 | log /var/log/caddy/wbg.access.log 250 | errors /var/log/caddy/wbg.error.log 251 | } 252 | ``` 253 | 254 | You can also add `push` directive for http/2 and `gzip` for compression. Tested with caddy `=v0.10.4`. 255 | -------------------------------------------------------------------------------- /content/admin/internal_settings.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Internal Settings 3 | weight: 9 4 | --- 5 | 6 | The internal settings page is only available for the instance administrator. It allows handling more sensitive settings, such as activating specific features. 7 | 8 | ## Analytics 9 | 10 | ### Enable Piwik 11 | 12 | `1` to include the Javascript code for [Piwik](https://piwik.org/). 13 | 14 | ### Host of your website in Piwik (without `http://` or `https://`) 15 | 16 | URL for your Piwik server. 17 | 18 | ### ID of your website in Piwik 19 | 20 | ID of your website inside Piwik, available in `Settings` -> `Websites` -> `Manage`. 21 | 22 | For instance: 23 | 24 | ![ID of your website in Piwik](../../img/admin/id_piwik.png) 25 | 26 | ## Article 27 | 28 | ### Diaspora URL, if the service is enabled 29 | 30 | URL of your Diaspora\* instance. 31 | 32 | ### Enable authentication for websites with paywall 33 | 34 | `1` to activate authentication for articles with a paywall (ex: Mediapart, Next INpact, etc.). 35 | 36 | ### Shaarli URL, if the service is enabled 37 | 38 | URL Shaarli instance. 39 | 40 | ### Enable share to Diaspora 41 | 42 | `1` to show the share button for [Diaspora\*](https://diasporafoundation.org/), `0` to deactivate. 43 | 44 | ### Enable share by email 45 | 46 | `1` to show the share button for email, `0` to deactivate. 47 | 48 | ### Allow public URL for entries 49 | 50 | `1` to allow publicly sharing articles, `0` to deactivate. 51 | 52 | ### Enable share to Shaarli 53 | 54 | `1` to show the share button for [Shaarli](https://github.com/shaarli/Shaarli), `0` to deactivate. 55 | 56 | ### Enable share to Twitter 57 | 58 | `1` to show the share button for [Twitter](https://twitter.com/), `0` to deactivate. 59 | 60 | ### Enable share to Unmark.it 61 | 62 | `1` to show the share button for [Unmark.it](https://unmark.it/), `0` to deactivate. 63 | 64 | ### Display a link to print content 65 | 66 | `1` to show the print button, `0` to deactivate. 67 | 68 | ### Unmark.it URL, if the service is enabled 69 | 70 | URL of your Unmark.it instance. 71 | 72 | ## Export 73 | 74 | ### Enable CSV export 75 | 76 | `1` to activate CSV export, `0` to deactivate. 77 | 78 | ### Enable ePub export 79 | 80 | `1` to activate ePub export, `0` to deactivate. 81 | 82 | ### Enable JSON export 83 | 84 | `1` to activate JSON export, `0` to deactivate. 85 | 86 | ### Enable .mobi export 87 | 88 | {{< callout type="warning" >}} 89 | MOBI export has been deprecated in 2.5.0 and will be removed in 2.6.0. 90 | {{< /callout >}} 91 | 92 | `1` to activate .mobi export, `0` to deactivate. 93 | 94 | ### Enable PDF export 95 | 96 | `1` to activate PDF export, `0` to deactivate. 97 | 98 | ### Enable TXT export 99 | 100 | `1` to activate TXT export, `0` to deactivate. 101 | 102 | ### Enable XML export 103 | 104 | `1` to activate XML export, `0` to deactivate. 105 | 106 | ## Import 107 | 108 | ### Enable RabbitMQ 109 | 110 | `1` to activate RabbitMQ, `0` to deactivate (see [Asynchronous tasks]({{< relref "asynchronous.md" >}})). 111 | 112 | ### Enable Redis 113 | 114 | `1` to activate Redis, `0` to deactivate (see [Asynchronous tasks]({{< relref "asynchronous.md" >}})). 115 | 116 | ## Misc 117 | 118 | ### Enable demo mode? 119 | 120 | `1` to activate demo mode, `0` to deactivate (it's not possible to modify the user account). 121 | 122 | ### Demo user 123 | 124 | Username of the account used for demo. 125 | 126 | ### Download images locally 127 | 128 | `1` to activate local picture downloading, `0` to deactivate. 129 | 130 | Once this feature is activated, the article pictures will be downloaded in the `/web/assets/images` folder of your wallabag instance. The path of pictures in articles will also be updated to the path of pictures which are on your instance. 131 | 132 | {{< callout type="info" >}} 133 | If you want GIFs to keep animation, install the `imagick` PHP extension. It's mostly available through distros packet management as `php-imagick`. 134 | {{< /callout >}} 135 | 136 | ### Support URL for wallabag 137 | 138 | URL used in emails sent by wallabag for help requests. 139 | -------------------------------------------------------------------------------- /content/admin/mailer.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Mailer 3 | weight: 8 4 | --- 5 | 6 | Out of the box, you can deliver emails over: 7 | - SMTP (using a DSN like: `smtp://user:pass@smtp.example.com:25`) 8 | - or `sendmail` (using a DSN like `sendmail://default`). 9 | 10 | Since 2.6.6, the `gmail` transport is available again using the DSN: `gmail+smtp://USERNAME:PASSWORD@default` 11 | 12 | | Name | Description | Default | 13 | | -----|-------------|-------- | 14 | | mailer_dsn | One liner with all the mailer parameters `smtp://user:pass@host:465`. Any characters considered special need to be urlencoded in `user`, `pass` and `host`. | smtp://127.0.0.1 | 15 | 16 | note: In the event that supplying URL-encoded characters causes the startup process to crash, try "escaping" them with an additional % character: 17 | e.g., pass%20word -> pass%%20word. This might be useful for Google App Passwords. 18 | 19 | {{< callout type="info" >}} 20 | Symfony can support other transports which aren't shipped by default with wallabag: Amazon SES, MailChimp, Mailgun, Postmark & SendGrid. 21 | 22 | You can install them using Composer. It's a more complex step to do, [check the Symfony documentation about that](https://symfony.com/doc/4.4/mailer.html). 23 | {{< /callout >}} 24 | 25 | ## Before wallabag 2.6.1 26 | 27 | On wallabag < 2.6.1, the mailer was different (we were using an older version of Symfony). 28 | 29 | Here are the previously available parameters. 30 | 31 | | Name | Description | Default | 32 | | -----|-------------|-------- | 33 | | mailer_transport | The exact transport method to use to deliver emails. Valid values are: `smtp`, `gmail`, `sendmail`, `null` (which will disable the mailer) | smtp | 34 | | mailer_user | The username when using `smtp` as the transport. | ~ | 35 | | mailer_password | The password when using `smtp` as the transport. | ~ | 36 | | mailer_host | The host to connect to when using `smtp` as the transport.| 127.0.0.1 | 37 | | mailer_port (**new in 2.4.0**) | The port when using `smtp` as the transport. This defaults to 465 if encryption is `ssl` and 25 otherwise.| false | 38 | | mailer_encryption (**new in 2.4.0**) | The encryption mode to use when using smtp as the transport. Valid values are `tls`, `ssl`, or `null` (indicating no encryption).| ~ | 39 | | mailer_auth_mode (**new in 2.4.0**) | The authentication mode to use when using smtp as the transport. Valid values are `plain`, `login`, `cram-md5`, or `null`.| ~ | 40 | -------------------------------------------------------------------------------- /content/admin/parameters.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Parameters 3 | weight: 7 4 | --- 5 | 6 | ## Default parameters.yml file 7 | 8 | Here is the latest version of the default app/config/parameters.yml file. 9 | Be sure that yours matches this one. If you don't know which value you 10 | need to set, please leave the default one. 11 | 12 | {{< callout type="info" >}} 13 | To apply changes to `parameters.yml`, you have to clear your cache by deleting everything in `var/cache` with this command: `bin/console cache:clear --env=prod`. 14 | {{< /callout >}} 15 | 16 | ```yaml 17 | parameters: 18 | database_driver: pdo_mysql 19 | database_driver_class: ~ 20 | database_host: 127.0.0.1 21 | database_port: ~ 22 | database_name: wallabag 23 | database_user: root 24 | database_password: ~ 25 | database_path: ~ 26 | database_table_prefix: wallabag_ 27 | database_socket: ~ 28 | database_charset: utf8mb4 29 | domain_name: https://your-wallabag-instance.wallabag.org 30 | mailer_dsn: smtp://127.0.0.1 31 | locale: en 32 | secret: ovmpmAWXRCabNlMgzlzFXDYmCFfzGv 33 | twofactor_auth: true 34 | twofactor_sender: no-reply@wallabag.org 35 | fosuser_registration: true 36 | fosuser_confirmation: true 37 | fos_oauth_server_access_token_lifetime: 3600 38 | fos_oauth_server_refresh_token_lifetime: 1209600 39 | from_email: no-reply@wallabag.org 40 | rss_limit: 50 41 | rabbitmq_host: localhost 42 | rabbitmq_port: 5672 43 | rabbitmq_user: guest 44 | rabbitmq_password: guest 45 | redis_scheme: tcp 46 | redis_host: localhost 47 | redis_port: 6379 48 | redis_path: ~ 49 | redis_password: ~ 50 | sentry_dsn: ~ 51 | server_name: "Your wallabag instance" 52 | ``` 53 | 54 | ## Meaning of each parameter 55 | 56 | ### Database parameters 57 | 58 | | Name | Description | Default | 59 | | ------|---------|------------ | 60 | | database_driver | Should be pdo_sqlite or pdo_mysql or pdo_pgsql | pdo_sqlite | 61 | | database_driver_class | Should be used only for PostgreSQL 10 with `Wallabag\CoreBundle\Doctrine\DBAL\Driver\CustomPostgreSQLDriver` | ~ | 62 | | database_host | host of your database (usually localhost or 127.0.0.1) | 127.0.0.1 | 63 | | database_port | port of your database (you can leave ``~`` to use the default one) | ~ | 64 | | database_name | name of your database | symfony | 65 | | database_user | user that can write to this database | root | 66 | | database_password | password of that user| ~ | 67 | | database_path | only for SQLite, define where to put the database file. Put it to null for any other database | `%kernel.root_dir%/ ../data/db/wallabag.sqlite` | 68 | | database_table_prefix | all wallabag's tables will be prefixed with that string. You can include a ``_`` for clarity BUT NEVER USE A ``-`` | wallabag_ | 69 | | database_socket | If your database is using a socket instead of tcp, put the path of the socket (other connection parameters will then be ignored) | null | 70 | | database_charset | For PostgreSQL & SQLite you should use utf8, for MySQL use utf8mb4 to handle emoji and other special characters | utf8mb4 | 71 | 72 | ## Mailer parameters 73 | 74 | You can check about how to properly [configure email in the dedicated section]({{< relref "mailer.md" >}}). 75 | 76 | | Name | Description | Default | 77 | | -----|-------------|-------- | 78 | | mailer_dsn | One liner with all the mailer parameters `smtp://user:pass@host:465`. Any characters considered special need to be urlencoded in `user`, `pass` and `host`. | smtp://127.0.0.1 | 79 | 80 | ### Parameters removed in 2.6.1 81 | 82 | | Name | Description | Default | 83 | | -----|-------------|-------- | 84 | | mailer_transport | The exact transport method to use to deliver emails. Valid values are: `smtp`, `gmail`, `sendmail`, `null` (which will disable the mailer) | smtp | 85 | | mailer_user | The username when using `smtp` as the transport. | ~ | 86 | | mailer_password | The password when using `smtp` as the transport. | ~ | 87 | | mailer_host | The host to connect to when using `smtp` as the transport.| 127.0.0.1 | 88 | | mailer_port (**new in 2.4.0**) | The port when using `smtp` as the transport. This defaults to 465 if encryption is `ssl` and 25 otherwise.| false | 89 | | mailer_encryption (**new in 2.4.0**) | The encryption mode to use when using smtp as the transport. Valid values are `tls`, `ssl`, or `null` (indicating no encryption).| ~ | 90 | | mailer_auth_mode (**new in 2.4.0**) | The authentication mode to use when using smtp as the transport. Valid values are `plain`, `login`, `cram-md5`, or `null`.| ~ | 91 | 92 | ## Other wallabag options 93 | 94 | | Name | Description | Default | 95 | | -----|-------------|-------- | 96 | | locale | Default language of your wallabag instance (like en, fr, es, etc.) | en | 97 | | secret | This is a string that should be unique to your application and it's commonly used to add more entropy to security related operations. | ovmpmAWXRCabNlMgzlzFXDYmCFfzGv | 98 | | twofactor_auth | true to enable the possibility of Two factor authentication | true | 99 | | twofactor_sender | email of the email sender to receive the two factor code | no-reply@wallabag.org | 100 | | fosuser_registration | true to enable public registration | true | 101 | | fosuser_confirmation | true to send a confirmation by email for each registration | true | 102 | | fos_oauth_server_access_token_lifetime | how long the access token should life in seconds for the API | 3600 | 103 | | fos_oauth_server_refresh_token_lifetime | how long the refresh token should life in seconds for the API | 1209600 | 104 | | from_email | email address used in From: field in each email | no-reply@wallabag.org | 105 | | rss_limit | item limit for RSS feeds | 50 | 106 | | domain_name | Full URL of your wallabag instance (without the trailing slash) | https://your-wallabag-instance.wallabag.org | 107 | | sentry_dsn (**new in 2.4.0**) | DSN from [Sentry](https://sentry.io/welcome/) which logs errors | null | 108 | | server_name (**new in 2.4.1**) | User-friendly name of your instance for the 2FA issuer | "Your wallabag instance" | 109 | 110 | ## RabbitMQ options 111 | 112 | | Name | Description | Default | 113 | | -----|-------------|-------- | 114 | | rabbitmq_host | Host of your RabbitMQ | localhost | 115 | | rabbitmq_port | Port of your RabbitMQ instance | 5672 | 116 | | rabbitmq_user | User that can read queues | guest | 117 | | rabbitmq_password | Password of that user | guest | 118 | 119 | ## Redis options 120 | 121 | | Name | Description | Default | 122 | | -----|-------------|-------- | 123 | | redis_scheme | Specifies the protocol used to communicate with an instance of Redis. Valid values are: tcp, unix, http | tcp | 124 | | redis_host | IP or hostname of the target server (ignored for unix scheme) | localhost | 125 | | redis_port | TCP/IP port of the target server (ignored for unix scheme) | 6379 | 126 | | redis_path | Path of the UNIX domain socket file used when connecting to Redis using UNIX domain sockets | null 127 | | redis_password | Password defined in the Redis server configuration (parameter `requirepass` in `redis.conf`) | null 128 | -------------------------------------------------------------------------------- /content/admin/upgrade/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Upgrade 3 | weight: 10 4 | --- 5 | 6 | You will find here different ways to upgrade your wallabag: 7 | 8 | - [from 2.5.x to 2.6.x](#upgrading-from-25x-to-26x) 9 | - [from 2.3.x to 2.4.x](#upgrading-from-23x-to-24x) 10 | - [from 2.3.x to 2.3.y](#upgrading-from-23x-to-23y) 11 | - [from 2.2.x to 2.3.x](#upgrading-from-22x-to-23x) 12 | - [from 2.x.y to 2.3.x](#upgrading-from-2xy-to-23x) 13 | - [from 1.x to 2.x](#from-wallabag-1x) 14 | 15 | {{< callout type="info" >}} 16 | But **first**, ensure you have `composer` installed on your server (or at least the `composer.phar` binary in the root directory of wallabag). If not, [please install it](https://getcomposer.org/download/). 17 | {{< /callout >}} 18 | 19 | ## Upgrading from 2.5.x to 2.6.x 20 | 21 | Same steps as for [upgrading from 2.2.x to 2.3.x](#upgrading-from-22x-to-23x). 22 | 23 | ⚠️ **There are two points to focus on for that update**: 24 | 25 | 1. We added new fields in the database, don't forget to run migration (by running `make update`) otherwise your wallabag won't work. 26 | 2. We've updated the mailer config which needs to be replicated otherwise the image might not work. 27 | 28 | We removed these fields from `app/config/parameters.yml`: 29 | - `mailer_transport` 30 | - `mailer_user` 31 | - `mailer_password` 32 | - `mailer_host` 33 | - `mailer_port` 34 | - `mailer_encryption` 35 | - `mailer_auth_mode` 36 | 37 | And we added `mailer_dsn` as a replacement. Here is [an example of DSN](https://symfony.com/doc/4.4/mailer.html#using-built-in-transports): `smtp://user:pass@smtp.example.com:port` 38 | 39 | [You can find all the queries here]({{< relref "query-upgrade-25-26.md" >}}). 40 | 41 | ## Upgrading from 2.3.x to 2.4.x 42 | 43 | Same steps as for [upgrading from 2.2.x to 2.3.x](#upgrading-from-22x-to-23x). 44 | 45 | ### For shared hosting 46 | 47 | PHP version compatibility has changed. Check the [release notes](https://github.com/wallabag/wallabag/releases/tag/2.4.0) for details. 48 | 49 | [Apply the general steps for upgrades on shared hosting](#upgrade-on-a-shared-hosting) with the following modifications: 50 | 51 | Use these [data queries for the database upgrade to 2.4]({{< relref "query-upgrade-23-24.md" >}}). 52 | 53 | Four parameters were created and MUST be added to your `app/config/parameters.yml` file: `mailer_port`, `mailer_encryption`, `mailer_auth_mode` and `sentry_dsn`. 54 | 55 | Do not forget to run `bin/console cache:clear --env=prod` in the wallabag directory afterwards. 56 | 57 | ## Upgrading from 2.3.x to 2.3.y 58 | 59 | ```bash 60 | make update 61 | ``` 62 | 63 | That's all. 64 | 65 | If you get an error with `Not a git repository`, it means you installed wallabag using an archive rather than git. In this case, [follow the steps for shared hosting](#upgrade-on-a-shared-hosting). 66 | 67 | ## Upgrading from 2.2.x to 2.3.x 68 | 69 | ### Upgrade on a dedicated web server 70 | 71 | ```bash 72 | make update 73 | ``` 74 | 75 | ### Upgrade on a shared hosting 76 | 77 | 1. Backup your `app/config/parameters.yml` file. 78 | 1. Download the latest release of wallabag: 79 | 80 | ```bash 81 | wget https://wllbg.org/latest-v2-package && tar xvf latest-v2-package 82 | ``` 83 | 84 | You will find the [md5 hash of the latest package on our website](https://wallabag.org/en#download). 85 | 86 | 1. Extract the archive in your wallabag folder and replace `app/config/parameters.yml` with yours. 87 | 1. Please check that your `app/config/parameters.yml` contains all the parameters as they are **all mandatory**. You can find documentation about parameters [here]({{< relref "parameters.md" >}}). 88 | 1. If you have modified the `app/config/parameters.yml` file, run `bin/console cache:clear --env=prod` afterwards in the wallabag directory. A warning will appear if any parameter is missing. 89 | 1. If you use SQLite, you must also copy your `data/` folder into the new installation. 90 | 1. Empty the `var/cache` folder. 91 | 1. You must run SQL queries to upgrade your database. We assume that the table prefix is `wallabag_`. Don't forget to backup your database before migrating. 92 | 1. You may encounter issues with indexes names: if so, please change queries with the correct index name. 93 | 1. You can find all the required queries in the [query upgrade documentation]({{< relref "query-upgrade-22-23.md" >}}). 94 | 95 | ## Upgrading from 2.x.y to 2.3.x 96 | 97 | If your wallabag instance is < 2.2.0, there is no automatic script. You need to: 98 | 99 | - export your data 100 | - install wallabag 2.3.x ([read the installation documentation]({{< relref "../installation/" >}})) 101 | - import data in this fresh installation ([read the import documentation]({{< relref "../../user/import/" >}}) ) 102 | 103 | ## From wallabag 1.x 104 | 105 | There is no automatic script to update from wallabag 1.x to wallabag 2.x. You need to: 106 | 107 | - export your data 108 | - install wallabag 2.x ([read the installation documentation]({{< relref "../installation/" >}})) 109 | - import data in this fresh installation ([read the import documentation]({{< relref "../../user/import/" >}}) ) 110 | -------------------------------------------------------------------------------- /content/admin/upgrade/query-upgrade-22-23.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: From 2.2 to 2.3 3 | weight: 2 4 | --- 5 | 6 | You'll find all queries to run when upgrading. 7 | 8 | We assume that the table prefix is `wallabag_`. Don't forget to backup your database before migrating. 9 | 10 | You may encounter issues with indexes names: if so, please change queries with the correct index name. 11 | 12 | ## MySQL 13 | 14 | ```sql 15 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_scuttle', '1', 'entry'); 16 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('scuttle_url', 'http://scuttle.org', 'entry'); 17 | 18 | ALTER TABLE wallabag_entry ADD published_at DATETIME DEFAULT NULL, ADD published_by LONGTEXT DEFAULT NULL; 19 | 20 | ALTER TABLE wallabag_entry DROP is_public; 21 | 22 | DELETE FROM wallabag_craue_config_setting WHERE name = 'download_pictures'; 23 | 24 | CREATE TABLE wallabag_site_credential (id INT AUTO_INCREMENT NOT NULL, user_id INT NOT NULL, host VARCHAR(255) NOT NULL, username LONGTEXT NOT NULL, password LONGTEXT NOT NULL, createdAt DATETIME NOT NULL, INDEX idx_user (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 25 | ALTER TABLE wallabag_site_credential ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES wallabag_user (id); 26 | 27 | ALTER TABLE wallabag_user CHANGE username username VARCHAR(180) NOT NULL; 28 | ALTER TABLE wallabag_user CHANGE username_canonical username_canonical VARCHAR(180) NOT NULL; 29 | ALTER TABLE wallabag_user CHANGE email email VARCHAR(180) NOT NULL; 30 | ALTER TABLE wallabag_user CHANGE email_canonical email_canonical VARCHAR(180) NOT NULL; 31 | 32 | ALTER TABLE wallabag_entry ADD headers LONGTEXT DEFAULT NULL; 33 | 34 | ALTER TABLE wallabag_annotation MODIFY quote TEXT NOT NULL; 35 | 36 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('api_user_registration', '0', 'api'); 37 | 38 | DELETE FROM wallabag_craue_config_setting WHERE name = 'wallabag_url'; 39 | 40 | UPDATE wallabag_tag SET label = LOWER(label); 41 | 42 | ALTER TABLE wallabag_entry ADD starred_at DATETIME DEFAULT NULL; 43 | 44 | UPDATE wallabag_entry SET reading_time = 0 WHERE reading_time IS NULL; 45 | ALTER TABLE wallabag_entry CHANGE reading_time reading_time INT(11) NOT NULL; 46 | 47 | ALTER TABLE wallabag_entry ADD origin_url LONGTEXT DEFAULT NULL; 48 | 49 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('store_article_headers', '0', 'entry'); 50 | 51 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('shaarli_share_origin_url', '0', 'entry'); 52 | ``` 53 | 54 | ## PostgreSQL 55 | 56 | ```sql 57 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_scuttle', '1', 'entry'); 58 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('scuttle_url', 'http://scuttle.org', 'entry'); 59 | 60 | ALTER TABLE wallabag_entry ADD published_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL; 61 | ALTER TABLE wallabag_entry ADD published_by TEXT DEFAULT NULL; 62 | 63 | ALTER TABLE wallabag_entry DROP is_public; 64 | 65 | DELETE FROM wallabag_craue_config_setting WHERE name = 'download_pictures'; 66 | 67 | CREATE SEQUENCE site_credential_id_seq INCREMENT BY 1 MINVALUE 1 START 1; 68 | CREATE TABLE wallabag_site_credential (id SERIAL NOT NULL, user_id INT NOT NULL, host VARCHAR(255) NOT NULL, username TEXT NOT NULL, password TEXT NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id)); 69 | CREATE INDEX idx_user ON wallabag_site_credential (user_id); 70 | ALTER TABLE wallabag_site_credential ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES wallabag_user (id) NOT DEFERRABLE INITIALLY IMMEDIATE; 71 | 72 | ALTER TABLE wallabag_entry ADD headers TEXT DEFAULT NULL; 73 | 74 | ALTER TABLE wallabag_annotation ALTER COLUMN quote TYPE TEXT; 75 | 76 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('api_user_registration', '0', 'api'); 77 | 78 | DELETE FROM wallabag_craue_config_setting WHERE name = 'wallabag_url'; 79 | 80 | UPDATE wallabag_tag SET label = LOWER(label); 81 | 82 | ALTER TABLE wallabag_entry ADD starred_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL; 83 | 84 | UPDATE wallabag_entry SET reading_time = 0 WHERE reading_time IS NULL; 85 | ALTER TABLE wallabag_entry ALTER COLUMN reading_time SET NOT NULL; 86 | 87 | ALTER TABLE wallabag_entry ADD origin_url TEXT DEFAULT NULL; 88 | 89 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('store_article_headers', '0', 'entry'); 90 | 91 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('shaarli_share_origin_url', '0', 'entry'); 92 | ``` 93 | 94 | ## SQLite 95 | 96 | ```sql 97 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('share_scuttle', '1', 'entry'); 98 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('scuttle_url', 'http://scuttle.org', 'entry'); 99 | 100 | ALTER TABLE wallabag_entry ADD COLUMN published_at DATETIME DEFAULT NULL; 101 | ALTER TABLE wallabag_entry ADD COLUMN published_by CLOB DEFAULT NULL; 102 | 103 | DROP INDEX uid; 104 | DROP INDEX created_at; 105 | DROP INDEX IDX_F4D18282A76ED395; 106 | CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, http_status, published_at, published_by FROM wallabag_entry; 107 | DROP TABLE wallabag_entry; 108 | CREATE TABLE wallabag_entry (id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, uid VARCHAR(23) DEFAULT NULL COLLATE BINARY, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, http_status VARCHAR(3) DEFAULT NULL COLLATE BINARY, published_at DEFAULT NULL, published_by CLOB DEFAULT NULL, PRIMARY KEY(id)); 109 | INSERT INTO wallabag_entry (id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, http_status, published_at, published_by) SELECT id, user_id, uid, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, http_status, published_at, published_by FROM __temp__wallabag_entry; 110 | DROP TABLE __temp__wallabag_entry; 111 | CREATE INDEX uid ON wallabag_entry (uid); 112 | CREATE INDEX created_at ON wallabag_entry (created_at); 113 | CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id); 114 | 115 | DELETE FROM wallabag_craue_config_setting WHERE name = 'download_pictures'; 116 | 117 | CREATE TABLE wallabag_site_credential (id INTEGER NOT NULL, user_id INTEGER NOT NULL, host VARCHAR(255) NOT NULL, username CLOB NOT NULL, password CLOB NOT NULL, createdAt DATETIME NOT NULL, PRIMARY KEY(id)); 118 | CREATE INDEX idx_user ON wallabag_site_credential (user_id); 119 | 120 | ALTER TABLE wallabag_entry ADD COLUMN headers CLOB DEFAULT NULL; 121 | 122 | CREATE TEMPORARY TABLE __temp__wallabag_annotation AS 123 | SELECT id, user_id, entry_id, text, created_at, updated_at, quote, ranges 124 | FROM wallabag_annotation; 125 | DROP TABLE wallabag_annotation; 126 | CREATE TABLE wallabag_annotation 127 | ( 128 | id INTEGER PRIMARY KEY NOT NULL, 129 | user_id INTEGER DEFAULT NULL, 130 | entry_id INTEGER DEFAULT NULL, 131 | text CLOB NOT NULL, 132 | created_at DATETIME NOT NULL, 133 | updated_at DATETIME NOT NULL, 134 | quote CLOB NOT NULL, 135 | ranges CLOB NOT NULL, 136 | CONSTRAINT FK_A7AED006A76ED395 FOREIGN KEY (user_id) REFERENCES wallabag_user (id), 137 | CONSTRAINT FK_A7AED006BA364942 FOREIGN KEY (entry_id) REFERENCES wallabag_entry (id) ON DELETE CASCADE 138 | ); 139 | CREATE INDEX IDX_A7AED006A76ED395 ON wallabag_annotation (user_id); 140 | CREATE INDEX IDX_A7AED006BA364942 ON wallabag_annotation (entry_id); 141 | INSERT INTO wallabag_annotation (id, user_id, entry_id, text, created_at, updated_at, quote, ranges) SELECT id, user_id, entry_id, text, created_at, updated_at, quote, ranges 142 | FROM __temp__wallabag_annotation; 143 | DROP TABLE __temp__wallabag_annotation; 144 | 145 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('api_user_registration', '0', 'api'); 146 | 147 | DELETE FROM wallabag_craue_config_setting WHERE name = 'wallabag_url'; 148 | 149 | ALTER TABLE wallabag_entry ADD COLUMN starred_at DATETIME DEFAULT NULL; 150 | 151 | ALTER TABLE wallabag_entry ADD COLUMN origin_url CLOB DEFAULT NULL; 152 | 153 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('store_article_headers', '0', 'entry'); 154 | 155 | INSERT INTO wallabag_craue_config_setting (name, value, section) VALUES ('shaarli_share_origin_url', '0', 'entry'); 156 | ``` 157 | -------------------------------------------------------------------------------- /content/admin/upgrade/query-upgrade-23-24.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: From 2.3 to 2.4 3 | weight: 3 4 | --- 5 | 6 | You'll find all queries to run when upgrading. 7 | 8 | We assume that the table prefix is `wallabag_`. Don't forget to backup your database before migrating. 9 | 10 | You may encounter issues with indexes names: if so, please change queries with the correct index name. 11 | 12 | ## MySQL 13 | 14 | ```sql 15 | ALTER TABLE wallabag_entry ADD archived_at DATETIME DEFAULT NULL; 16 | 17 | ALTER TABLE `wallabag_oauth2_access_tokens` CHANGE `token` `token` varchar(191) NOT NULL; 18 | ALTER TABLE `wallabag_oauth2_access_tokens` CHANGE `scope` `scope` varchar(191); 19 | ALTER TABLE `wallabag_oauth2_auth_codes` CHANGE `token` `token` varchar(191) NOT NULL; 20 | ALTER TABLE `wallabag_oauth2_auth_codes` CHANGE `scope` `scope` varchar(191); 21 | ALTER TABLE `wallabag_oauth2_refresh_tokens` CHANGE `token` `token` varchar(191) NOT NULL; 22 | ALTER TABLE `wallabag_oauth2_refresh_tokens` CHANGE `scope` `scope` varchar(191); 23 | ALTER TABLE `wallabag_craue_config_setting` CHANGE `name` `name` varchar(191); 24 | ALTER TABLE `wallabag_craue_config_setting` CHANGE `section` `section` varchar(191); 25 | ALTER TABLE `wallabag_craue_config_setting` CHANGE `value` `value` varchar(191); 26 | 27 | ALTER TABLE `wallabag_user` ADD googleAuthenticatorSecret VARCHAR(191) DEFAULT NULL; 28 | ALTER TABLE `wallabag_user` CHANGE twoFactorAuthentication emailTwoFactor BOOLEAN NOT NULL; 29 | ALTER TABLE `wallabag_user` DROP trusted; 30 | ALTER TABLE `wallabag_user` ADD backupCodes LONGTEXT DEFAULT NULL COMMENT '(DC2Type:json_array)'; 31 | 32 | ALTER TABLE wallabag_site_credential ADD updated_at DATETIME DEFAULT NULL; 33 | 34 | ALTER TABLE wallabag_entry ADD hashed_url TINYTEXT DEFAULT NULL; 35 | CREATE INDEX hashed_url_user_id ON wallabag_entry (user_id, hashed_url(40)); 36 | 37 | ALTER TABLE `wallabag_config` CHANGE rss_token feed_token VARCHAR(255) DEFAULT NULL; 38 | ALTER TABLE `wallabag_config` CHANGE rss_limit feed_limit INT DEFAULT NULL; 39 | 40 | ALTER TABLE `wallabag_oauth2_access_tokens` DROP FOREIGN KEY FK_368A4209A76ED395; 41 | ALTER TABLE `wallabag_oauth2_access_tokens` ADD CONSTRAINT FK_368A4209A76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id) ON DELETE CASCADE; 42 | ALTER TABLE `wallabag_oauth2_clients` DROP FOREIGN KEY IDX_user_oauth_client; 43 | ALTER TABLE `wallabag_oauth2_clients` ADD CONSTRAINT FK_635D765EA76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id); 44 | ALTER TABLE `wallabag_oauth2_refresh_tokens` DROP FOREIGN KEY FK_20C9FB24A76ED395; 45 | ALTER TABLE `wallabag_oauth2_refresh_tokens` ADD CONSTRAINT FK_20C9FB24A76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id) ON DELETE CASCADE; 46 | ALTER TABLE `wallabag_oauth2_auth_codes` DROP FOREIGN KEY FK_EE52E3FAA76ED395; 47 | ALTER TABLE `wallabag_oauth2_auth_codes` ADD CONSTRAINT FK_EE52E3FAA76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id) ON DELETE CASCADE; 48 | 49 | ALTER TABLE `wallabag_tag` CHANGE `label` `label` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; 50 | ALTER TABLE `wallabag_tag` CHANGE `slug` `slug` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; 51 | 52 | ALTER TABLE wallabag_entry ADD given_url LONGTEXT DEFAULT NULL, ADD hashed_given_url TINYTEXT DEFAULT NULL; 53 | CREATE INDEX hashed_given_url_user_id ON wallabag_entry (user_id, hashed_given_url(40)); 54 | 55 | UPDATE wallabag_config SET reading_speed = reading_speed*200; 56 | 57 | ALTER TABLE `wallabag_entry` MODIFY language VARCHAR(20) DEFAULT NULL; 58 | CREATE INDEX user_language ON `wallabag_entry` (language, user_id); 59 | CREATE INDEX user_archived ON `wallabag_entry` (user_id, is_archived, archived_at); 60 | CREATE INDEX user_created ON `wallabag_entry` (user_id, created_at); 61 | CREATE INDEX user_starred ON `wallabag_entry` (user_id, is_starred, starred_at); 62 | CREATE INDEX tag_label ON `wallabag_tag` (label (255)); 63 | CREATE INDEX config_feed_token ON `wallabag_config` (feed_token (255)); 64 | 65 | ALTER TABLE `wallabag_craue_config_setting` RENAME `wallabag_internal_setting`; 66 | 67 | CREATE TABLE wallabag_ignore_origin_user_rule (id INT AUTO_INCREMENT NOT NULL, config_id INT NOT NULL, rule VARCHAR(255) NOT NULL, INDEX idx_config (config_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB; 68 | CREATE TABLE wallabag_ignore_origin_instance_rule (id INT AUTO_INCREMENT NOT NULL, rule VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB; 69 | ALTER TABLE wallabag_ignore_origin_user_rule ADD CONSTRAINT fk_config FOREIGN KEY (config_id) REFERENCES `wallabag_config` (id); 70 | 71 | UPDATE wallabag_internal_setting SET name = 'matomo_enabled' where name = 'piwik_enabled'; 72 | UPDATE wallabag_internal_setting SET name = 'matomo_host' where name = 'piwik_host'; 73 | UPDATE wallabag_internal_setting SET name = 'matomo_site_id' where name = 'piwik_site_id'; 74 | ``` 75 | 76 | ## PostgreSQL 77 | 78 | ```sql 79 | ALTER TABLE wallabag_entry ADD archived_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL; 80 | 81 | ALTER TABLE "wallabag_user" ADD googleAuthenticatorSecret VARCHAR(191) DEFAULT NULL; 82 | ALTER TABLE "wallabag_user" RENAME COLUMN twofactorauthentication TO emailTwoFactor; 83 | ALTER TABLE "wallabag_user" DROP trusted; 84 | ALTER TABLE "wallabag_user" ADD backupCodes TEXT DEFAULT NULL; 85 | 86 | ALTER TABLE wallabag_site_credential ADD updated_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL; 87 | 88 | ALTER TABLE wallabag_entry ADD hashed_url TEXT DEFAULT NULL; 89 | CREATE INDEX hashed_url_user_id ON wallabag_entry (user_id, hashed_url); 90 | 91 | ALTER TABLE "wallabag_config" RENAME COLUMN rss_token TO feed_token; 92 | ALTER TABLE "wallabag_config" RENAME COLUMN rss_limit TO feed_limit; 93 | 94 | ALTER TABLE "wallabag_oauth2_access_tokens" DROP CONSTRAINT FK_368A4209A76ED395; 95 | ALTER TABLE "wallabag_oauth2_access_tokens" ADD CONSTRAINT FK_368A4209A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE; 96 | ALTER TABLE "wallabag_oauth2_clients" DROP CONSTRAINT idx_user_oauth_client; 97 | ALTER TABLE "wallabag_oauth2_clients" ADD CONSTRAINT FK_635D765EA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE; 98 | ALTER TABLE "wallabag_oauth2_refresh_tokens" DROP CONSTRAINT FK_20C9FB24A76ED395; 99 | ALTER TABLE "wallabag_oauth2_refresh_tokens" ADD CONSTRAINT FK_20C9FB24A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE; 100 | ALTER TABLE "wallabag_oauth2_auth_codes" DROP CONSTRAINT FK_EE52E3FAA76ED395; 101 | ALTER TABLE "wallabag_oauth2_auth_codes" ADD CONSTRAINT FK_EE52E3FAA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE; 102 | 103 | ALTER TABLE wallabag_entry ADD given_url TEXT DEFAULT NULL; 104 | ALTER TABLE wallabag_entry ADD hashed_given_url TEXT DEFAULT NULL; 105 | CREATE INDEX hashed_given_url_user_id ON wallabag_entry (user_id, hashed_given_url); 106 | 107 | UPDATE wallabag_config SET reading_speed = reading_speed*200; 108 | 109 | ALTER TABLE "wallabag_entry" ALTER language TYPE VARCHAR(20); 110 | CREATE INDEX user_language ON "wallabag_entry" (language, user_id); 111 | CREATE INDEX user_archived ON "wallabag_entry" (user_id, is_archived, archived_at); 112 | CREATE INDEX user_created ON "wallabag_entry" (user_id, created_at); 113 | CREATE INDEX user_starred ON "wallabag_entry" (user_id, is_starred, starred_at); 114 | CREATE INDEX tag_label ON "wallabag_tag" (label); 115 | CREATE INDEX config_feed_token ON "wallabag_config" (feed_token); 116 | 117 | ALTER TABLE "wallabag_craue_config_setting" RENAME TO "wallabag_internal_setting"; 118 | 119 | CREATE SEQUENCE ignore_origin_user_rule_id_seq INCREMENT BY 1 MINVALUE 1 START 1; 120 | CREATE SEQUENCE ignore_origin_instance_rule_id_seq INCREMENT BY 1 MINVALUE 1 START 1; 121 | CREATE TABLE wallabag_ignore_origin_user_rule (id SERIAL NOT NULL, config_id INT NOT NULL, rule VARCHAR(255) NOT NULL, PRIMARY KEY(id)); 122 | CREATE INDEX idx_config ON wallabag_ignore_origin_user_rule (config_id); 123 | CREATE TABLE wallabag_ignore_origin_instance_rule (id SERIAL NOT NULL, rule VARCHAR(255) NOT NULL, PRIMARY KEY(id)); 124 | ALTER TABLE wallabag_ignore_origin_user_rule ADD CONSTRAINT fk_config FOREIGN KEY (config_id) REFERENCES "wallabag_config" (id) NOT DEFERRABLE INITIALLY IMMEDIATE; 125 | 126 | UPDATE wallabag_internal_setting SET name = 'matomo_enabled' where name = 'piwik_enabled'; 127 | UPDATE wallabag_internal_setting SET name = 'matomo_host' where name = 'piwik_host'; 128 | UPDATE wallabag_internal_setting SET name = 'matomo_site_id' where name = 'piwik_site_id'; 129 | ``` 130 | 131 | ## SQLite 132 | 133 | ```sql 134 | ALTER TABLE wallabag_entry ADD COLUMN archived_at DATETIME DEFAULT NULL; 135 | 136 | DROP INDEX UNIQ_1D63E7E5C05FB297; 137 | DROP INDEX UNIQ_1D63E7E5A0D96FBF; 138 | DROP INDEX UNIQ_1D63E7E592FC23A8; 139 | CREATE TEMPORARY TABLE __temp__user AS SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication FROM wallabag_user; 140 | DROP TABLE wallabag_user; 141 | CREATE TABLE wallabag_user (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username VARCHAR(180) NOT NULL COLLATE BINARY, username_canonical VARCHAR(180) NOT NULL COLLATE BINARY, email VARCHAR(180) NOT NULL COLLATE BINARY, email_canonical VARCHAR(180) NOT NULL COLLATE BINARY, enabled BOOLEAN NOT NULL, password VARCHAR(255) NOT NULL COLLATE BINARY, last_login DATETIME DEFAULT NULL, password_requested_at DATETIME DEFAULT NULL, name CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, emailTwoFactor BOOLEAN NOT NULL, salt VARCHAR(255) DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL, roles CLOB NOT NULL --(DC2Type:array) 142 | , googleAuthenticatorSecret VARCHAR(255) DEFAULT NULL, backupCodes CLOB DEFAULT NULL --(DC2Type:json_array) 143 | ); 144 | INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, emailTwoFactor) SELECT id, username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, name, created_at, updated_at, authCode, twoFactorAuthentication FROM __temp__user; 145 | DROP TABLE __temp__user; 146 | CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token); 147 | CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical); 148 | CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical); 149 | 150 | ALTER TABLE wallabag_site_credential ADD COLUMN updated_at DATETIME DEFAULT NULL; 151 | 152 | DROP INDEX IDX_entry_uid; 153 | DROP INDEX IDX_F4D18282A76ED395; 154 | DROP INDEX IDX_entry_created_at; 155 | DROP INDEX IDX_entry_starred; 156 | DROP INDEX IDX_entry_archived; 157 | CREATE TEMPORARY TABLE __temp__entry AS SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at FROM wallabag_entry; 158 | DROP TABLE wallabag_entry; 159 | CREATE TABLE wallabag_entry (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER DEFAULT NULL, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, uid VARCHAR(23) DEFAULT NULL COLLATE BINARY, http_status VARCHAR(3) DEFAULT NULL COLLATE BINARY, published_at DATETIME DEFAULT NULL, published_by CLOB DEFAULT NULL COLLATE BINARY, headers CLOB DEFAULT NULL COLLATE BINARY, starred_at DATETIME DEFAULT NULL, origin_url CLOB DEFAULT NULL COLLATE BINARY, archived_at DATETIME DEFAULT NULL, hashed_url CLOB DEFAULT NULL); 160 | INSERT INTO wallabag_entry (id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at) SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at FROM __temp__entry; 161 | DROP TABLE __temp__entry; 162 | CREATE INDEX IDX_entry_uid ON wallabag_entry (uid); 163 | CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id); 164 | CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at); 165 | CREATE INDEX IDX_entry_starred ON wallabag_entry (is_starred); 166 | CREATE INDEX IDX_entry_archived ON wallabag_entry (is_archived); 167 | CREATE INDEX hashed_url_user_id ON wallabag_entry (user_id, hashed_url); 168 | 169 | DROP INDEX UNIQ_87E64C53A76ED395; 170 | CREATE TEMPORARY TABLE __temp__config AS SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key, action_mark_as_read, list_mode FROM wallabag_config; 171 | DROP TABLE wallabag_config; 172 | CREATE TABLE wallabag_config (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER DEFAULT NULL, theme VARCHAR(255) NOT NULL COLLATE BINARY, items_per_page INTEGER NOT NULL, language VARCHAR(255) NOT NULL COLLATE BINARY, reading_speed DOUBLE PRECISION DEFAULT NULL, pocket_consumer_key VARCHAR(255) DEFAULT NULL COLLATE BINARY, action_mark_as_read INTEGER DEFAULT 0, list_mode INTEGER DEFAULT NULL, feed_token VARCHAR(255) DEFAULT NULL, feed_limit INTEGER DEFAULT NULL, CONSTRAINT FK_87E64C53A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE); 173 | INSERT INTO wallabag_config (id, user_id, theme, items_per_page, language, feed_token, feed_limit, reading_speed, pocket_consumer_key, action_mark_as_read, list_mode) SELECT id, user_id, theme, items_per_page, language, rss_token, rss_limit, reading_speed, pocket_consumer_key, action_mark_as_read, list_mode FROM __temp__config; 174 | DROP TABLE __temp__config; 175 | CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config (user_id); 176 | 177 | DROP INDEX IDX_368A4209A76ED395; 178 | DROP INDEX IDX_368A420919EB6921; 179 | DROP INDEX UNIQ_368A42095F37A13B; 180 | CREATE TEMPORARY TABLE __temp__oauth2_access_tokens AS SELECT id, client_id, user_id, token, expires_at, scope FROM wallabag_oauth2_access_tokens; 181 | DROP TABLE wallabag_oauth2_access_tokens; 182 | CREATE TABLE wallabag_oauth2_access_tokens (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, client_id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, expires_at INTEGER DEFAULT NULL, token VARCHAR(191) NOT NULL, scope VARCHAR(191) NULL, CONSTRAINT FK_368A420919EB6921 FOREIGN KEY (client_id) REFERENCES oauth2_clients (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_368A4209A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_oauth2_clients" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE); 183 | INSERT INTO wallabag_oauth2_access_tokens (id, client_id, user_id, token, expires_at, scope) SELECT id, client_id, user_id, token, expires_at, scope FROM __temp__oauth2_access_tokens; 184 | DROP TABLE __temp__oauth2_access_tokens; 185 | CREATE INDEX IDX_368A4209A76ED395 ON wallabag_oauth2_access_tokens (user_id); 186 | CREATE INDEX IDX_368A420919EB6921 ON wallabag_oauth2_access_tokens (client_id); 187 | DROP INDEX IDX_635D765EA76ED395; 188 | CREATE TEMPORARY TABLE __temp__oauth2_clients AS SELECT id, user_id, random_id, secret, redirect_uris, allowed_grant_types, name FROM wallabag_oauth2_clients; 189 | DROP TABLE wallabag_oauth2_clients; 190 | CREATE TABLE wallabag_oauth2_clients (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER DEFAULT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, name CLOB NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL, allowed_grant_types CLOB NOT NULL, CONSTRAINT FK_635D765EA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_oauth2_clients" (id) NOT DEFERRABLE INITIALLY IMMEDIATE); 191 | INSERT INTO wallabag_oauth2_clients (id, user_id, random_id, secret, redirect_uris, allowed_grant_types, name) SELECT id, user_id, random_id, secret, redirect_uris, allowed_grant_types, name FROM __temp__oauth2_clients; 192 | DROP TABLE __temp__oauth2_clients; 193 | CREATE INDEX IDX_635D765EA76ED395 ON wallabag_oauth2_clients (user_id); 194 | DROP INDEX IDX_20C9FB24A76ED395; 195 | DROP INDEX IDX_20C9FB2419EB6921; 196 | DROP INDEX UNIQ_20C9FB245F37A13B; 197 | CREATE TEMPORARY TABLE __temp__oauth2_refresh_tokens AS SELECT id, client_id, user_id, token, expires_at, scope FROM wallabag_oauth2_refresh_tokens; 198 | DROP TABLE wallabag_oauth2_refresh_tokens; 199 | CREATE TABLE wallabag_oauth2_refresh_tokens (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, client_id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, expires_at INTEGER DEFAULT NULL, token VARCHAR(191) NOT NULL, scope VARCHAR(191) NULL, CONSTRAINT FK_20C9FB2419EB6921 FOREIGN KEY (client_id) REFERENCES oauth2_clients (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_20C9FB24A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_oauth2_clients" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE); 200 | INSERT INTO wallabag_oauth2_refresh_tokens (id, client_id, user_id, token, expires_at, scope) SELECT id, client_id, user_id, token, expires_at, scope FROM __temp__oauth2_refresh_tokens; 201 | DROP TABLE __temp__oauth2_refresh_tokens; 202 | CREATE INDEX IDX_20C9FB24A76ED395 ON wallabag_oauth2_refresh_tokens (user_id); 203 | CREATE INDEX IDX_20C9FB2419EB6921 ON wallabag_oauth2_refresh_tokens (client_id); 204 | DROP INDEX IDX_EE52E3FAA76ED395; 205 | DROP INDEX IDX_EE52E3FA19EB6921; 206 | DROP INDEX UNIQ_EE52E3FA5F37A13B; 207 | CREATE TEMPORARY TABLE __temp__oauth2_auth_codes AS SELECT id, client_id, user_id, token, redirect_uri, expires_at, scope FROM wallabag_oauth2_auth_codes; 208 | DROP TABLE wallabag_oauth2_auth_codes; 209 | CREATE TABLE wallabag_oauth2_auth_codes (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, client_id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, redirect_uri CLOB NOT NULL COLLATE BINARY, expires_at INTEGER DEFAULT NULL, token VARCHAR(191) NOT NULL, scope VARCHAR(191) NULL, CONSTRAINT FK_EE52E3FA19EB6921 FOREIGN KEY (client_id) REFERENCES oauth2_clients (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_EE52E3FAA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_oauth2_clients" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE); 210 | INSERT INTO wallabag_oauth2_auth_codes (id, client_id, user_id, token, redirect_uri, expires_at, scope) SELECT id, client_id, user_id, token, redirect_uri, expires_at, scope FROM __temp__oauth2_auth_codes; 211 | DROP TABLE __temp__oauth2_auth_codes; 212 | CREATE INDEX IDX_EE52E3FAA76ED395 ON wallabag_oauth2_auth_codes (user_id); 213 | CREATE INDEX IDX_EE52E3FA19EB6921 ON wallabag_oauth2_auth_codes (client_id); 214 | 215 | DROP INDEX hashed_url_user_id; 216 | DROP INDEX IDX_entry_archived; 217 | DROP INDEX IDX_entry_starred; 218 | DROP INDEX IDX_entry_created_at; 219 | DROP INDEX IDX_F4D18282A76ED395; 220 | DROP INDEX IDX_entry_uid; 221 | CREATE TEMPORARY TABLE __temp__entry AS SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at, hashed_url FROM wallabag_entry; 222 | DROP TABLE wallabag_entry; 223 | CREATE TABLE wallabag_entry (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER DEFAULT NULL, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER DEFAULT NULL, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, uid VARCHAR(23) DEFAULT NULL COLLATE BINARY, http_status VARCHAR(3) DEFAULT NULL COLLATE BINARY, published_at DATETIME DEFAULT NULL, published_by CLOB DEFAULT NULL COLLATE BINARY, headers CLOB DEFAULT NULL COLLATE BINARY, starred_at DATETIME DEFAULT NULL, origin_url CLOB DEFAULT NULL COLLATE BINARY, archived_at DATETIME DEFAULT NULL, hashed_url CLOB DEFAULT NULL COLLATE BINARY, given_url CLOB DEFAULT NULL, hashed_given_url CLOB DEFAULT NULL); 224 | INSERT INTO wallabag_entry (id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at, hashed_url) SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at, hashed_url FROM __temp__entry; 225 | DROP TABLE __temp__entry; 226 | CREATE INDEX hashed_url_user_id ON wallabag_entry (user_id, hashed_url); 227 | CREATE INDEX IDX_entry_archived ON wallabag_entry (is_archived); 228 | CREATE INDEX IDX_entry_starred ON wallabag_entry (is_starred); 229 | CREATE INDEX IDX_entry_created_at ON wallabag_entry (created_at); 230 | CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id); 231 | CREATE INDEX IDX_entry_uid ON wallabag_entry (uid); 232 | CREATE INDEX hashed_given_url_user_id ON wallabag_entry (user_id, hashed_given_url); 233 | 234 | UPDATE wallabag_entry SET reading_time = 0 WHERE reading_time IS NULL; 235 | DROP INDEX hashed_given_url_user_id; 236 | DROP INDEX IDX_entry_uid; 237 | DROP INDEX IDX_F4D18282A76ED395; 238 | DROP INDEX IDX_entry_created_at; 239 | DROP INDEX IDX_entry_starred; 240 | DROP INDEX IDX_entry_archived; 241 | DROP INDEX hashed_url_user_id; 242 | CREATE TEMPORARY TABLE __temp__entry AS SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at, hashed_url, given_url, hashed_given_url FROM wallabag_entry; 243 | DROP TABLE wallabag_entry; 244 | CREATE TABLE wallabag_entry (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER DEFAULT NULL, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, language CLOB DEFAULT NULL COLLATE BINARY, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, uid VARCHAR(23) DEFAULT NULL COLLATE BINARY, http_status VARCHAR(3) DEFAULT NULL COLLATE BINARY, published_at DATETIME DEFAULT NULL, starred_at DATETIME DEFAULT NULL, origin_url CLOB DEFAULT NULL COLLATE BINARY, archived_at DATETIME DEFAULT NULL, given_url CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER NOT NULL, published_by CLOB DEFAULT NULL --(DC2Type:array) 245 | , headers CLOB DEFAULT NULL --(DC2Type:array) 246 | , hashed_url VARCHAR(40) DEFAULT NULL, hashed_given_url VARCHAR(40) DEFAULT NULL, CONSTRAINT FK_F4D18282A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE); 247 | INSERT INTO wallabag_entry (id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at, hashed_url, given_url, hashed_given_url) SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, reading_time, domain_name, preview_picture, uid, http_status, published_at, published_by, headers, starred_at, origin_url, archived_at, hashed_url, given_url, hashed_given_url FROM __temp__entry; 248 | DROP TABLE __temp__entry; 249 | CREATE INDEX hashed_given_url_user_id ON wallabag_entry (user_id, hashed_given_url); 250 | CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id); 251 | CREATE INDEX hashed_url_user_id ON wallabag_entry (user_id, hashed_url); 252 | CREATE INDEX created_at ON wallabag_entry (created_at); 253 | CREATE INDEX uid ON wallabag_entry (uid); 254 | 255 | UPDATE wallabag_config SET reading_speed = reading_speed*200; 256 | 257 | DROP INDEX uid; 258 | DROP INDEX created_at; 259 | DROP INDEX hashed_url_user_id; 260 | DROP INDEX IDX_F4D18282A76ED395; 261 | DROP INDEX hashed_given_url_user_id; 262 | CREATE TEMPORARY TABLE __temp__wallabag_entry AS SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, domain_name, preview_picture, uid, http_status, published_at, starred_at, origin_url, archived_at, given_url, reading_time, published_by, headers, hashed_url, hashed_given_url FROM wallabag_entry; 263 | DROP TABLE wallabag_entry; 264 | CREATE TABLE wallabag_entry (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER DEFAULT NULL, title CLOB DEFAULT NULL COLLATE BINARY, url CLOB DEFAULT NULL COLLATE BINARY, is_archived BOOLEAN NOT NULL, is_starred BOOLEAN NOT NULL, content CLOB DEFAULT NULL COLLATE BINARY, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, mimetype CLOB DEFAULT NULL COLLATE BINARY, domain_name CLOB DEFAULT NULL COLLATE BINARY, preview_picture CLOB DEFAULT NULL COLLATE BINARY, uid VARCHAR(23) DEFAULT NULL COLLATE BINARY, http_status VARCHAR(3) DEFAULT NULL COLLATE BINARY, published_at DATETIME DEFAULT NULL, starred_at DATETIME DEFAULT NULL, origin_url CLOB DEFAULT NULL COLLATE BINARY, archived_at DATETIME DEFAULT NULL, given_url CLOB DEFAULT NULL COLLATE BINARY, reading_time INTEGER NOT NULL, published_by CLOB DEFAULT NULL COLLATE BINARY --(DC2Type:array) 265 | , headers CLOB DEFAULT NULL COLLATE BINARY --(DC2Type:array) 266 | , hashed_url VARCHAR(40) DEFAULT NULL COLLATE BINARY, hashed_given_url VARCHAR(40) DEFAULT NULL COLLATE BINARY, language VARCHAR(20) DEFAULT NULL, CONSTRAINT FK_F4D18282A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE); 267 | INSERT INTO wallabag_entry (id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, domain_name, preview_picture, uid, http_status, published_at, starred_at, origin_url, archived_at, given_url, reading_time, published_by, headers, hashed_url, hashed_given_url) SELECT id, user_id, title, url, is_archived, is_starred, content, created_at, updated_at, mimetype, language, domain_name, preview_picture, uid, http_status, published_at, starred_at, origin_url, archived_at, given_url, reading_time, published_by, headers, hashed_url, hashed_given_url FROM __temp__wallabag_entry; 268 | DROP TABLE __temp__wallabag_entry; 269 | CREATE INDEX uid ON wallabag_entry (uid); 270 | CREATE INDEX created_at ON wallabag_entry (created_at); 271 | CREATE INDEX hashed_url_user_id ON wallabag_entry (user_id, hashed_url); 272 | CREATE INDEX IDX_F4D18282A76ED395 ON wallabag_entry (user_id); 273 | CREATE INDEX hashed_given_url_user_id ON wallabag_entry (user_id, hashed_given_url); 274 | CREATE INDEX user_language ON wallabag_entry (language, user_id); 275 | CREATE INDEX user_archived ON wallabag_entry (user_id, is_archived, archived_at); 276 | CREATE INDEX user_created ON wallabag_entry (user_id, created_at); 277 | CREATE INDEX user_starred ON wallabag_entry (user_id, is_starred, starred_at); 278 | CREATE INDEX tag_label ON wallabag_tag (label); 279 | CREATE INDEX config_feed_token ON wallabag_config (feed_token); 280 | 281 | ALTER TABLE wallabag_craue_config_setting RENAME TO wallabag_internal_setting; 282 | 283 | CREATE TABLE wallabag_ignore_origin_user_rule (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, config_id INTEGER NOT NULL, rule VARCHAR(255) NOT NULL); 284 | CREATE INDEX idx_config ON wallabag_ignore_origin_user_rule (config_id); 285 | CREATE TABLE wallabag_ignore_origin_instance_rule (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, rule VARCHAR(255) NOT NULL); 286 | 287 | UPDATE wallabag_internal_setting SET name = 'matomo_enabled' where name = 'piwik_enabled'; 288 | UPDATE wallabag_internal_setting SET name = 'matomo_host' where name = 'piwik_host'; 289 | UPDATE wallabag_internal_setting SET name = 'matomo_site_id' where name = 'piwik_site_id'; 290 | ``` 291 | -------------------------------------------------------------------------------- /content/admin/upgrade/query-upgrade-25-26.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: From 2.5 to 2.6 3 | weight: 4 4 | --- 5 | 6 | You'll find all queries to run when upgrading. 7 | 8 | We assume that the table prefix is `wallabag_`. Don't forget to backup your database before migrating. 9 | 10 | You may encounter issues with indexes names: if so, please change queries with the correct index name. 11 | 12 | ## MySQL 13 | 14 | ```sql 15 | ALTER TABLE wallabag_config DROP theme; 16 | ALTER TABLE wallabag_user CHANGE backupCodes backupCodes JSON DEFAULT NULL; 17 | ALTER TABLE wallabag_config ADD display_thumbnails INT(11) NOT NULL DEFAULT 1; 18 | ``` 19 | 20 | ## PostgreSQL 21 | 22 | ```sql 23 | ALTER TABLE wallabag_config DROP theme; 24 | ALTER TABLE wallabag_user ALTER backupcodes TYPE JSON USING backupcodes::json 25 | ALTER TABLE wallabag_config ADD display_thumbnails INT NOT NULL DEFAULT 1; 26 | ``` 27 | 28 | ## SQLite 29 | 30 | ```sql 31 | 32 | CREATE TEMPORARY TABLE __temp__wallabag_user AS SELECT id, username, username_canonical, email, email_canonical, enabled, password, last_login, password_requested_at, name, created_at, updated_at, authCode, emailTwoFactor, salt, confirmation_token, roles, googleAuthenticatorSecret, backupCodes FROM wallabag_user; 33 | DROP TABLE wallabag_user; 34 | CREATE TABLE wallabag_user (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username VARCHAR(180) NOT NULL, username_canonical VARCHAR(180) NOT NULL, email VARCHAR(180) NOT NULL, email_canonical VARCHAR(180) NOT NULL, enabled BOOLEAN NOT NULL, salt VARCHAR(255) DEFAULT NULL, password VARCHAR(255) NOT NULL, last_login DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL, password_requested_at DATETIME DEFAULT NULL, roles CLOB NOT NULL --(DC2Type:array) 35 | , name CLOB DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, authCode INTEGER DEFAULT NULL, googleAuthenticatorSecret VARCHAR(255) DEFAULT NULL, backupCodes CLOB DEFAULT NULL --(DC2Type:json) 36 | , emailTwoFactor BOOLEAN NOT NULL); 37 | INSERT INTO wallabag_user (id, username, username_canonical, email, email_canonical, enabled, password, last_login, password_requested_at, name, created_at, updated_at, authCode, emailTwoFactor, salt, confirmation_token, roles, googleAuthenticatorSecret, backupCodes) SELECT id, username, username_canonical, email, email_canonical, enabled, password, last_login, password_requested_at, name, created_at, updated_at, authCode, emailTwoFactor, salt, confirmation_token, roles, googleAuthenticatorSecret, backupCodes FROM __temp__wallabag_user; 38 | DROP TABLE __temp__wallabag_user; 39 | CREATE UNIQUE INDEX UNIQ_1D63E7E592FC23A8 ON wallabag_user (username_canonical); 40 | CREATE UNIQUE INDEX UNIQ_1D63E7E5A0D96FBF ON wallabag_user (email_canonical); 41 | CREATE UNIQUE INDEX UNIQ_1D63E7E5C05FB297 ON wallabag_user (confirmation_token); 42 | 43 | CREATE TABLE "__temp__wallabag_config" ( 44 | "id" INTEGER NOT NULL, 45 | "user_id" INTEGER DEFAULT NULL, 46 | "items_per_page" INTEGER NOT NULL, 47 | "language" VARCHAR(255) NOT NULL, 48 | "reading_speed" DOUBLE PRECISION DEFAULT NULL, 49 | "pocket_consumer_key" VARCHAR(255) DEFAULT NULL, 50 | "action_mark_as_read" INTEGER DEFAULT 0, 51 | "list_mode" INTEGER DEFAULT NULL, 52 | "feed_token" VARCHAR(255) DEFAULT NULL, 53 | "feed_limit" INTEGER DEFAULT NULL, 54 | "display_thumbnails" INTEGER DEFAULT 1, 55 | CONSTRAINT "FK_87E64C53A76ED395" FOREIGN KEY("user_id") REFERENCES "wallabag_user"("id") ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, 56 | PRIMARY KEY("id" AUTOINCREMENT) 57 | ); 58 | INSERT INTO __temp__wallabag_config ("action_mark_as_read","display_thumbnails","feed_limit","feed_token","id","items_per_page","language","list_mode","pocket_consumer_key","reading_speed","user_id") SELECT "action_mark_as_read","display_thumbnails","feed_limit","feed_token","id","items_per_page","language","list_mode","pocket_consumer_key","reading_speed","user_id" FROM wallabag_config; 59 | DROP TABLE wallabag_config; 60 | ALTER TABLE __temp__wallabag_config RENAME TO wallabag_config; 61 | CREATE INDEX config_feed_token ON wallabag_config ("feed_token"); 62 | CREATE UNIQUE INDEX UNIQ_87E64C53A76ED395 ON wallabag_config ("user_id"); 63 | ``` 64 | -------------------------------------------------------------------------------- /content/apps/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Apps 3 | weight: 2 4 | --- 5 | 6 | Enjoy your saved articles on your mobile by using one of the mobile apps for Android or iOS. 7 | 8 | {{< cards >}} 9 | {{< card link="android" title="Android" icon="device-mobile" >}} 10 | {{< card link="ios" title="iOS" icon="device-mobile" >}} 11 | {{< /cards >}} 12 | -------------------------------------------------------------------------------- /content/apps/android.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Android 3 | weight: 1 4 | --- 5 | 6 | ## Purpose of this document 7 | 8 | This document describes how you can setup your Android application to 9 | work with your wallabag instance. There is no difference in this 10 | procedure between wallabag v1 and v2. 11 | 12 | ## Steps to configure your app 13 | 14 | When you first start the app, you see the welcome screen, which advises 15 | you to configure the app for your wallabag instance. 16 | 17 | ![Welcome screen](/img/user/android_welcome_screen.en.png) 18 | 19 | Just confirm that message and you will be redirected to the settings screen. 20 | 21 | ![Settings screen](/img/user/android_configuration_screen.en.png) 22 | 23 | Fill in your wallabag data. You need to enter your wallabag address. 24 | **It is important that this URL does not end with a slash**. Also add 25 | your wallabag credentials to the username and password fields. 26 | 27 | ![Filled in settings](/img/user/android_configuration_filled_in.en.png) 28 | 29 | After you have filled in your data, press the Connection test button and 30 | wait for the test to finish. 31 | 32 | ![Connection test with your wallabag data](/img/user/android_configuration_connection_test.en.png) 33 | 34 | The connection test should finish successfully. If not, you need to fix 35 | this before proceeding. 36 | 37 | ![Connection test successful](/img/user/android_configuration_connection_test_success.en.png) 38 | 39 | After the connection test is successful, you can press the button to get 40 | your feed credentials. The app will try to login to your wallabag 41 | instance and get the user id and the corresponding token for the feeds. 42 | 43 | ![Getting the feed credentials](/img/user/android_configuration_get_feed_credentials.en.png) 44 | 45 | When the process of getting your feed credentials finishes successfully, 46 | you will see a toast message indicating that the user id and token were 47 | automatically filled in to the form. 48 | 49 | ![Getting feed credentials successful](/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png) 50 | 51 | Now you need to scroll to the bottom of the settings menu. You can 52 | adjust the given settings to your needs. Finish the configuration of 53 | your app by pressing the save button. 54 | 55 | ![Bottom of the settings screen](/img/user/android_configuration_scroll_bottom.en.png) 56 | 57 | After pressing the save button, you will see the following screen. The app 58 | proposes to initiate a synchronization process to update your feeds of 59 | articles. It is recommended to acknowledge this action and press Yes. 60 | 61 | ![Settings saved the first time](/img/user/android_configuration_saved_feed_update.en.png) 62 | 63 | Finally, after the synchronization finishes successfully, you will be 64 | presented with the list of unread articles. 65 | 66 | ![Filled article list cause feeds successfully synchronized](/img/user/android_unread_feed_synced.en.png) 67 | 68 | ## Known limitations 69 | 70 | 71 | ### Two factor authentication (2FA) 72 | 73 | Currently, the Android application does not support two-factor 74 | authentication. You should disable it to get the application working. 75 | 76 | ### Limited amount of articles with wallabag v2 77 | 78 | In your wallabag web instance, you can configure how many items are part 79 | of the RSS feed. This option did not exist in wallabag v1, where all 80 | articles were part of the feed. So if you set the number of articles 81 | being displayed greater than the number of items being content of your 82 | RSS feed, you will only see the number of items in your RSS feed. 83 | 84 | ### SSL/TLS encryption 85 | 86 | If you can reach your wallabag web instance via HTTPS, you should use 87 | that, especially if your HTTP URL redirects you to the HTTPS one. 88 | Currently, the app cannot handle that redirect properly. 89 | 90 | ## References 91 | 92 | 93 | - [Source code of the Android 94 | application](https://github.com/wallabag/android-app) 95 | - [Android Application on 96 | F-Droid](https://f-droid.org/repository/browse/?fdfilter=wallabag&fdid=fr.gaulupeau.apps.InThePoche) 97 | - [Android Application on Google 98 | Play](https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche) 99 | -------------------------------------------------------------------------------- /content/apps/ios.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: iOS 3 | weight: 2 4 | --- 5 | 6 | ## Purpose of this document 7 | 8 | This document describes how you can setup your iOS application to 9 | work with your Wallabag V2 instance. 10 | 11 | ## Steps to configure your app 12 | 13 | When you first start the app, you will see the welcome screen with a 'Register' button. This button will guide you through configuring your app. 14 | 15 | ![Welcome screen](../../img/user/ios_welcome.en.png) 16 | 17 | The first page prompts for your Wallabag address. Enter the URL in the text box. **It is important that this URL does not end with a slash**. 18 | 19 | Your URL will look something like this: 20 | * https://wallabag.example.com 21 | * https://www.example.com/wallabag 22 | * https://framabag.org/u/your-username 23 | 24 | ![Server Address](../../img/user/ios_wallabag_address.en.png) 25 | 26 | After pressing 'Next', you should be prompted for a Client ID and Secret. To generate these details, login to Wallabag in a browser and navigate to 'API Clients Management'. 27 | 28 | ![API Clients Management](../../img/user/browser_api_management.en.png) 29 | 30 | Click 'Create a New Client'. You'll need to give the client a name. Something like 'iOS' or 'My iPhone' would be appropriate. 31 | 32 | ![Client Description](../../img/user/browser_client_description.en.png) 33 | 34 | Click 'Create a New Client'. At this point, you should see a Client ID and Client secret. 35 | 36 | ![Client ID and Secret](../../img/user/browser_client_secret.en.png) 37 | 38 | You'll need to enter these into the Wallabag iOS app. It may be beneficial to copy them somewhere you can access on your iOS device if using a desktop browser. **Make sure they remain private** 39 | 40 | ![Filled in Client ID and Secret](../../img/user/ios_client_secret.en.png) 41 | 42 | After clicking 'Next', you'll be prompted for your username and password. These are the same credentials used to login to the Wallabag web application. 43 | 44 | ![Completed credentials](../../img/user/ios_credentials.en.png) 45 | 46 | Once you've entered your credentials, Click 'Next'. You should then be taken to the main Wallabag app screen. It may be empty to begin with, drag the list down to force a refresh. After a few seconds your articles will begin to appear. (This may take a short while depending on the speed of your connection and how many articles you have in Wallabag) 47 | 48 | ![Main App](../../img/user/ios_main_app.en.png) 49 | 50 | ## References 51 | 52 | - [Source code of the iOS application](https://github.com/wallabag/ios-app) 53 | - [iOS Application on the Apple AppStore](https://apps.apple.com/us/app/wallabag-2-official/id1170800946) 54 | -------------------------------------------------------------------------------- /content/developer/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Developer 3 | weight: 4 4 | --- 5 | 6 | You've found an issue and would like to develop a fix? You want to contribute to the project by updating translations? 7 | 8 | Check this section for information related to the development of and around wallabag. 9 | 10 | {{< cards >}} 11 | {{< card link="api" title="API" icon="terminal" >}} 12 | {{< card link="translate" title="Translate" icon="translate" >}} 13 | {{< card link="back-end" title="Back-End" icon="cube-transparent" >}} 14 | {{< card link="front_end" title="Front-End" icon="desktop-computer" >}} 15 | {{< /cards >}} 16 | -------------------------------------------------------------------------------- /content/developer/api/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: API 3 | weight: 1 4 | --- 5 | 6 | We'll see here how to interact with the 7 | wallabag API. 8 | 9 | ## Requirements 10 | 11 | - wallabag freshly (or not) installed on https://app.wallabag.it 12 | - `httpie` installed on your computer ([see project 13 | website](https://github.com/jkbrzt/httpie)). Note that you can also 14 | adapt the commands using curl or wget. 15 | - all the API methods are documented here 16 | https://app.wallabag.it/api/doc (on your instance) and [on our 17 | example instance](https://app.wallabag.it/api/doc) 18 | -------------------------------------------------------------------------------- /content/developer/api/methods.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Methods 3 | weight: 2 4 | --- 5 | 6 | ## Getting existing entries 7 | 8 | Documentation for this method: 9 | 10 | https://app.wallabag.it/api/doc#get--api-entries.{_format} 11 | 12 | As we work on a fresh wallabag installation, we'll have no result with this command: 13 | 14 | ```bash 15 | http GET http://localhost:8000/api/entries.json \ 16 | "Authorization:Bearer ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA" 17 | ``` 18 | 19 | returns: 20 | 21 | ```http 22 | HTTP/1.1 200 OK 23 | 0: application/json 24 | Cache-Control: no-cache 25 | Connection: close 26 | Content-Type: application/json 27 | Date: Tue, 05 Apr 2016 08:51:32 GMT 28 | Host: localhost:8000 29 | Set-Cookie: PHPSESSID=nrogm748md610ovhu6j70c3q63; path=/; HttpOnly 30 | X-Debug-Token: 4fbbc4 31 | X-Debug-Token-Link: /_profiler/4fbbc4 32 | X-Powered-By: PHP/7.0.4 33 | 34 | { 35 | "_embedded": { 36 | "items": [] 37 | }, 38 | "_links": { 39 | "first": { 40 | "href": "http://localhost:8000/api/entries?page=1&perPage=30" 41 | }, 42 | "last": { 43 | "href": "http://localhost:8000/api/entries?page=1&perPage=30" 44 | }, 45 | "self": { 46 | "href": "http://localhost:8000/api/entries?page=1&perPage=30" 47 | } 48 | }, 49 | "limit": 30, 50 | "page": 1, 51 | "pages": 1, 52 | "total": 0 53 | } 54 | ``` 55 | 56 | The `items` array is empty. 57 | 58 | cURL example: 59 | 60 | ```bash 61 | curl --get "https://localhost:8000/api/entries.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA" 62 | ``` 63 | 64 | ## Adding your first entry 65 | 66 | Documentation for this method: https://app.wallabag.it/api/doc#post--api-entries.{_format} 67 | 68 | ```bash 69 | http POST http://localhost:8000/api/entries.json \ 70 | "Authorization:Bearer ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA" \ 71 | url="http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html" 72 | ``` 73 | 74 | returns 75 | 76 | ```http 77 | HTTP/1.1 200 OK 78 | 0: application/json 79 | Cache-Control: no-cache 80 | Connection: close 81 | Content-Type: application/json 82 | Date: Tue, 05 Apr 2016 09:07:54 GMT 83 | Host: localhost:8000 84 | Set-Cookie: PHPSESSID=bjie40ck72kp2pst3i71gf43a4; path=/; HttpOnly 85 | X-Debug-Token: e01c51 86 | X-Debug-Token-Link: /_profiler/e01c51 87 | X-Powered-By: PHP/7.0.4 88 | 89 | { 90 | "_links": { 91 | "self": { 92 | "href": "/api/entries/1" 93 | } 94 | }, 95 | "content": "

Fonctionnant sur le même principe que Pocket, Instapaper ou Readability, le logiciel Wallabag permet de mémoriser des articles pour les lire plus tard. Sa nouvelle version apporte une multitude de nouvelles fonctionnalités.

Si vous utilisez Firefox comme navigateur web, vous avez peut-être constaté l’arrivée d’une fonctionnalité intitulée Pocket. Disponible autrefois sous la forme d’un module complémentaire, et sous un autre nom (Read it Later), elle est depuis le mois de juin 2015 directement incluse au sein de Firefox.

\n

Concrètement, Pocket sert à garder en mémoire des contenus que vous croisez au fil de la navigation, comme des articles de presse ou des vidéos, afin de pouvoir les consulter plus tard. Pocket fonctionne un peu comme un système de favoris, mais en bien plus élaboré grâce à ses options supplémentaires.

\n

Mais Pocket fait polémique, car il s’agit d’un projet propriétaire qui est intégré dans un logiciel libre. C’est pour cette raison que des utilisateurs ont choisi de se tourner vers d’autres solutions, comme Wallabag, qui est l’équivalent libre de Pocket et d’autres systèmes du même genre, comme Instapaper et Readability.

\n

Et justement, Wallabag évolue. C’est ce dimanche que la version 2.0.0 du logiciel a été publiée par l’équipe en  charge de son développement et celle-ci contient de nombreux changements par rapport aux moutures précédentes (la documentation est traduite en français), lui permettant d’apparaître comme une alternative à Pocket, Instapaper et Readability.

\n

\"homepage\"

\n

Parmi les principaux changements que l’on peut retenir avec cette nouvelle version, notons la possibilité d’écrire des annotations dans les articles mémorisés, de filtrer les contenus selon divers critères (temps de lecture, nom de domaine, date de création, statut…), d’assigner des mots-clés aux entrées, de modifier le titre des articles, le support des flux RSS ou encore le support de plusieurs langues dont le français.

\n

D’autres options sont également à signaler, comme l’aperçu d’un article mémorisé (si l’option est disponible), un guide de démarrage rapide pour les débutants, un outil d’export dans divers formats (PDF, JSON, EPUB, MOBI, XML, CSV et TXT) et, surtout, la possibilité de migrer vers Wallabag depuis Pocket, afin de convaincre les usagers de se lancer.

\n \n \n

Articles liés

\n
\n
\n", 96 | "created_at": "2016-04-05T09:07:54+0000", 97 | "domain_name": "www.numerama.com", 98 | "id": 1, 99 | "is_archived": 0, 100 | "is_starred": 0, 101 | "language": "fr-FR", 102 | "mimetype": "text/html", 103 | "preview_picture": "http://www.numerama.com/content/uploads/2016/04/post-it.jpg", 104 | "reading_time": 2, 105 | "tags": [], 106 | "title": "Le Pocket libre Wallabag fait le plein de fonctionnalités - Tech - Numerama", 107 | "updated_at": "2016-04-05T09:07:54+0000", 108 | "url": "http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html", 109 | "user_email": "", 110 | "user_id": 1, 111 | "user_name": "wallabag" 112 | } 113 | ``` 114 | 115 | Now, if you execute the previous command (see **Get existing entries**), you'll have data. 116 | 117 | cURL example: 118 | 119 | ```bash 120 | curl "https://localhost:8000/api/entries.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA&url=http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html" 121 | ``` 122 | 123 | ## Deleting an entry 124 | 125 | Documentation for this method: https://app.wallabag.it/api/doc#delete--api-entries-{entry}.{_format} 126 | 127 | ```bash 128 | http DELETE http://localhost:8000/api/entries/1.json \ 129 | "Authorization:Bearer ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA" 130 | ``` 131 | 132 | returns 133 | 134 | ```http 135 | HTTP/1.1 200 OK 136 | 0: application/json 137 | Cache-Control: no-cache 138 | Connection: close 139 | Content-Type: application/json 140 | Date: Tue, 05 Apr 2016 09:19:07 GMT 141 | Host: localhost:8000 142 | Set-Cookie: PHPSESSID=jopgnfvmuc9a62b27sqm6iulr6; path=/; HttpOnly 143 | X-Debug-Token: 887cef 144 | X-Debug-Token-Link: /_profiler/887cef 145 | X-Powered-By: PHP/7.0.4 146 | 147 | { 148 | "_links": { 149 | "self": { 150 | "href": "/api/entries/" 151 | } 152 | }, 153 | "annotations": [], 154 | "content": "

Fonctionnant sur le même principe que Pocket, Instapaper ou Readability, le logiciel Wallabag permet de mémoriser des articles pour les lire plus tard. Sa nouvelle version apporte une multitude de nouvelles fonctionnalités.

Si vous utilisez Firefox comme navigateur web, vous avez peut-être constaté l’arrivée d’une fonctionnalité intitulée Pocket. Disponible autrefois sous la forme d’un module complémentaire, et sous un autre nom (Read it Later), elle est depuis le mois de juin 2015 directement incluse au sein de Firefox.

\n

Concrètement, Pocket sert à garder en mémoire des contenus que vous croisez au fil de la navigation, comme des articles de presse ou des vidéos, afin de pouvoir les consulter plus tard. Pocket fonctionne un peu comme un système de favoris, mais en bien plus élaboré grâce à ses options supplémentaires.

\n

Mais Pocket fait polémique, car il s’agit d’un projet propriétaire qui est intégré dans un logiciel libre. C’est pour cette raison que des utilisateurs ont choisi de se tourner vers d’autres solutions, comme Wallabag, qui est l’équivalent libre de Pocket et d’autres systèmes du même genre, comme Instapaper et Readability.

\n

Et justement, Wallabag évolue. C’est ce dimanche que la version 2.0.0 du logiciel a été publiée par l’équipe en  charge de son développement et celle-ci contient de nombreux changements par rapport aux moutures précédentes (la documentation est traduite en français), lui permettant d’apparaître comme une alternative à Pocket, Instapaper et Readability.

\n

\"homepage\"

\n

Parmi les principaux changements que l’on peut retenir avec cette nouvelle version, notons la possibilité d’écrire des annotations dans les articles mémorisés, de filtrer les contenus selon divers critères (temps de lecture, nom de domaine, date de création, statut…), d’assigner des mots-clés aux entrées, de modifier le titre des articles, le support des flux RSS ou encore le support de plusieurs langues dont le français.

\n

D’autres options sont également à signaler, comme l’aperçu d’un article mémorisé (si l’option est disponible), un guide de démarrage rapide pour les débutants, un outil d’export dans divers formats (PDF, JSON, EPUB, MOBI, XML, CSV et TXT) et, surtout, la possibilité de migrer vers Wallabag depuis Pocket, afin de convaincre les usagers de se lancer.

\n \n \n

Articles liés

\n
\n
\n", 155 | "created_at": "2016-04-05T09:07:54+0000", 156 | "domain_name": "www.numerama.com", 157 | "is_archived": 0, 158 | "is_starred": 0, 159 | "language": "fr-FR", 160 | "mimetype": "text/html", 161 | "preview_picture": "http://www.numerama.com/content/uploads/2016/04/post-it.jpg", 162 | "reading_time": 2, 163 | "tags": [], 164 | "title": "Le Pocket libre Wallabag fait le plein de fonctionnalités - Tech - Numerama", 165 | "updated_at": "2016-04-05T09:07:54+0000", 166 | "url": "http://www.numerama.com/tech/160115-le-pocket-libre-wallabag-fait-le-plein-de-fonctionnalites.html", 167 | "user_email": "", 168 | "user_id": 1, 169 | "user_name": "wallabag" 170 | } 171 | ``` 172 | 173 | And if you want to list the existing entries (see **Get existing entries**), the array is empty. 174 | 175 | cURL example: 176 | 177 | ```bash 178 | curl --request DELETE "https://localhost:8000/api/entries/1.html?access_token=ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA" 179 | ``` 180 | 181 | ## Other methods 182 | 183 | We didn't write examples for each API method. 184 | 185 | Have a look on the listing here: https://app.wallabag.it/api/doc to learn about each method. 186 | -------------------------------------------------------------------------------- /content/developer/api/oauth.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: OAuth 3 | weight: 1 4 | --- 5 | 6 | ## Creating a new API client 7 | 8 | In your wallabag account, you can create a new API client by visiting: 9 | https://app.wallabag.it/developer/client/create. 10 | 11 | Provide the redirect URL of your application and create your client. 12 | If your application is a desktop one, use any URL that suits your needs. 13 | 14 | You get information like this: 15 | 16 | ``` 17 | Client ID: 18 | 19 | 1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc 20 | 21 | Client secret: 22 | 23 | 636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4 24 | ``` 25 | 26 | ## Obtaining a access token 27 | 28 | For each API call, you'll need an access token. Create one using the following 29 | command, replacing `client_id`, `client_secret`, `username`, and `password` with your actual values: 30 | 31 | ```bash 32 | http POST http://localhost:8000/oauth/v2/token \ 33 | grant_type=password \ 34 | client_id=1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc \ 35 | client_secret=636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4 \ 36 | username=wallabag \ 37 | password=wallabag 38 | ``` 39 | 40 | The response will look like this: 41 | 42 | ```http 43 | HTTP/1.1 200 OK 44 | Cache-Control: no-store, private 45 | Connection: close 46 | Content-Type: application/json 47 | Date: Tue, 05 Apr 2016 08:44:33 GMT 48 | Host: localhost:8000 49 | Pragma: no-cache 50 | X-Debug-Token: 19c8e0 51 | X-Debug-Token-Link: /_profiler/19c8e0 52 | X-Powered-By: PHP/7.0.4 53 | 54 | { 55 | "access_token": "ZGJmNTA2MDdmYTdmNWFiZjcxOWY3MWYyYzkyZDdlNWIzOTU4NWY3NTU1MDFjOTdhMTk2MGI3YjY1ZmI2NzM5MA", 56 | "expires_in": 3600, 57 | "refresh_token": "OTNlZGE5OTJjNWQwYzc2NDI5ZGE5MDg3ZTNjNmNkYTY0ZWZhZDVhNDBkZTc1ZTNiMmQ0MjQ0OThlNTFjNTQyMQ", 58 | "scope": null, 59 | "token_type": "bearer" 60 | } 61 | ``` 62 | 63 | We will use the `access_token` value in our subsequent API calls. 64 | 65 | cURL example: 66 | 67 | ```bash 68 | curl -s "https://localhost:8000/oauth/v2/token?grant_type=password&client_id=1_3o53gl30vhgk0c8ks4cocww08o84448osgo40wgw4gwkoo8skc&client_secret=636ocbqo978ckw0gsw4gcwwocg8044sco0w8w84cws48ggogs4&username=wallabag&password=wallabag" 69 | ``` 70 | -------------------------------------------------------------------------------- /content/developer/api/resources.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Resources 3 | weight: 3 4 | --- 5 | 6 | ## Third party resources 7 | 8 | Some applications or libraries use our API. Here is a non-exhaustive 9 | list of them: 10 | 11 | - [Java wrapper for the wallabag 12 | API](https://github.com/di72nn/wallabag-api-wrapper) by Dmitriy 13 | Bogdanov. 14 | - [.NET library for the wallabag v2 15 | API](https://github.com/jlnostr/wallabag-api) by Julian Oster. 16 | - [A plugin](https://github.com/joshp23/ttrss-to-wallabag-v2) designed 17 | for [Tiny Tiny RSS](https://tt-rss.org/) 18 | that makes use of the wallabag v2 API. By Josh Panter. 19 | - [A plugin](https://github.com/Joedmin/xExtension-wallabag-button) designed 20 | for [FreshRSS](https://www.freshrss.org/) 21 | that makes use of the wallabag v2 API. By Joedmin. 22 | - [Golang wrapper for the wallabag 23 | API](https://github.com/Strubbl/wallabago) by Strubbl, for his 24 | projects [wallabag-stats 25 | graph](https://codeberg.org/strubbl/wallabag-stats) and the command 26 | line tool 27 | [wallabag-add-article](https://codeberg.org/strubbl/wallabag-add-article). 28 | - Tool to automatically download Wallabag articles into your local 29 | computer or Kobo ebook reader 30 | [wallabako](https://gitlab.com/anarcat/wallabako) by anarcat. 31 | -------------------------------------------------------------------------------- /content/developer/back-end.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Back-End 3 | weight: 4 4 | --- 5 | 6 | ## Tips for back-end developers 7 | 8 | ### Use PHP’s built-in web server 9 | 10 | [PHP’s built-in web server](https://www.php.net/manual/en/features.commandline.webserver.php) allows you to develop without installing a web server like Nginx or Apache. 11 | 12 | To install PHP dependencies, build the `dev` version of the front-end, configure wallabag, and start the built-in server, run: 13 | 14 | ``` 15 | make dev 16 | ``` 17 | 18 | Note that you will need [yarn](https://yarnpkg.com/en/docs/install) to build the front-end `dev` version. 19 | 20 | ### Linting 21 | 22 | To make your code conform to wallabag's code style, run: 23 | 24 | ``` 25 | php bin/php-cs-fixer fix --verbose 26 | ``` 27 | -------------------------------------------------------------------------------- /content/developer/docker.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Docker 3 | weight: 2 4 | --- 5 | 6 | Run wallabag in docker-compose 7 | ============================== 8 | 9 | This document describes how to use Docker for wallabag development 10 | purposes. For running wallabag in production, please use the 11 | [official docker-compose configuration 12 | provided](https://github.com/wallabag/docker). 13 | 14 | To run your own development instance of wallabag, you can use the 15 | pre-configured docker compose files provided in the wallabag repository. 16 | 17 | Requirements 18 | ------------ 19 | 20 | Make sure to have 21 | [Docker](https://docs.docker.com/installation/ubuntulinux/) and [Docker 22 | Compose](https://docs.docker.com/compose/install/) available on your 23 | system and up to date. 24 | 25 | Switch DBMS 26 | ----------- 27 | 28 | By default, wallabag starts with a SQLite database. However, wallabag 29 | also supports PostgreSQL and MySQL. Docker containers are available for both. 30 | 31 | In `docker-compose.yml`, for the chosen DBMS uncomment: 32 | 33 | - the container definition (`postgres` or `mariadb` root level block) 34 | - the container link in the `php` container 35 | - the container env file in the `php` container 36 | 37 | In order to keep running Symfony commands on your host (such as 38 | `wallabag:install`), you also should: 39 | 40 | - source the proper env files on your command line, so variables like 41 | `SYMFONY__ENV__DATABASE_HOST` will exist. 42 | - create a `127.0.0.1 rdbms` on your system `hosts` file 43 | 44 | Run wallabag 45 | ------------ 46 | 47 | 1. Fork and clone the project 48 | 2. Edit `app/config/parameters.yml` to replace `database_*` properties 49 | with commented ones (with values prefixed by `env.`) 50 | 3. `composer install` the project dependencies 51 | 4. `php bin/console wallabag:install` to create the schema 52 | 5. `docker-compose up` to run the containers 53 | 6. Finally, browse to to find your freshly 54 | installed wallabag. 55 | 56 | At various step, you'll probably run into UNIX permission problems, bad 57 | paths in generated cache, etc… Operations like removing cache files or 58 | changing files owners might be frequently required, so don't be afraid! 59 | -------------------------------------------------------------------------------- /content/developer/documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Documentation 3 | weight: 3 4 | --- 5 | 6 | Contribute to this documentation 7 | ================================ 8 | 9 | Sources of our documentation are here 10 | https://github.com/wallabag/doc/ 11 | 12 | We use [GitBook](https://www.gitbook.com/book/wallabag/documentation/details) to generate it. 13 | 14 | Pages are written in [Markdown](https://en.wikipedia.org/wiki/Markdown) format. You can 15 | use online tools like http://dillinger.io or 16 | https://stackedit.io/ to preview your articles. 17 | -------------------------------------------------------------------------------- /content/developer/front_end.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Front-End 3 | weight: 5 4 | --- 5 | 6 | ## Tips for front-end developers 7 | 8 | wallabag uses webpack to bundle its assets since version 2.3. 9 | 10 | ### Dev mode 11 | 12 | When running the server in development mode, execute `yarn build:dev` to 13 | generate JavaScript files for each theme. The generated files are named 14 | `%theme%.dev.js` and git ignores them. You must run `yarn build:dev` again 15 | after making any changes to asset files (JavaScript, CSS, images, fonts, etc.). 16 | 17 | ### Live reload 18 | 19 | Webpack's live reload feature eliminates the need to manually regenerate 20 | asset files or refresh the page after making changes. The changes appear 21 | automatically in the web page. To enable this feature: 22 | 23 | 1. Set `use_webpack_dev_server` to `true` in `app/config/config.yml` 24 | 2. Run `yarn watch` 25 | 26 | Important: Set `use_webpack_dev_server` back to `false` when you finish 27 | using the live reload feature. 28 | 29 | ### Production builds 30 | 31 | Before committing changes, build the assets for production by running 32 | `yarn build:prod`. This command builds all necessary assets for wallabag. 33 | To verify the build works correctly, start a server in production mode 34 | using `bin/console server:run --env=prod`. 35 | 36 | Remember: Always generate production builds before committing changes! 37 | 38 | ## Code style 39 | 40 | Two tools check code style: 41 | - stylelint for (S)CSS 42 | - eslint for JavaScript (using the Airbnb base preset configuration) 43 | -------------------------------------------------------------------------------- /content/developer/paywall.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Paywall 3 | weight: 8 4 | --- 5 | 6 | ## Configuring paywall access 7 | 8 | 9 | {{< callout icon="beaker" >}} 10 | This is the technical part about the paywall. If you are looking for the user part, please check [that page instead]({{< relref "../user/articles/restricted.md" >}}). 11 | {{< /callout >}} 12 | 13 | Read [this part of the documentation]({{< relref "../user/errors_during_fetching.md" >}}) 14 | to understand the configuration files, which are located under `vendor/j0k3r/graby-site-config/`. For most of the websites, this file 15 | is already configured: the following instructions are only for the websites that are not configured yet. 16 | 17 | Each parsing configuration file needs to be improved by adding 18 | `requires_login`, `login_uri`, `login_username_field`, 19 | `login_password_field` and `not_logged_in_xpath`. 20 | 21 | Be careful, the login form must be in the page content when wallabag 22 | loads it. It's impossible for wallabag to be authenticated on a website 23 | where the login form is loaded after the page (by ajax for example). 24 | 25 | `login_uri` is the action URL of the form (`action` attribute in the 26 | form). `login_username_field` is the `name` attribute of the login 27 | field. `login_password_field` is the `name` attribute of the password 28 | field. 29 | 30 | For example: 31 | 32 | ``` 33 | title://div[@id="titrage-contenu"]/h1[@class="title"] 34 | body: //div[@class="contenu-html"]/div[@class="page-pane"] 35 | 36 | requires_login: yes 37 | 38 | login_uri: http://www.arretsurimages.net/forum/login.php 39 | login_username_field: username 40 | login_password_field: password 41 | 42 | not_logged_in_xpath: //body[@class="not-logged-in"] 43 | ``` 44 | 45 | To add additional parameters to the login query, specify them using the following format: 46 | 47 | ``` 48 | login_extra_fields: myParameter=value 49 | ``` 50 | -------------------------------------------------------------------------------- /content/developer/testsuite.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Test Suite 3 | weight: 6 4 | --- 5 | 6 | To ensure wallabag development quality, we wrote tests with 7 | [PHPUnit](https://phpunit.de). 8 | 9 | When contributing to the project - whether through translations, bug fixes, or new features - 10 | you should include appropriate tests for your changes. 11 | 12 | To launch wallabag testsuite, you need to have 13 | [ant](http://ant.apache.org) installed. 14 | 15 | To run the tests, first install the project dependencies by running `composer install`. Then execute `make test`, which will populate the test database with sample data and run the tests. 16 | -------------------------------------------------------------------------------- /content/developer/translate.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Translate 3 | weight: 7 4 | --- 5 | 6 | ## wallabag web application 7 | 8 | ### Translation files 9 | 10 | Since wallabag is primarily developed by a French team, the French 11 | translation is the most up-to-date. Use it as a reference to create 12 | your own translation. 13 | 14 | Translation files are available here: 15 | https://github.com/wallabag/wallabag/tree/master/src/Wallabag/CoreBundle/Resources/translations. 16 | 17 | You need to create `messages.CODE.yml` and `validators.CODE.yml`, where 18 | CODE is the ISO 639-1 code of your language ([see 19 | Wikipedia](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)). 20 | 21 | Other files to translate: 22 | 23 | - https://github.com/wallabag/wallabag/tree/master/app/Resources/CraueConfigBundle/translations 24 | - https://github.com/wallabag/wallabag/tree/master/src/Wallabag/UserBundle/Resources/translations 25 | 26 | You need to create `THE_TRANSLATION_FILE.CODE.yml` files. 27 | 28 | ### Configuration file 29 | 30 | Edit the [app/config/wallabag.yml](https://github.com/wallabag/wallabag/blob/master/app/config/wallabag.yml) 31 | file to display your language on the Configuration page of wallabag, allowing users to switch to the new translation. 32 | 33 | In the `wallabag_core.languages` section, add a new line containing your 34 | translation, as shown in this example: 35 | 36 | ```yaml 37 | wallabag_core: 38 | ... 39 | languages: 40 | en: 'English' 41 | fr: 'Français' 42 | ``` 43 | 44 | For the first column (`en`, `fr`, etc.), add the ISO 639-1 code for your language. 45 | 46 | For the second column, enter the name of your language in its native form. 47 | 48 | ## wallabag documentation 49 | 50 | Unlike the web application, English is the primary language for documentation. 51 | 52 | Documentation files are located at: 53 | 54 | 55 | When creating your translation, maintain the same folder structure as the `en` directory. 56 | -------------------------------------------------------------------------------- /content/user/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: User 3 | weight: 1 4 | --- 5 | 6 | {{< cards >}} 7 | {{< card link="create_account" title="Account" icon="user" >}} 8 | {{< card link="articles" title="Articles" icon="document-duplicate" >}} 9 | {{< card link="configuration" title="Configuration" icon="adjustments" >}} 10 | {{< card link="import" title="Import" icon="upload" >}} 11 | {{< /cards >}} 12 | -------------------------------------------------------------------------------- /content/user/articles/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Articles 3 | weight: 3 4 | --- 5 | 6 | Articles are the core feature of wallabag. wallabag's content parser, named Graby gets the content from articles, and only the content. 7 | 8 | ## Mark articles as read 9 | 10 | When you mark an article as read, it moves from the category « Unread » to the « Archive » category. 11 | 12 | ## Favorite articles 13 | 14 | Marking an article as favorite puts it in the « Favorite » category, making it easier to find it. 15 | -------------------------------------------------------------------------------- /content/user/articles/annotations.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Annotations 3 | weight: 4 4 | --- 5 | 6 | In each saved article you read, you can write annotations. It's easier to 7 | understand with some pictures. 8 | 9 | Select the part of the article that you want to annotate and click on 10 | the pencil: 11 | 12 | ![Select your text](../../../img/user/annotations_1.png) 13 | 14 | Then, write your annotation: 15 | 16 | ![Write your annotation](../../../img/user/annotations_2.png) 17 | 18 | The text is now highlighted and you can read your annotation if you move 19 | the mouse cursor over it. 20 | 21 | ![Read your annotation](../../../img/user/annotations_3.png) 22 | 23 | You can create as many annotations as you wish. 24 | Note that the annotation is visible when you read the article from wallabag, not when you browse the original page on the web. 25 | -------------------------------------------------------------------------------- /content/user/articles/download.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Download 3 | weight: 3 4 | --- 5 | 6 | You can download each article in several formats: ePUB, MOBI, PDF, XML, 7 | JSON, CSV. 8 | 9 | {{< callout type="warning" >}} 10 | MOBI export has been deprecated in 2.5.0 and will be removed in 2.6.0. 11 | {{< /callout >}} 12 | 13 | On the article view, click on this icon, in the sidebar: 14 | 15 | ![download article](/img/user/download_article.png) 16 | 17 | You can also download a full category (unread, starred, archive) in 18 | these formats. For example, on **Unread** view, click on this icon in 19 | the top bar: 20 | 21 | ![download articles](/img/user/download_articles.png) 22 | -------------------------------------------------------------------------------- /content/user/articles/restricted.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Restricted access 3 | weight: 5 4 | --- 5 | 6 | wallabag has a system to get articles behind a paywall, by providing your credentials when the article is fetched. 7 | 8 | In version 2.2, only the administrator could put his credentials in a config file, making the feature accessible to all users of the instance. With 2.3, all users have a panel to enter their own credentials. 9 | 10 | ## List of compatible websites 11 | 12 | | Name | Available from version | 13 | | ------|-------- | 14 | | Alternatives Economiques | 2.3 | 15 | | Arrêt sur Images | 2.2 | 16 | | Canard PC | 2.3 | 17 | | Courrier International | 2.3 | 18 | | GameKult | 2.3 | 19 | | Le Figaro | 2.3 | 20 | | Le Monde | 2.3 | 21 | | Le Monde Diplomatique | 2.3 | 22 | | Le Point | 2.3 | 23 | | LWN.net | 2.3 | 24 | | Mediapart | 2.2 | 25 | | Next INpact | 2.2 | 26 | | Reflets.info | 2.3 | 27 | | The Economist | 2.3 | 28 | 29 | 30 | ## Enable paywall authentication 31 | 32 | In internal settings, as a wallabag administrator, in the **Article** section, enable authentication for websites with paywall (with the value `1`). 33 | 34 | ![Enable paywall authentication](../../../img/user/paywall_auth.png) 35 | 36 | ## Manage your site credentials 37 | 38 | Once enable, you'll see a new item in the top-right menu: **Site Credentials**. 39 | 40 | Click on it to go to the management of your site credentials. You'll be able to add many login / password. 41 | 42 | {{< callout type="info" >}} 43 | These information will only be accessible by **YOU** and no other users on the wallabag instance. 44 | {{< /callout >}} 45 | 46 | ## Security 47 | 48 | Login and password you'll set will be encrypted in the database which means the database administrator won't be able to read your credentials. _However_, the server administrator might have access (if it retrieves the encryption key and then manually decode your credentials). 49 | 50 | If you need more technical information, we are using [that scenario](https://github.com/defuse/php-encryption/blob/master/docs/Tutorial.md#scenario-1-keep-data-secret-from-the-database-administrator) to protect your information. 51 | 52 | ## Paywall availability 53 | 54 | If a website with a paywall isn't available you can try to build a config for it. 55 | 56 | See the [developer section]({{< relref "../../developer/paywall.md" >}}) about that. 57 | -------------------------------------------------------------------------------- /content/user/articles/save.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Save 3 | weight: 1 4 | --- 5 | 6 | The main purpose of wallabag is to save web articles. You have many ways 7 | to do it. If you think that the article is wrongly displayed, 8 | [you can read this documentation]({{}}). 9 | 10 | ## By using a bookmarklet 11 | 12 | There is the `How-to` page. You can find this page as entry in the top 13 | right menu named `Your Account`. There you have got a `Add Link` tab. 14 | Almost at the bottom you can find the `bag it!` link. Drag and drop this 15 | link to your bookmarks bar of your browser. 16 | 17 | Now, each time you're reading an article on the web and you want to save 18 | it, click on the `bag it!` link in your bookmarks bar. The article is 19 | saved. 20 | 21 | ## By using the classic form 22 | 23 | In the top bar of your screen, you have 3 icons. With the first one, a 24 | plus sign, you can easily save a new article. 25 | 26 | ![Top bar](../../../img/user/topbar.png) 27 | 28 | Click on it to display a new field, paste the article URL inside and 29 | press your `Return` key. The article is saved. 30 | 31 | ## By using a browser add-on 32 | 33 | ### Firefox 34 | 35 | You can download the [Firefox addon 36 | here](https://addons.mozilla.org/firefox/addon/wallabagger/). 37 | 38 | ### Chrome 39 | 40 | You can download the [Chrome addon 41 | here](https://chrome.google.com/webstore/detail/wallabagger/gbmgphmejlcoihgedabhgjdkcahacjlj?hl=fr). 42 | 43 | ### How to use our addon 44 | 45 | wallabagger is a browser extension to add pages to wallabag, with the ability to: 46 | 47 | - save current page 48 | - edit title 49 | - add (with autocomplete!) and remove tags 50 | - set starred and archived 51 | - delete 52 | 53 | #### Options 54 | 55 | First of all you have to create a new client on your wallabag installation. How to do that is described in that part of the [documentation]({{< relref "/developer/api/oauth/#creating-a-new-api-client" >}}). 56 | 57 | What we need from that client is two strings: Client ID and Client secret. 58 | 59 | ![Client](../../../img/user/wallabagger/opt-client.png) 60 | 61 | ##### Access options page 62 | 63 | After the installation of Wallabagger extension you can setup it by going to the options page. This page is accessible by 64 | 65 | - Right click on extension icon and choose menu "options" 66 | 67 | ![Menu](../../../img/user/wallabagger/opt-menu.png) 68 | 69 | - Go to your Chromium-based browser [extension setup page](chrome://extensions), and click on the "options" link in the Wallabagger section 70 | 71 | ![extensions](../../../img/user/wallabagger/opt-ext-optlink.png) 72 | 73 | ##### Setup process 74 | 75 | - Enter the URL of your wallabag installation (without "http://" ), check "https" if you use that, and click "Check URL" button 76 | 77 | ![URL](../../../img/user/wallabagger/opt-url.png) 78 | 79 | if the URL is valid then in checklist in the bottom of page will be information about that. 80 | 81 | ![checklist](../../../img/user/wallabagger/opt-checklist.png) 82 | 83 | - If the URL was checked and a correct api is found, then the client and user credential fields appears. Fill them and click the "Get token" button. From now access token will be fetched authomatically, when it expires. 84 | 85 | ![Client fields](../../../img/user/wallabagger/opt-clientfields.png) 86 | 87 | if the credentials are correct you'll see it in the checklist with an information about that. 88 | 89 | ![Token granted](../../../img/user/wallabagger/opt-granted.png) 90 | 91 | - If you have tags including spaces, check appropriate options. This will toggle the ending tag key from Space to Enter 92 | 93 | ![Space in tags](../../../img/user/wallabagger/opt-spaceintags.png) 94 | 95 | ##### Security warning 96 | 97 | In this version of the extension your password is stored in the browser local storage as a plain text and could be retrieved by anyone with access to your computer. The password encryption will be implemented in future versions. 98 | 99 | #### Usage 100 | 101 | ##### Saving article 102 | 103 | After installation and successful setup you can add articles to wallabag by clicking on the Wallabagger extension icon 104 | 105 | ![icon](../../../img/user/wallabagger/use-icon.png) 106 | 107 | wait a couple of seconds 108 | 109 | ![Saving](../../../img/user/wallabagger/use-saving.png) 110 | 111 | (There also may be message "Obtaining wallabag api token" if the application token is expired (once in two weeks)) 112 | If something goes wrong, an error message appears: 113 | 114 | ![Error](../../../img/user/wallabagger/use-error.png) 115 | 116 | In that case, check your options. 117 | 118 | If there was no errors, main window with saved article appears. Note: if the article from this URL was already saved, this article will appear with its tags, title, and flags (starred, archived). 119 | 120 | ![Article](../../../img/user/wallabagger/use-article.png) 121 | 122 | ##### Article window 123 | 124 | The article window consists from: 125 | 126 | - the article picture 127 | - the title - clicking it opens article in the wallabag interface 128 | 129 | ![Title](../../../img/user/wallabagger/use-title.png) 130 | 131 | - domain name - clicking it opens source article 132 | 133 | ![Domain](../../../img/user/wallabagger/use-domain.png) 134 | 135 | - icons: 136 | - edit title icon ![Edit icon](../../../img/user/wallabagger/use-editicon.png) clicking it opens dialog to edit the title 137 | 138 | ![Edit title](../../../img/user/wallabagger/use-edittitle.png) 139 | 140 | - set archived and starred flags icons ![Flags icons](../../../img/user/wallabagger/use-flagsicons.png) These icons change its appearance when the flags are set ![Flags is set](../../../img/user/wallabagger/use-flagsset.png) 141 | - delete article icon ![Delete icon](../../../img/user/wallabagger/use-deleteicon.png) clicking it opens a confirmation dialog to make sure you want to delete your article 142 | 143 | ![Delete dialog](../../../img/user/wallabagger/use-deletedialog.png) 144 | 145 | - tags area: article tags with input field for adding new tags 146 | 147 | ![Tags area](../../../img/user/wallabagger/use-tagsarea.png) 148 | 149 | ##### Working with tags 150 | 151 | Tags applied to the article appear in the tags area before the input field. You can remove a tag from an article by clicking on the cross symbol next to the tag. 152 | 153 | ![Article tags](../../../img/user/wallabagger/use-articletags.png) 154 | 155 | When you type the name of a new tag in the input field, after three letters, Wallabagger begins to search in existing tags. Found tags appear on the bottom of the input field. You can add them by clicking on them or by pressing the right arrow key. 156 | 157 | ![Found tag](../../../img/user/wallabagger/use-foundtag.png) 158 | 159 | You can add typed in input field tag by pressing ",", ";" or the Space key (if you didn't checked the option "Use space in tags" inside the extension settings) or the Enter key (if you checked the option) 160 | 161 | ## By using your smartphone 162 | 163 | Check the [dedicated page]({{< relref "../../apps/" >}}) for the mobile apps. 164 | -------------------------------------------------------------------------------- /content/user/articles/share.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Share 3 | weight: 2 4 | --- 5 | 6 | When you're reading an article, you can share it. Just click on the 7 | share button: 8 | 9 | ![share article](../../../img/user/share.png) 10 | 11 | Now, you can share the article: 12 | 13 | - with a public URL (you'll have a light view of the article) 14 | - with a tweet 15 | - into your Shaarli 16 | - with a post in Diaspora* 17 | - with an email 18 | - to Unmark.it 19 | -------------------------------------------------------------------------------- /content/user/configuration/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Configuration 3 | weight: 3 4 | --- 5 | 6 | The config menu will let you change several settings about your account. 7 | 8 | ![Config](../../img/user/wallabag_configuration.png) 9 | 10 | On this page you can see several tabs: 11 | 12 | * [Settings]({{< relref "settings.md" >}}) 13 | * [Feeds]({{< relref "rss.md" >}}) 14 | * [User information]({{< relref "user_information.md" >}}) 15 | * [Password]({{< relref "password.md" >}}) 16 | * [Tagging rules]({{< relref "tagging_rules.md" >}}) 17 | * _Ignore origin rules (doc missing)_ 18 | -------------------------------------------------------------------------------- /content/user/configuration/password.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Password 3 | weight: 4 4 | --- 5 | 6 | You can change your password here (8 characters minimum). 7 | -------------------------------------------------------------------------------- /content/user/configuration/rss.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: RSS 3 | weight: 2 4 | --- 5 | 6 | wallabag provides RSS feeds for each article status: unread, starred and 7 | archive. 8 | 9 | Firstly, you need to create a personal token: click on 10 | `Create your token`. It's possible to change your token afterwards by clicking on 11 | `Reset your token`. 12 | 13 | Now you have three links, one for each status: add them into your 14 | favourite RSS reader. 15 | 16 | You can also define how many articles you want in each RSS feed. By default there will be 50 articles in the feed. 17 | 18 | There is also a pagination available for these feeds. You can add 19 | `/2` to jump to the second page. The pagination follow [the 20 | RFC](https://tools.ietf.org/html/rfc5005#page-4) about that, which means 21 | you'll find the `next`, `previous` & `last` page link inside the 22 | `` tag of each RSS feed. 23 | -------------------------------------------------------------------------------- /content/user/configuration/settings.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Settings 3 | weight: 1 4 | --- 5 | 6 | ## Items per page 7 | 8 | You can change the number of articles displayed on each page. The default is 12 articles per page. 9 | 10 | ## Reading speed 11 | 12 | wallabag calculates a reading time for each article. You can define 13 | here, through this list, if you are a fast or a slow reader. wallabag 14 | will recalculate the reading time for each article. 15 | 16 | ## Redirection 17 | 18 | Where do you want to be redirected to after marking an article as read? 19 | 20 | Each time you'll do some actions (_after marking an article as 21 | read/favorite, after deleting an article, after removing a tag from an 22 | entry_), you will be redirected whether: 23 | 24 | - To the homepage 25 | - To the current page 26 | 27 | ## Language 28 | 29 | You can change the language of wallabag interface. 30 | -------------------------------------------------------------------------------- /content/user/configuration/tagging_rules.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tagging rules 3 | weight: 5 4 | --- 5 | 6 | If you want to automatically assign a tag to new articles, this part of 7 | the configuration is for you. 8 | 9 | ## What are tagging rules? 10 | 11 | These are rules used by wallabag to automatically tag new entries. Each time a 12 | new entry is added, all the tagging rules will be processed to add the tags 13 | that would match, thus saving you the trouble of manually classifying your 14 | entries. 15 | 16 | ## How to use them? 17 | 18 | Let assume you want to tag new entries as *« short reading »* when the 19 | reading time is 3 minutes or less. In that case, you would put 20 | `readingTime <= 3` in the **Rule** field and `short reading` in 21 | the **Tags** field. 22 | 23 | You can add several tags using a given rule by separating 24 | them with a comma, e.g. `short reading, must read`. 25 | 26 | Several operators are available in order to build more complex rules. For 27 | example if you want to tag any article from `www.php.net` that has a reading time 28 | of 5 minutes or more, you could use the rule `readingTime >= 5 AND domainName = 29 | "www.php.net"`. 30 | 31 | The variables and operators available for the tagging rules are listed below. 32 | 33 | Please note that text must be quoted, e.g. `language = "en"`. 34 | 35 | ### Available Variables 36 | 37 | Variable | Meaning 38 | ------------- | ------------------- 39 | `title` | Title of the entry 40 | `url` | URL of the entry 41 | `isArchived` | Whether the entry is archived or not 42 | `isStarred` | Whether the entry is starred or not 43 | `content` | The entry's content 44 | `language` | The entry's language 45 | `mimetype` | The entry's mime-type 46 | `readingTime` | The estimated entry's reading time, in minutes 47 | `domainName` | The domain name of the entry 48 | 49 | ### Available Operators 50 | 51 | Operator | Meaning 52 | ------------ | ------------- 53 | `<=` | Less than or equal to… 54 | `<` | Less than… 55 | ̀`=>` | Greater than or equal to… 56 | `>` | Greater than… 57 | `=` | Equal to… 58 | `!=` | Not equal to… 59 | `OR` | One rule or another 60 | `AND` | One rule and another 61 | `matches` | Tests that a subject is matching a pattern (_case-insensitive_), e.g. `title matches "football"` 62 | `notmatches` | Tests that a subject is not matching a pattern (_case-insensitive_), e.g. `title notmatches "football"` 63 | -------------------------------------------------------------------------------- /content/user/configuration/user_information.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: User information 3 | weight: 3 4 | --- 5 | 6 | On this page you can change your name, your email address and enable two-factor 7 | authentication. 8 | 9 | If the wallabag instance has more than one enabled user, you can delete 10 | your account here. **Take care, we delete all your data**. 11 | 12 | ## Two factor authentication (2FA) 13 | 14 | {{< callout type="warning" >}} 15 | **For administrators**: enabling 2FA from the configuration interface is only 16 | possible if it has been authorized before in `app/config/parameters.yml` 17 | by setting the `twofactor_auth` parameter to `true` (do not forget to run 18 | `php bin/console cache:clear --env=prod` after modification). 19 | {{< /callout >}} 20 | 21 | Two-factor authentication (_also known as 2FA, MFA or multi-factor 22 | authentication_) is a security measure that strengthens identification of users 23 | by a combination of different components. 24 | 25 | On wallabag you can either use one-time code sent by email or one-time codes 26 | generated by an OTP app (_e.g. Google Authenticator, Aegie, FreeOTP_). 27 | 28 | {{< callout type="info" >}} 29 | We strongly recommend to prefer the use of an OTP app than the one-time code sent by email. 30 | {{< /callout >}} 31 | 32 | Once 2FA is enabled on your account, each time you want to login to wallabag, 33 | you'll be required to enter a one-time code after submitting your password. You 34 | have to put this code on the following form. 35 | 36 | ![Two factor authentication](../../../img/user/2FA_form.png) 37 | 38 | If you don't want to receive a code each time you want to login, you can 39 | check the `I'm on a trusted computer` checkbox: wallabag will remember 40 | you for 15 days. 41 | 42 | ### Enable 2FA using OTP app 43 | 44 | Once you click on _Use OTP_ wallabag will show the configuration page for OTP app. 45 | 46 | ![2FA configuration](../../../img/user/wallabag_config_2fa_otp.png) 47 | 48 | Then you should scan the image using your OTP app. If the image is not shown or 49 | if you can't scan it, you can enter the secret printed below the image. 50 | 51 | wallabag will also give you a list of backup codes, you must save them in case 52 | you lose access to your OTP app. 53 | 54 | You will be prompted to enter a one-time code to validate the activation of 2FA. 55 | -------------------------------------------------------------------------------- /content/user/create_account.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Create an account 3 | weight: 1 4 | --- 5 | 6 | ## Register 7 | 8 | On the login page, click on `Register` button. 9 | 10 | ![Registration form](../../img/user/registration_form.png) 11 | 12 | You have to fill the form. Please be sure to type a valid email address, 13 | we'll send you an activation email. 14 | 15 | ![Email was sent to activate account](../../img/user/sent_email.png) 16 | 17 | Check your inbox, you now have a new mail with a link like this 18 | `http://wallabag/register/confirm/Ba19wokGovN-DdBQNfg4YgRkUQWRP4-k2g0Bk-hBTX4`. 19 | Click on it to activate your account. 20 | 21 | Your account is now activated. 22 | 23 | ![Welcome on board!](../../img/user/activated_account.png) 24 | 25 | ## Login 26 | 27 | Your account is now enabled, congratulations! 28 | 29 | To login to wallabag, fill the form on login page. 30 | 31 | If you are on your personal computer and you want to stay connected, you 32 | can check the `Keep me logged in` checkbox: wallabag will remember you 33 | for one year. 34 | 35 | ![Login form](../../img/user/login_form.png) 36 | -------------------------------------------------------------------------------- /content/user/errors_during_fetching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Fetch errors 3 | weight: 3 4 | --- 5 | 6 | ## Why does the fetch of an article fail? 7 | 8 | There may be several reasons: 9 | 10 | - a network problem; 11 | - an issue with the remote server; 12 | - wallabag can't fetch content due to the website structure. 13 | 14 | If wallabag doesn't succeed to fetch an article on the first try, you might want to try again by clicking on _Re-fetch content_ in the lateral bar. (One must note that this button is also useful to re-fetch content when trying new site configs, see below.) 15 | 16 | ![Refetch content](../../img/user/refetch.png) 17 | 18 | ## Check production log for error messages 19 | 20 | By default, if a website can't be fetched because of a request error (a page not found, a timeout, a SSL problem...), the error log message will be displayed in `WALLABAG_DIR/var/logs/prod.log`. 21 | 22 | If you find a line starting with `graby.ERROR` during the timeframe of your test, it means the request failed because of an error. The status code of the error can already give you a hint of the issue: 23 | 24 | - a `404` code means that wallabag couldn't find the article at the given address; 25 | - a `403` code means that access to the page is forbidden (either because of a misconfiguration of the remote server or because the host has taken anti-scraping measures); 26 | - a `500` code might indicate an issue with the remote server or your internet connection; 27 | - `504` or `408` codes could indicate a time-out in the connection with the server. 28 | 29 | If you already tried to re-fetch the content or to solve potential networking issues, please report that error (and the whole text around in the log file) by opening an issue on [GitHub](https://github.com/wallabag/wallabag/issues). 30 | 31 | ## Content is not what I wanted and/or is incomplete 32 | 33 | Wallabag uses two systems working together to try to fetch the content of an article: 34 | 35 | - site configuration files written for each specific domain (often called _site config_, stored in `vendor/j0k3r/graby-site-config`); 36 | - [php-readability](https://github.com/j0k3r/php-readability), which automatically analyzes the content of a web page to determine what is more likely to be the desired content. 37 | 38 | None of these two elements are flawless and we sometimes have to help wallabag a bit! In order to help you efficiently, we will need you to gather some information beforehand, as described below. When required, you could also create (or update) the site configuration file of the website hosting the desired content. 39 | 40 | ### Check with **f43.me** if the issue is reproducible 41 | 42 | The very first thing is to check whether [the website **f43.me**](http://f43.me/feed/test) is able to parse the content or not. The underlying technology of this website is shared with wallabag, so they should have the same flaws. If it works on **f43.me** and not with wallabag, something is breaking wallabag's parser. It is difficult to solve and you should directly [create an issue ticket on Github](https://github.com/wallabag/wallabag/issues/new?assignees=&labels=Site+Config&template=1-fetching-content.md&title=Wrong+display+in+wallabag+%28HOST%29). 43 | 44 | If you are self-hosting an instance of wallabag, you can join to the ticket detailed logs that will be useful to identify the origin of the issue (see below). 45 | 46 | ### Enabling debug logs (self-hosting) 47 | 48 | If the production logs (`var/log/prod.log`) are not helpful, you might want to enable the debugging logs for wallabag's content parser, [graby](https://github.com/j0k3r/graby). These logs are also helpful when you are writing a new site config. 49 | 50 | - edit the `monolog` part in `app/config/config_prod.yml`: 51 | ```yaml 52 | monolog: 53 | handlers: 54 | main: 55 | type: fingers_crossed 56 | action_level: error 57 | handler: nested 58 | channels: ['!graby'] 59 | nested: 60 | type: stream 61 | path: "%kernel.logs_dir%/%kernel.environment%.log" 62 | level: debug 63 | graby: 64 | type: stream 65 | path: "%kernel.logs_dir%/graby.log" 66 | level: info 67 | channels: ['graby'] 68 | console: 69 | type: console 70 | ``` 71 | - empty the cache with the command `rm -rf var/cache/*`; 72 | - reload wallabag in your browser and re-fetch the content. 73 | 74 | More detailed logs will then be available in `var/logs/graby.log`, with most of the steps taken by graby to try and fetch your article. If you can't solve the issue with these logs, paste the file `var/logs/graby.log` in [a new issue on GitHub](https://github.com/wallabag/wallabag/issues/new). 75 | 76 | {{< callout type="info" >}} 77 | It is possible to have **extremely** detailed logs on the modifications made by graby while fetching, parsing and cleaning the HTML code of one article, using `level: debug` instead of `level: info` in the `graby:` section above. 78 | 79 | It is very useful when writing site configuration file (see below); one must note however that all the HTML code is stored in all its intermediary states and that the log file will grow very rapidly. Use with caution :) 80 | {{< /callout >}} 81 | 82 | ### Creation/update of a site configuration file 83 | 84 | Most of the time, issues while fetching the content of an article do not rise from a server error, but from wallabag's parser not being able to determine what is what in a webpage. This can lead to an article missing its title, the body of the article not fetched, missing paragraphs, and so on. 85 | 86 | You can try to fix this problem by creating or updating a site configuration file yourself, so we can be focused on improving wallabag internally instead of writing these files :)! Many (many) examples are available on [fivefilters/ftr-site-config](https://github.com/fivefilters/ftr-site-config), the repository from which wallabag is pulling the configuration files. 87 | 88 | #### Basic site configuration file 89 | 90 | For an article hosted at `https://www.newswebsite.com/xxx/my-article.html`, wallabag will look for the site config `newswebsite.com.txt` in `vendor/j0k3r/graby-site-config`. A basic site configuration file will look like the following: 91 | ``` 92 | # Article's title 93 | title: [XPath] 94 | 95 | # Article's main content 96 | body: [XPath] 97 | 98 | # Parts to strip in the content 99 | strip: [XPath] 100 | 101 | # A test URL, e.g. the article you used to write the file 102 | test_url: https://www.newswebite.com/xxx/my-article.html 103 | ``` 104 | 105 | The `[XPath]` are the specific paths leading to the desired content in the HTML page. Wallabag will be able to follow these paths in order to directly fetch the content, instead of trying to analyze what is what in the page. 106 | 107 | You can find the _XPath_ with [this tool](https://siteconfig.fivefilters.org/): load the content by entering the URL of the article, then select the part(s) of interest in the page. The _XPath_ will be displayed at the bottom of the page. You can also look directly at the source code of the website (`Ctrl`+`U` and/or `F12` on most recent browsers) and determine the _XPath_ with the rules described in the following part. 108 | 109 | Other elements can be specified in the site configuration files (date, authors, stripped elements...), you can check the full extent of the features in [the documentation](https://help.fivefilters.org/full-text-rss/site-patterns.html#pattern-format). 110 | 111 | There is two ways to test and troubleshoot your new site configuration file: 112 | 113 | - you can save the file in `vendor/j0k3r/graby-site-config`, then re-fetch the content like explained above; 114 | - you can test the file on [*f43.me*](https://f43.me/feed/test), clicking on _Want to try a custom siteconfig?_, pasting the content of your file, and clicking on _Test_. Note that you will have additional information in the tab _Debug_. 115 | 116 | When you are happy with your site configuration file, you can create a pull request on the main repository [fivefilters/ftr-site-config](https://github.com/fivefilters/ftr-site-config). (Note: even if you are not familiar with git, it is possible to [create or edit files on Github directly from your browser](https://help.github.com/articles/editing-files-in-another-user-s-repository/)). While your modifications are accepted in this repository, then pulled into wallabag, you can keep your file in `vendor/j0k3r/graby-site-config` (the modifications will be deleted if you update wallabag, though). 117 | 118 | #### Basics of XPath 1.0 119 | 120 | _XPath_ (for _XML Path Language_) is a standardized way to precisely describe the path to an element in a _XML_ document, and consequently in a webpage. These paths are mainly determined by the parent/children relationships of HTML markups/nodes (`
`, ``, `

`, `
`...) and their attributes (`class`, `id`, `src`, `href`...). The norm itself is quite unreadable, but [this part](https://www.w3.org/TR/1999/REC-xpath-19991116/#path-abbrev) is a good overview of what is possible with this "language". 121 | 122 | Some examples being probably more meaningful, we will create a site configuration file for the following webpage: 123 | ```html 124 | 125 | 126 | 127 | 128 | 129 |
130 |
131 |

The website name

132 |
133 |
134 |
135 |
136 |

My article's title

137 |

by John Doe

138 |
139 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

140 | 141 |

Read also: Link to another article

142 | 143 |
One unwanted advertisement.
144 |
145 |
146 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

147 |
148 |
149 |
150 | 155 | 156 | 157 | ``` 158 | 159 | ##### Selection of the title 160 | 161 | The document's title is in the first-level header `

[...]

`. It full _XPath_ is `/html/body/div[2]/article/h1`: starting from the root element `/`, one needs to enter `html`, then `body`, then the second `div`, then `article`, to finally arrive to `h1`. (One must note that the `header` also contains a `h1` corresponding to the website title.) However, these full _XPath_ are too complex to be useful in pages with a lot of intricate elements, so shortcuts can be used. 162 | 163 | The first is `//` that allows to ignore an undefined number of nodes before or between elements: 164 | * `//h1` will select both the title of the website and the title of the article; 165 | * `//div//h1` will also select both titles (`article` and `header` nodes being ignored between the `div` and the `h1`); 166 | * `//article/h1` will select only the `h1` directly embedded in `article`, so the title of the article! 167 | 168 | When possible, it is recommended to use nodes attributes to identify elements. For example, we can here differentiate the `h1` by the fact that one is contained in a `div` with a `class="header"` attribute and the other in a `div` with the `itemprop="articleBody"` attribute: 169 | * `//div[@class="header"]//h1` will select the name of the website; 170 | * `//div[@itemprop="articleBody"]//h1` will select the article's title. 171 | 172 | _Note: in this very simple case, the name of the attributes are different and it would be enough to use `//div[@itemprop]//h1` without specifying the value of the `itemprop` attribute. However, this is less restrictive and could lead to issues in a complex document._ 173 | 174 | Our site configuration file could eventually contain `title: //div[@itemprop="articleBody"]//h1` or `title: //article/h1`. 175 | 176 | ##### Selection of the main content and stripping of undesired elements 177 | 178 | Selection of the body is here very easy, all the content being inside the `article` node. We can consequently put `body: //article` or `body://div[@itemprop="articleBody"]`. 179 | 180 | We would like, however, to strip the node containing advertisements `
[...]
`, and the _Read also..._ link. Fortunately, it is possible to eliminate such content with site configuration files using the `strip: [XPath]` instruction! 181 | 182 | Unfortunately, _XPath_ doesn't allow selection with a partial value of an attribute: paths `//div[@class="ads"]` or `//div[@class="spam"]` would not select the advertisement block! 183 | We could use the `contains()` function to look for a string in the value of the `class` attribute: `//div[contains(@class, "ads")]` or `//div[contains(@class, "spam")]` would work to select the desired `div`. This solution is however far from ideal, as it would also select `div` with classes equals to `pads`, `mads` or `adslkjflkj`... To precisely select a node with an attribute (here `class`) made of a space-separated list, we shall use the following barbaric expression: 184 | 185 | **`//div[contains(concat(' ', normalize-space(@class), ' '), ' string_to_search ')]`** 186 | 187 | Eventually, the site config file could contain indifferently: 188 | ``` 189 | strip: //div[contains(concat(' ', normalize-space(@class), ' '), ' ads ')] 190 | strip: //div[contains(concat(' ', normalize-space(@class), ' '), ' spam ')] 191 | 192 | # Note that this also work! 193 | strip: //div[@class="ads spam"] 194 | ``` 195 | 196 | Finally, we would like to delete the internal links of the website to allow for an easy reading in wallabag. We would like to select the following paragraph: 197 | ```html 198 |

Read also: Link to another article

199 | ``` 200 | 201 | It is not possible here to select the paragraph node with an attribute and we cannot delete every `strong` and `a` (links) of the document! Fortunately, _XPath_ allows for the selection of a node with one or many specific children, with the notation `//node[child]`. 202 | 203 | _Note: one must not confuse `//node[@attribute]` (e.g. `//div[@class="..."]`) and `//node[child]` (e.g. `//p[strong]`). Likewise, one must not mistake `//p/strong`, which selects the `strong` node and its content if it's in a `p`, for `//p[strong]`, which selects a paragraph having at least one `strong` node in it._ 204 | 205 | As many paragraphs can have either a link or a `strong` node in it, we will restrain the path using the `and` operator: `//p[strong and a]` allows for the selection of a paragraph having both elements in it. To restrain even more the selection, we can look into the content of a node with `contains()`. 206 | 207 | The configuration file could eventually contain: 208 | ``` 209 | strip: //p[contains(strong, 'Read') and a] 210 | ``` 211 | 212 | ##### Note on non-standard HTML elements 213 | 214 | When writing your own site configs or changing existing ones, please be aware that any element you want to strip from the code will need to be a **standard** HTML element. The reason for this is that non-standard HTML elements are filtered out **before** the site configuration is applied! 215 | For example, given the following HTML, using the site config below **will not strip out the custom HTML element**! 216 | 217 | ```html 218 |

219 | important text 220 | 221 |

222 | SOME RIDICULOUS AD I WANT TO REMOVE 223 |
224 | 225 | more important text 226 |

227 | ``` 228 | 229 | ``` 230 | #This does NOT work! 231 | strip: //custom-element-in-my-page 232 | ``` 233 | 234 | To fix the problem, you could instead use the following XPath to match the div within the custom element: 235 | 236 | ``` 237 | #This will work! 238 | strip: //div[contains(@class, 'im-an-ad')] 239 | ``` 240 | 241 | #### Useful links 242 | 243 | More information on _XPath_ is available in the text of the norm, particularly the [part on the abbreviated syntax](https://www.w3.org/TR/1999/REC-xpath-19991116/#path-abbrev) which summarize a good number of shortcuts. The website **devhints.io** also have a [very complete cheat-sheet on _XPath_](https://devhints.io/xpath). 244 | 245 | Finally, if you would like to dynamically test an _XPath_ on an existing code, you can use [this sandbox](http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm), where you can upload an XML/HTML code. 246 | 247 | ### Using Wallabagger browser extension 248 | 249 | Sometimes wallabag cannot retrieve the page content because the site requires JavaScript to load the page, or is reloading data, or is generally trying to prevent third-party programs from grabbing data. Here you can try the browser extension 'Wallabagger', available for Firefox, Chrome and Opera. Here you can specify in the settings, that the already interpreted page content is sent to wallabag and not only the link. In many cases you can work very well with it. But sometimes you also need the site configuration, as described above. 250 | 251 | Please also read [this extra](https://kdecherf.com/blog/2023/08/02/fetch-content-from-browser-on-demand-with-wallabagger/) tip from Kdecherf 252 | -------------------------------------------------------------------------------- /content/user/faq.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: FAQ 3 | weight: 4 4 | --- 5 | 6 | You can also check for [common errors]({{< relref "../admin/common_errors.md" >}}) regarding the installation & configuration of your instance. 7 | 8 | ## During the installation, I got the error `Error Output: sh: 1: @post-cmd: not found` 9 | 10 | It seems you have a problem with your `composer` installation. Try to 11 | uninstall and reinstall it. 12 | 13 | [Read the documentation about composer to know how to install 14 | it](https://getcomposer.org/doc/00-intro.md). 15 | 16 | 17 | ## I can't validate the registration form 18 | 19 | Ensure that all fields are properly filled: 20 | 21 | - valid email address 22 | - same passwords in two fields 23 | 24 | 25 | ## I'm not receiving my activation email 26 | 27 | Are you sure your email address was correct? Did you check your spam 28 | folder? 29 | 30 | If you still don't see the activation email, please ensure that you have 31 | installed and properly configured a mail transfer agent. Be sure to 32 | include a firewall rule for SMTP. E.g., if using firewalld: 33 | 34 | firewall-cmd --permanent --add-service=smtp 35 | firewall-cmd --reload 36 | 37 | Lastly, if you have SELinux enabled, set the following rule: 38 | 39 | `setsebool -P httpd_can_sendmail 1` 40 | 41 | 42 | ## When I click on the activation link, I've got this message: `The user with confirmation token does not exist`. 43 | 44 | You already enabled your account or the URL of the activation email is 45 | wrong. 46 | 47 | 48 | ## I forgot my password 49 | 50 | You can reset your password by clicking on `Forgot your password?` link, 51 | on the login page. Then, fill the form with your email address or your 52 | username, you'll receive an email to reset your password. 53 | 54 | 55 | ## I've got the `failed to load external entity` error when I try to install wallabag 56 | 57 | As described [here](https://github.com/wallabag/wallabag/issues/2529), 58 | please edit your `web/app.php` file and add this line: 59 | `libxml_disable_entity_loader(false);` on line 5. 60 | 61 | This is a Doctrine / PHP bug, nothing we can do about it. 62 | 63 | 64 | ## Why has SQLite support been dropped? 65 | 66 | Since June 2017, [SQLite support has been 67 | dropped](https://github.com/wallabag/wallabag/pull/3171) 68 | and MySQL is the default database now. SQLite support has been dropped 69 | because it's awful for database migrations. It's just you'll have to 70 | do migrations the hard way and lose data each time. 71 | 72 | For development purposes, SQLite is still fine though. 73 | 74 | -------------------------------------------------------------------------------- /content/user/filters.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Filters 3 | weight: 5 4 | --- 5 | 6 | To retrieve articles easily, you can use filters. Click on the third 7 | icon in the top bar. 8 | 9 | ![Top bar](../../img/user/topbar.png) 10 | 11 | All these filters can be combined. 12 | 13 | ![Combine all filters](../../img/user/filters.png) 14 | 15 | ## Status 16 | 17 | Use these checkboxes to find archived or starred articles. 18 | 19 | ## Preview picture 20 | 21 | Check this filter if you want to retrieve articles with a preview 22 | picture. 23 | 24 | ## Language 25 | 26 | wallabag (via graby) can detect an article's language. It's easy for you to 27 | retrieve articles written in a specific language. 28 | 29 | ## HTTP status 30 | 31 | You can retrieve the articles by filtering by their HTTP status code: 32 | 200, 404, 500, etc. 33 | 34 | ## Reading time 35 | 36 | wallabag estimates how much time you need to read an article. With this 37 | filter, you can for example find articles with a reading time 38 | between 2 and 5 minutes. 39 | 40 | ## Domain name 41 | 42 | Thanks to this filter, you can retrieve articles from the same 43 | domain name. For example, in this field, type `bbc.co.uk` to retrieve this website's articles. 44 | 45 | ## Creation date 46 | 47 | When you save an article, wallabag stores the current date. You can, for example, retrieve articles written between the 1st and 31st of January. 48 | -------------------------------------------------------------------------------- /content/user/import/Elcurator.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: elCurator 3 | weight: 5 4 | --- 5 | 6 | ## Export your elCurator data 7 | 8 | On the settings 9 | ([https://www.elcurator.net/settings](https://www.elcurator.net/settings)) 10 | page, click on "Prepare my export": you will receive an email once available with a JSON file inside. 11 | 12 | ## Import your data into wallabag 13 | 14 | Click on `Import` link in the menu, on `Import contents` in elCurator 15 | section and then select your json file and upload it. 16 | 17 | Your data will be imported. Data import can be a demanding process for 18 | your server. 19 | -------------------------------------------------------------------------------- /content/user/import/Instapaper.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Instapaper 3 | weight: 2 4 | --- 5 | 6 | ## Export your Instapaper data 7 | 8 | On the settings 9 | ([](https://www.instapaper.com/user)) 10 | page, click on "Download .CSV file" in the "Export" section. A CSV file 11 | will be downloaded (like `instapaper-export.csv`). 12 | 13 | ## Import your data into wallabag 14 | 15 | Click on `Import` link in the menu, on `Import contents` in Instapaper 16 | section and then select your CSV file and upload it. 17 | 18 | Your data will be imported. Data import can be a demanding process for 19 | your server. 20 | -------------------------------------------------------------------------------- /content/user/import/Pinboard.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Pinboard 3 | weight: 4 4 | --- 5 | 6 | ## Export your Pinboard data 7 | 8 | On the backup 9 | ([](https://pinboard.in/settings/backup)) 10 | page, click on "JSON" in the "Bookmarks" section. A JSON file will be 11 | downloaded (like `pinboard_export`). 12 | 13 | ## Import your data into wallabag 14 | 15 | Click on `Import` link in the menu, on `Import contents` in Pinboard 16 | section and then select your json file and upload it. 17 | 18 | Your data will be imported. Data import can be a demanding process for 19 | your server. 20 | -------------------------------------------------------------------------------- /content/user/import/Pocket.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Pocket 3 | weight: 1 4 | --- 5 | 6 | ## Create a new application on Pocket 7 | 8 | To import your data from Pocket, we use the Pocket API. You need to 9 | create a new application on their developer website to continue.[^1] 10 | 11 | - Create a new application [on the developer 12 | website](https://getpocket.com/developer/apps/new) 13 | - Fill in the required fields: application name, application 14 | description, permissions (only **retrieve**), platform (**web**), 15 | accept the terms of service and submit your new application 16 | 17 | Pocket will give you a **Consumer Key** (for example, 18 | 49961-985e4b92fe21fe4c78d682c1). You need to configure the 19 | `pocket_consumer_key` in the `Config` menu. 20 | 21 | Now, all is fine to migrate from Pocket. 22 | 23 | ## Import your data into wallabag 24 | 25 | Click on `Import` link in the menu, on `Import contents` in Pocket 26 | section and then on `Connect to Pocket and import data`. 27 | 28 | You need to authorize wallabag to interact with your Pocket account. 29 | Your data will be imported. Data import can be a demanding process for 30 | your server. 31 | 32 | [^1]: Alternatively, the community [Pocket to Wallabag Converter tool][p2wc] 33 | can convert Pocket exports (ZIP) to CSV for import via Wallabag's 34 | Instapaper option, which does not require setting up the Pocket API. 35 | 36 | [p2wc]: https://benjaminoakes.github.io/pocket-to-wallabag/ 37 | -------------------------------------------------------------------------------- /content/user/import/Readability.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Readability 3 | weight: 3 4 | --- 5 | 6 | ## Export your Readability data 7 | 8 | On the tools 9 | ([](https://www.readability.com/tools/)) 10 | page, click on "Export your data" in the "Data Export" section. You will 11 | receive an email to download a json (which does not end with .json in 12 | fact). 13 | 14 | ## Import your data into wallabag 15 | 16 | Click on `Import` link in the menu, on `Import contents` in Readability 17 | section and then select your json file and upload it. 18 | 19 | Your data will be imported. Data import can be a demanding process for 20 | your server. 21 | -------------------------------------------------------------------------------- /content/user/import/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Import 3 | weight: 6 4 | --- 5 | 6 | In wallabag 2.x, you can import data from: 7 | 8 | - [Pocket]({{< relref "Pocket.md" >}}) 9 | - [Instapaper]({{< relref "Instapaper.md" >}}) 10 | - [Readability]({{< relref "Readability.md" >}}) 11 | - [Pinboard]({{< relref "Pinboard.md" >}}) 12 | - [elCurator]({{< relref "Elcurator.md" >}}) 13 | - [wallabag 1.x]({{< relref "wallabagv1.md" >}}) 14 | - [wallabag 2.x]({{< relref "wallabagv2.md" >}}) 15 | 16 | We also developed [a script to execute migrations via command-line 17 | interface](#import-via-command-line-interface-cli). 18 | 19 | Because imports can take ages, we developed an asynchronous tasks 20 | system. [You can read the documentation here]({{< relref "../../admin/asynchronous.md" >}}) 21 | (for experts). 22 | 23 | ## Import via command-line interface (CLI) 24 | --------------------------------------- 25 | 26 | If you have a CLI access on your web server, you can execute this 27 | command to import your wallabag v1 export: 28 | 29 | ```bash 30 | php bin/console wallabag:import username ~/Downloads/wallabag-export-1-2016-04-05.json --env=prod 31 | ``` 32 | 33 | Please replace values: 34 | 35 | - `username` is the user's username 36 | - `~/Downloads/wallabag-export-1-2016-04-05.json` is the path of your 37 | wallabag v1 export 38 | 39 | If you want to mark all these entries as read, you can add the 40 | `--markAsRead` option. 41 | 42 | To import a wallabag v2 file, you need to add the option 43 | `--importer=v2`. 44 | 45 | If you want to pass the user id of the user instead of it's username, 46 | add the option `--useUserId=true`. 47 | 48 | You'll have this in return: 49 | 50 | ``` 51 | Start : 05-04-2016 11:36:07 --- 52 | 403 imported 53 | 0 already saved 54 | End : 05-04-2016 11:36:09 --- 55 | ``` 56 | -------------------------------------------------------------------------------- /content/user/import/wallabagv1.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: wallabag v1 3 | weight: 7 4 | --- 5 | 6 | If you were using wallabag v1.x, you need to export your data before 7 | migrating to wallabag v2.x, because the application and its database 8 | changed a lot. In your old wallabag installation, you can export your 9 | data, which can be done on the Config page of your old wallabag 10 | installation. 11 | 12 | ![Exporting from wallabag v1](../../../img/user/export_v1.png) 13 | 14 | If you have multiple accounts on the same instance of wallabag, each 15 | user must export from v1 and import into v2 its data. 16 | 17 | If you encounter issues during the export or the import, don't hesitate 18 | to [ask for support](https://gitter.im/wallabag/wallabag). 19 | 20 | When you have retrieved the json file containing your entries, you can 21 | install wallabag v2 if needed by following [the standard 22 | procedure](../../admin/installation/). 23 | 24 | After creating an user account on your new wallabag v2 instance, you 25 | must head over to the Import section and select Import from wallabag v1. 26 | Select your json file and upload it. 27 | 28 | ![Import from wallabag v1](../../../img/user/import_wallabagv1.png) 29 | -------------------------------------------------------------------------------- /content/user/import/wallabagv2.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: wallabag v2 3 | weight: 6 4 | --- 5 | 6 | From the previous wallabag instance on which you were before, go to 7 | All articles, then export these articles as json. 8 | 9 | ![Export depuis wallabag v2](../../../img/user/export_v2.png) 10 | 11 | From your new wallabag instance, create your user account and click on 12 | the link in the menu to proceed to import. Choose import from wallabag 13 | v2 and select your json file to upload it. 14 | 15 | If you encounter issues during the export or the import, don't hesitate 16 | to [ask for support](https://gitter.im/wallabag/wallabag). 17 | -------------------------------------------------------------------------------- /content/user/interface.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Interface 3 | weight: 2 4 | --- 5 | 6 | Congratulations, you're now logged into your new wallabag account. 7 | 8 | ## Homepage 9 | 10 | Here is an overview of the homepage: 11 | 12 | ![Homepage](../../img/user/wallabag_interface_homepage.png) 13 | 14 | Your saved articles will appear on ①, whether in a grid or a list view. 15 | 16 | On the left ② is the menu with the list of unread, starred, archived articles and your tags. 17 | 18 | On the top right ③ is the main toolbar. 19 | 20 | ## Toolbar 21 | 22 | ![Toolbar](../../img/user/wallabag_interface_toolbar.png) 23 | 24 | Buttons on ① and ② are respectively for saving a new url and searching through your saved entries. 25 | 26 | Button ③ is for quickly opening a random saved entry. 27 | 28 | Button ④ is for showing the filter modal. 29 | 30 | Button ⑤ is for downloading articles from the current view. 31 | 32 | Button ⑥ is for showing the account menu. 33 | 34 | ## Filter modal 35 | 36 | ![Filter modal](../../img/user/wallabag_interface_filter.png) 37 | 38 | This modal lets you filter entries using more criterias than the main text search, including: 39 | 40 | - whether articles are unread, starred, archived or contain annotations 41 | - the language of the articles 42 | - the reading time of the articles 43 | - the domain name 44 | - the date when the article has been saved 45 | 46 | Click on the _Filter_ button to validate your criterias. 47 | 48 | ## Account menu 49 | 50 | ![Account Menu](../../img/user/wallabag_interface_account_menu.png) 51 | 52 | Clicking on the avatar button will show you the account menu, which lets you go 53 | to your configuration page, manage your API clients (_e.g. for a mobile app or 54 | wallabagger_) and choose between light and dark themes. 55 | 56 | Go to the dedicated [configuration]({{< relref "configuration/" >}}) doc for more detail about your account settings. 57 | 58 | If you are an administrator of the instance, this menu will also let you manage 59 | users and internal settings. 60 | -------------------------------------------------------------------------------- /content/user/tags.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tags 3 | weight: 7 4 | --- 5 | 6 | Tags are a great way of organizing your saved content in order to more easily access it at a later time. 7 | 8 | ## Adding Tags 9 | 10 | Tags may be added when saving content (e.g. using the Chrome extension Wallabagger) or by opening the content in wallabag and clicking the "Add a Tag" button on the sidebar. 11 | 12 | ## Retrieving Content by Tag 13 | 14 | From the home page, simply click tags on the sidebar in order to access your list of content tags. Click the your tag to access any content which is labeled with it! 15 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/wallabag/doc 2 | 3 | go 1.22.5 4 | 5 | require github.com/imfing/hextra v0.8.3 // indirect 6 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/imfing/hextra v0.8.3 h1:peKCtkOwcVMQV2EqMb/VUhwpYDsI1B14U1rDqAgMHzk= 2 | github.com/imfing/hextra v0.8.3/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI= 3 | -------------------------------------------------------------------------------- /hugo.yaml: -------------------------------------------------------------------------------- 1 | baseURL: https://doc.wallabag.org 2 | title: wallabag documentation 3 | 4 | menu: 5 | main: 6 | - identifier: documentation 7 | name: Documentation 8 | pageRef: / 9 | weight: 1 10 | - name: Search 11 | weight: 2 12 | params: 13 | type: search 14 | - name: GitHub 15 | weight: 3 16 | url: "https://github.com/wallabag" 17 | params: 18 | icon: github 19 | 20 | params: 21 | theme: 22 | default: system 23 | displayToggle: true 24 | 25 | search: 26 | enable: true 27 | type: flexsearch 28 | 29 | flexsearch: 30 | index: content 31 | tokenize: forward 32 | 33 | editURL: 34 | enable: true 35 | base: "https://github.com/wallabag/doc/edit/master/content" 36 | 37 | highlight: 38 | copy: 39 | enable: true 40 | display: hover 41 | 42 | module: 43 | imports: 44 | - path: github.com/imfing/hextra 45 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "public/" 3 | 4 | [build.environment] 5 | HUGO_VERSION = "0.132.1" 6 | GO_VERSION = "1.22.5" 7 | 8 | [context.production] 9 | command = "hugo" 10 | 11 | [context.deploy-preview] 12 | command = "hugo --buildDrafts -e preview -b $DEPLOY_PRIME_URL" 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "gitbook-cli": "^2.3.2" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | # Redirect former language-specific doc 2 | /en/* /:splat 3 | /fr/* /:splat 4 | /de/* /:splat 5 | /it/* /:splat 6 | 7 | # Handle some exceptions from GitBook pages 8 | /admin/installation/readme.html /admin/installation/ 9 | /developer/api/readme.html /developer/api/ 10 | /admin/query-upgrade-21-22.html /admin/query-upgrade-21-22/ 11 | /admin/query-upgrade-22-23.html /admin/query-upgrade-22-23/ 12 | /admin/query-upgrade-23-24.html /admin/query-upgrade-23-24/ 13 | /admin/query-upgrade-25-26.html /admin/query-upgrade-25-26/ 14 | 15 | # Redirect default Netlify subdomain to primary domain 16 | https://wallabag-doc.netlify.com/* https://doc.wallabag.org/:splat 301! 17 | -------------------------------------------------------------------------------- /static/img/admin/id_piwik.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/admin/id_piwik.png -------------------------------------------------------------------------------- /static/img/user/2FA_form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/2FA_form.png -------------------------------------------------------------------------------- /static/img/user/activated_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/activated_account.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_connection_test.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_connection_test.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_connection_test.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_connection_test.en.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_connection_test_success.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_connection_test_success.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_connection_test_success.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_connection_test_success.en.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_feed_credentials_automatically_filled_in.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_feed_credentials_automatically_filled_in.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_filled_in.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_filled_in.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_filled_in.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_filled_in.en.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_get_feed_credentials.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_get_feed_credentials.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_get_feed_credentials.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_get_feed_credentials.en.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_saved_feed_update.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_saved_feed_update.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_saved_feed_update.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_saved_feed_update.en.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_screen.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_screen.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_screen.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_screen.en.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_scroll_bottom.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_scroll_bottom.de.png -------------------------------------------------------------------------------- /static/img/user/android_configuration_scroll_bottom.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_configuration_scroll_bottom.en.png -------------------------------------------------------------------------------- /static/img/user/android_unread_feed_synced.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_unread_feed_synced.de.png -------------------------------------------------------------------------------- /static/img/user/android_unread_feed_synced.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_unread_feed_synced.en.png -------------------------------------------------------------------------------- /static/img/user/android_welcome_screen.de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_welcome_screen.de.png -------------------------------------------------------------------------------- /static/img/user/android_welcome_screen.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/android_welcome_screen.en.png -------------------------------------------------------------------------------- /static/img/user/annotations_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/annotations_1.png -------------------------------------------------------------------------------- /static/img/user/annotations_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/annotations_2.png -------------------------------------------------------------------------------- /static/img/user/annotations_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/annotations_3.png -------------------------------------------------------------------------------- /static/img/user/browser_api_management.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/browser_api_management.en.png -------------------------------------------------------------------------------- /static/img/user/browser_client_description.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/browser_client_description.en.png -------------------------------------------------------------------------------- /static/img/user/browser_client_secret.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/browser_client_secret.en.png -------------------------------------------------------------------------------- /static/img/user/download_article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/download_article.png -------------------------------------------------------------------------------- /static/img/user/download_articles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/download_articles.png -------------------------------------------------------------------------------- /static/img/user/export_v1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/export_v1.png -------------------------------------------------------------------------------- /static/img/user/export_v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/export_v2.png -------------------------------------------------------------------------------- /static/img/user/export_wllbg_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/export_wllbg_1.png -------------------------------------------------------------------------------- /static/img/user/export_wllbg_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/export_wllbg_2.png -------------------------------------------------------------------------------- /static/img/user/filters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/filters.png -------------------------------------------------------------------------------- /static/img/user/import_wallabagv1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/import_wallabagv1.png -------------------------------------------------------------------------------- /static/img/user/import_wllbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/import_wllbg.png -------------------------------------------------------------------------------- /static/img/user/ios_client_secret.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/ios_client_secret.en.png -------------------------------------------------------------------------------- /static/img/user/ios_credentials.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/ios_credentials.en.png -------------------------------------------------------------------------------- /static/img/user/ios_main_app.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/ios_main_app.en.png -------------------------------------------------------------------------------- /static/img/user/ios_wallabag_address.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/ios_wallabag_address.en.png -------------------------------------------------------------------------------- /static/img/user/ios_welcome.en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/ios_welcome.en.png -------------------------------------------------------------------------------- /static/img/user/login_form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/login_form.png -------------------------------------------------------------------------------- /static/img/user/paywall_auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/paywall_auth.png -------------------------------------------------------------------------------- /static/img/user/refetch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/refetch.png -------------------------------------------------------------------------------- /static/img/user/registration_form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/registration_form.png -------------------------------------------------------------------------------- /static/img/user/rename-tags.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/rename-tags.gif -------------------------------------------------------------------------------- /static/img/user/sent_email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/sent_email.png -------------------------------------------------------------------------------- /static/img/user/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/share.png -------------------------------------------------------------------------------- /static/img/user/topbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/topbar.png -------------------------------------------------------------------------------- /static/img/user/wallabag_config_2fa_otp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabag_config_2fa_otp.png -------------------------------------------------------------------------------- /static/img/user/wallabag_configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabag_configuration.png -------------------------------------------------------------------------------- /static/img/user/wallabag_interface_account_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabag_interface_account_menu.png -------------------------------------------------------------------------------- /static/img/user/wallabag_interface_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabag_interface_filter.png -------------------------------------------------------------------------------- /static/img/user/wallabag_interface_homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabag_interface_homepage.png -------------------------------------------------------------------------------- /static/img/user/wallabag_interface_toolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabag_interface_toolbar.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-checklist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-checklist.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-client.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-clientfields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-clientfields.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-ext-optlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-ext-optlink.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-granted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-granted.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-menu.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-spaceintags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-spaceintags.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/opt-url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/opt-url.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-article.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-articletags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-articletags.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-deletedialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-deletedialog.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-deleteicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-deleteicon.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-domain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-domain.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-editicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-editicon.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-edittitle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-edittitle.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-error.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-flagsicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-flagsicons.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-flagsset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-flagsset.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-foundtag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-foundtag.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-icon.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-icons.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-saving.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-saving.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-tagsarea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-tagsarea.png -------------------------------------------------------------------------------- /static/img/user/wallabagger/use-title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/user/wallabagger/use-title.png -------------------------------------------------------------------------------- /static/img/wallabag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wallabag/doc/a9cedfb5687c822834d4e4a5221157646351e768/static/img/wallabag.png --------------------------------------------------------------------------------