Explorar el Código

Merge branch 'stretch' of https://github.com/bashrc/freedombone

Bob Mottram hace 6 años
padre
commit
26b237f09c

+ 29
- 0
doc/EN/app_smolrss.org Ver fichero

@@ -0,0 +1,29 @@
1
+#+TITLE:
2
+#+AUTHOR: Bob Mottram
3
+#+EMAIL: bob@freedombone.net
4
+#+KEYWORDS: freedombone, smolrss, rss
5
+#+DESCRIPTION: How to use Smol RSS
6
+#+OPTIONS: ^:nil toc:nil
7
+#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="freedombone.css" />
8
+
9
+#+attr_html: :width 80% :height 10% :align center
10
+[[file:images/logo.png]]
11
+
12
+* Smol RSS
13
+This is an extremely simple RSS reader which is available only from an onion address, so that you have /the right to read/. There is very little code and so not much attack surface, and it will scale to screens of any size. This should be a better reading experience on mobile than with [[./app_ttrss.html][tt-rss]].
14
+
15
+A disadvantage is that you can only add or remove feeds via the Freedombone administrator control panel, so this isn't suitable for multi-user environments. But once you have your feeds set up it's trivial to use, and unless you publish the onion address confidentiality should be maintained.
16
+
17
+* Installation
18
+
19
+ssh into the system with:
20
+
21
+#+BEGIN_SRC bash
22
+ssh myusername@mydomain.com -p 2222
23
+#+END_SRC
24
+
25
+Select *Administrator controls* then *Add/Remove Apps* then *smolrss*.
26
+
27
+After installation within *Administrator controls* go to *App settings* then *smolrss*. You can then add some feeds or edit the existing feed list. There are a few default feeds as an example.
28
+
29
+Within *Administrator controls* go to *About this system* and select *smolrss*. You will then have the onion address. Navigate to your reader in a Tor compatible browser. You may need to allow the site within NoScript. Then select a feed from the list and begin reading. That's all there is to it.

+ 7
- 3
doc/EN/apps.org Ver fichero

@@ -163,14 +163,18 @@ A non-federated chat server (x86 systems only).
163 163
 A metasearch engine for customised and private web searches.
164 164
 
165 165
 [[./app_searx.html][How to use it]]
166
-* tt-rss
167
-Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "/the right to read/" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
166
+* Smol RSS
167
+A very minimal RSS reader.
168 168
 
169
-[[./app_rss.html][How to use it]]
169
+[[./app_smolrss.html][How to use it]]
170 170
 * Syncthing
171 171
 Possibly the best way to synchronise files across all of your devices. Once it has been set up it "just works" with no user intervention needed.
172 172
 
173 173
 [[./app_syncthing.html][How to use it]]
174
+* tt-rss
175
+Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "/the right to read/" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
176
+
177
+[[./app_rss.html][How to use it]]
174 178
 * Tahoe-LAFS
175 179
 Robust and encrypted storage of files on one or more server.
176 180
 

+ 1
- 1
src/freedombone-app-matrix Ver fichero

@@ -48,7 +48,7 @@ MATRIX_PORT=8009
48 48
 MATRIX_FEDERATION_ONION_PORT=8111
49 49
 MATRIX_ONION_PORT=8109
50 50
 MATRIX_REPO="https://github.com/matrix-org/synapse"
51
-MATRIX_COMMIT='ddb00efc1ddec646d02e8def6053003f04d077d7'
51
+MATRIX_COMMIT='ab5e888927e6a38190a65e10af7acf67873124e3'
52 52
 REPORT_STATS="no"
53 53
 MATRIX_SECRET=
54 54
 MATRIX_EXPIRE_MONTHS=1

+ 1
- 1
src/freedombone-app-pleroma Ver fichero

@@ -36,7 +36,7 @@ PLEROMA_CODE=
36 36
 PLEROMA_PORT=4000
37 37
 PLEROMA_ONION_PORT=8011
38 38
 PLEROMA_REPO="https://git.pleroma.social/pleroma/pleroma.git"
39
-PLEROMA_COMMIT='762f6edc29a7a48e3a663e9bedec58e0036ff363'
39
+PLEROMA_COMMIT='1d4bbec6b3239bb83b500a6a90e6686cb682cfac'
40 40
 PLEROMA_ADMIN_PASSWORD=
41 41
 PLEROMA_DIR=/etc/pleroma
42 42
 PLEROMA_SECRET_KEY=""

+ 409
- 0
src/freedombone-app-smolrss Ver fichero

@@ -0,0 +1,409 @@
1
+#!/bin/bash
2
+#
3
+#  _____               _           _
4
+# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
5
+# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
6
+# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
7
+#
8
+#                              Freedom in the Cloud
9
+#
10
+# License
11
+# =======
12
+#
13
+# Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
14
+#
15
+# This program is free software: you can redistribute it and/or modify
16
+# it under the terms of the GNU Affero General Public License as published by
17
+# the Free Software Foundation, either version 3 of the License, or
18
+# (at your option) any later version.
19
+#
20
+# This program is distributed in the hope that it will be useful,
21
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
+# GNU Affero General Public License for more details.
24
+#
25
+# You should have received a copy of the GNU Affero General Public License
26
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
27
+
28
+VARIANTS='full full-vim'
29
+
30
+IN_DEFAULT_INSTALL=0
31
+SHOW_ON_ABOUT=1
32
+SHOW_ICANN_ADDRESS_ON_ABOUT=0
33
+
34
+SMOLRSS_DOMAIN_NAME=
35
+SMOLRSS_CODE=
36
+SMOLRSS_ONION_PORT=8751
37
+SMOLRSS_REPO="https://github.com/bashrc/smolrss"
38
+SMOLRSS_COMMIT='d9fca3fd76b95c601553a1264ff500c287211105'
39
+
40
+smolrss_variables=(ONION_ONLY
41
+                   SMOLRSS_DOMAIN_NAME
42
+                   SMOLRSS_CODE
43
+                   DDNS_PROVIDER
44
+                   MY_USERNAME)
45
+
46
+function logging_on_smolrss {
47
+    echo -n ''
48
+}
49
+
50
+function logging_off_smolrss {
51
+    echo -n ''
52
+}
53
+
54
+function remove_user_smolrss {
55
+    #remove_username="$1"
56
+    echo -n ''
57
+}
58
+
59
+function add_user_smolrss {
60
+    #new_username="$1"
61
+    #new_user_password="$2"
62
+
63
+    echo '0'
64
+}
65
+
66
+function install_interactive_smolrss {
67
+    echo -n ''
68
+    APP_INSTALLED=1
69
+}
70
+
71
+function change_password_smolrss {
72
+    #curr_username="$1"
73
+    #new_user_password="$2"
74
+    echo -n ''
75
+}
76
+
77
+function reconfigure_smolrss {
78
+    # This is used if you need to switch identity. Dump old keys and generate new ones
79
+    echo -n ''
80
+}
81
+
82
+function smolrss_add_feed {
83
+    data=$(mktemp 2>/dev/null)
84
+    dialog --backtitle $"Smol RSS" \
85
+           --title $"Add an RSS feed" \
86
+           --form "\\n" 8 60 3 \
87
+           $"Title:" 1 1 "" 1 12 40 256 \
88
+           $"Feed URL:" 2 1 "" 2 12 40 10000 \
89
+           2> "$data"
90
+    sel=$?
91
+    case $sel in
92
+        1) rm -f "$data"
93
+           return;;
94
+        255) rm -f "$data"
95
+             return;;
96
+    esac
97
+    title=$(sed -n 1p < "$data")
98
+    url=$(sed -n 2p < "$data")
99
+    rm -f "$data"
100
+
101
+    if [ ! "$title" ]; then
102
+        return
103
+    fi
104
+
105
+    if [ ! "$url" ]; then
106
+        return
107
+    fi
108
+
109
+    if [[ "$url" == *','* ]]; then
110
+        return
111
+    fi
112
+    if [[ "$url" != *'.'* ]]; then
113
+        return
114
+    fi
115
+
116
+    cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || return
117
+
118
+    if grep -q "${title}," feeds.txt; then
119
+        sed -i "s|${title},.*|${title},${url}|g" feeds.txt
120
+    else
121
+        echo "${title},${url}" >> feeds.txt
122
+    fi
123
+
124
+    ./create_feeds feeds.txt > feeds.xml
125
+    chown www-data:www-data feeds.txt
126
+
127
+    dialog --title $"Add an RSS feed" \
128
+           --msgbox $"${title} has been added" 6 70
129
+}
130
+
131
+function smolrss_remove_feed {
132
+    data=$(mktemp 2>/dev/null)
133
+    dialog --title $"Remove an RSS feed" \
134
+           --backtitle $"Smol RSS" \
135
+           --inputbox $"Enter the title of the feed to remove" 8 60 2>"$data"
136
+    sel=$?
137
+    case $sel in
138
+        0)
139
+            title=$(<"$data")
140
+            if [ "$title" ]; then
141
+                cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || return
142
+                if grep -q "${title}," feeds.txt; then
143
+                    sed -i "/${title},/d" feeds.xml
144
+                    ./create_feeds feeds.txt > feeds.xml
145
+                    chown www-data:www-data feeds.txt
146
+                    dialog --title $"Remove an RSS feed" \
147
+                           --msgbox $"${title} has been removed" 6 70
148
+                fi
149
+            fi
150
+            ;;
151
+    esac
152
+    rm -f "$data"
153
+}
154
+
155
+function configure_interactive_smolrss {
156
+    W=(1 $"Add an RSS feed"
157
+       2 $"Remove an RSS feed"
158
+       3 $'Edit all feeds'
159
+       4 $'Light theme'
160
+       5 $'Dark theme')
161
+
162
+    read_config_param SMOLRSS_DOMAIN_NAME
163
+
164
+    while true
165
+    do
166
+
167
+        # shellcheck disable=SC2068
168
+        selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"Smol RSS" --menu $"Choose an operation, or ESC for main menu:" 14 70 5 "${W[@]}" 3>&2 2>&1 1>&3)
169
+
170
+        if [ ! "$selection" ]; then
171
+            break
172
+        fi
173
+        case $selection in
174
+            1) smolrss_add_feed
175
+               ;;
176
+            2) smolrss_remove_feed
177
+               ;;
178
+            3) editor "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs/feeds.txt"
179
+               cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || break
180
+               ./create_feeds feeds.txt > feeds.xml
181
+               chown www-data:www-data feeds.txt
182
+               ;;
183
+            4) cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || break
184
+               cp style.light.css style.css
185
+               chown www-data:www-data style.css
186
+               dialog --title $"Smol RSS theme" \
187
+                      --msgbox $"Switched theme to light" 6 50
188
+               ;;
189
+            5) cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || break
190
+               cp style.dark.css style.css
191
+               chown www-data:www-data style.css
192
+               dialog --title $"Smol RSS theme" \
193
+                      --msgbox $"Switched theme to dark" 6 50
194
+               ;;
195
+        esac
196
+    done
197
+}
198
+
199
+function upgrade_smolrss {
200
+    CURR_SMOLRSS_COMMIT=$(get_completion_param "smolrss commit")
201
+    if [[ "$CURR_SMOLRSS_COMMIT" == "$SMOLRSS_COMMIT" ]]; then
202
+        return
203
+    fi
204
+
205
+    if grep -q "smolrss domain" "$COMPLETION_FILE"; then
206
+        SMOLRSS_DOMAIN_NAME=$(get_completion_param "smolrss domain")
207
+    fi
208
+
209
+    # update to the next commit
210
+    set_repo_commit "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" "smolrss commit" "$SMOLRSS_COMMIT" "$SMOLRSS_REPO"
211
+
212
+    cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || return
213
+    ./create_feeds feeds.txt > feeds.xml
214
+
215
+    chown -R www-data:www-data "/var/www/${SMOLRSS_DOMAIN_NAME}/htdocs"
216
+}
217
+
218
+function backup_local_smolrss {
219
+    SMOLRSS_DOMAIN_NAME='smolrss'
220
+    if grep -q "smolrss domain" "$COMPLETION_FILE"; then
221
+        SMOLRSS_DOMAIN_NAME=$(get_completion_param "smolrss domain")
222
+    fi
223
+
224
+    source_directory=/var/www/${SMOLRSS_DOMAIN_NAME}/htdocs
225
+
226
+    suspend_site "${SMOLRSS_DOMAIN_NAME}"
227
+
228
+    dest_directory=smolrss
229
+    backup_directory_to_usb "$source_directory" $dest_directory
230
+
231
+    restart_site
232
+}
233
+
234
+function restore_local_smolrss {
235
+    if ! grep -q "smolrss domain" "$COMPLETION_FILE"; then
236
+        return
237
+    fi
238
+    SMOLRSS_DOMAIN_NAME=$(get_completion_param "smolrss domain")
239
+    if [ ! "$SMOLRSS_DOMAIN_NAME" ]; then
240
+        return
241
+    fi
242
+    suspend_site "${SMOLRSS_DOMAIN_NAME}"
243
+    temp_restore_dir=/root/tempsmolrss
244
+    smolrss_dir=/var/www/${SMOLRSS_DOMAIN_NAME}/htdocs
245
+
246
+    restore_directory_from_usb $temp_restore_dir smolrss
247
+    if [ -d $temp_restore_dir ]; then
248
+        if [ -d "$temp_restore_dir$smolrss_dir" ]; then
249
+            cp -rp "$temp_restore_dir$smolrss_dir"/* "$smolrss_dir"/
250
+        else
251
+            if [ ! -d "$smolrss_dir" ]; then
252
+                mkdir "$smolrss_dir"
253
+            fi
254
+            cp -rp "$temp_restore_dir"/* "$smolrss_dir"/
255
+        fi
256
+        chown -R www-data:www-data "$smolrss_dir"
257
+        rm -rf $temp_restore_dir
258
+    fi
259
+    restart_site
260
+}
261
+
262
+function backup_remote_smolrss {
263
+    SMOLRSS_DOMAIN_NAME='smolrss'
264
+    if grep -q "smolrss domain" "$COMPLETION_FILE"; then
265
+        SMOLRSS_DOMAIN_NAME=$(get_completion_param "smolrss domain")
266
+    fi
267
+
268
+    source_directory=/var/www/${SMOLRSS_DOMAIN_NAME}/htdocs
269
+
270
+    suspend_site "${SMOLRSS_DOMAIN_NAME}"
271
+
272
+    dest_directory=smolrss
273
+    backup_directory_to_friend "$source_directory" $dest_directory
274
+
275
+    restart_site
276
+}
277
+
278
+function restore_remote_smolrss {
279
+    if ! grep -q "smolrss domain" "$COMPLETION_FILE"; then
280
+        return
281
+    fi
282
+    SMOLRSS_DOMAIN_NAME=$(get_completion_param "smolrss domain")
283
+    if [ ! "$SMOLRSS_DOMAIN_NAME" ]; then
284
+        return
285
+    fi
286
+    suspend_site "${SMOLRSS_DOMAIN_NAME}"
287
+    temp_restore_dir=/root/tempsmolrss
288
+    smolrss_dir=/var/www/${SMOLRSS_DOMAIN_NAME}/htdocs
289
+
290
+    restore_directory_from_friend $temp_restore_dir smolrss
291
+    if [ -d $temp_restore_dir ]; then
292
+        if [ -d "$temp_restore_dir$smolrss_dir" ]; then
293
+            cp -rp "$temp_restore_dir$smolrss_dir"/* "$smolrss_dir"/
294
+        else
295
+            if [ ! -d "$smolrss_dir" ]; then
296
+                mkdir "$smolrss_dir"
297
+            fi
298
+            cp -rp $temp_restore_dir/* "$smolrss_dir"/
299
+        fi
300
+        chown -R www-data:www-data "$smolrss_dir"
301
+        rm -rf $temp_restore_dir
302
+    fi
303
+    restart_site
304
+}
305
+
306
+function remove_smolrss {
307
+    nginx_dissite "$SMOLRSS_DOMAIN_NAME"
308
+    remove_certs "$SMOLRSS_DOMAIN_NAME"
309
+
310
+
311
+    if [ -d "/var/www/$SMOLRSS_DOMAIN_NAME" ]; then
312
+        rm -rf "/var/www/$SMOLRSS_DOMAIN_NAME"
313
+    fi
314
+    if [ -f "/etc/nginx/sites-available/$SMOLRSS_DOMAIN_NAME" ]; then
315
+        rm "/etc/nginx/sites-available/$SMOLRSS_DOMAIN_NAME"
316
+    fi
317
+    remove_onion_service smolrss "${SMOLRSS_ONION_PORT}"
318
+    if grep -q "smolrss" /etc/crontab; then
319
+        sed -i "/smolrss/d" /etc/crontab
320
+    fi
321
+    remove_app smolrss
322
+    remove_completion_param install_smolrss
323
+    sed -i '/smolrss/d' "$COMPLETION_FILE"
324
+
325
+    remove_ddns_domain "$SMOLRSS_DOMAIN_NAME"
326
+}
327
+
328
+function install_smolrss {
329
+    apt-get -yq install php-gettext php-curl php-gd php-mysql git curl
330
+    apt-get -yq install memcached php-memcached php-intl exiftool libfcgi0ldbl
331
+
332
+    SMOLRSS_DOMAIN_NAME='smolrss.local'
333
+
334
+    if [ -d "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" ]; then
335
+        rm -rf "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs"
336
+    fi
337
+    if [ -d /repos/smolrss ]; then
338
+        mkdir "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs"
339
+        cp -r -p /repos/smolrss/. "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs"
340
+        cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || exit 324687356
341
+        git pull
342
+    else
343
+        git_clone "$SMOLRSS_REPO" "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs"
344
+    fi
345
+
346
+    if [ ! -d "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" ]; then
347
+        echo $'Unable to clone smolrss repo'
348
+        exit 87525
349
+    fi
350
+
351
+    cd "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs" || exit 36587356
352
+    git checkout "$SMOLRSS_COMMIT" -b "$SMOLRSS_COMMIT"
353
+    set_completion_param "smolrss commit" "$SMOLRSS_COMMIT"
354
+
355
+    cp feeds.example.txt feeds.txt
356
+    ./create_feeds feeds.txt > feeds.xml
357
+
358
+    chmod g+w "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs"
359
+    chown -R www-data:www-data "/var/www/$SMOLRSS_DOMAIN_NAME/htdocs"
360
+
361
+    add_ddns_domain "$SMOLRSS_DOMAIN_NAME"
362
+
363
+    SMOLRSS_ONION_HOSTNAME=$(add_onion_service smolrss 80 "${SMOLRSS_ONION_PORT}")
364
+
365
+    smolrss_nginx_site=/etc/nginx/sites-available/$SMOLRSS_DOMAIN_NAME
366
+    echo -n '' > "$smolrss_nginx_site"
367
+    { echo 'server {';
368
+      echo "    listen 127.0.0.1:$SMOLRSS_ONION_PORT default_server;";
369
+      echo "    server_name $SMOLRSS_ONION_HOSTNAME;";
370
+      echo ''; } >> "$smolrss_nginx_site"
371
+    nginx_compress "$SMOLRSS_DOMAIN_NAME"
372
+    echo '' >> "$smolrss_nginx_site"
373
+    nginx_security_options "$SMOLRSS_DOMAIN_NAME"
374
+    { echo '';
375
+      echo '    access_log /dev/null;';
376
+      echo '    error_log /dev/null;';
377
+      echo '';
378
+      echo "    root /var/www/$SMOLRSS_DOMAIN_NAME/htdocs;";
379
+      echo '';
380
+      echo '  index index.php;';
381
+      echo '  location ~ \.php {';
382
+      echo '    include snippets/fastcgi-php.conf;';
383
+      echo '    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;';
384
+      echo '    fastcgi_read_timeout 30;';
385
+      echo '    fastcgi_param HTTPS off;';
386
+      echo '  }';
387
+      echo '';
388
+      echo '  # Location';
389
+      echo '  location / {'; } >> "$smolrss_nginx_site"
390
+    nginx_limits "$SMOLRSS_DOMAIN_NAME" '15m'
391
+    { echo "    try_files \$uri \$uri/ index.php?\$args;";
392
+      echo '  }';
393
+      echo '}'; } >> "$smolrss_nginx_site"
394
+
395
+    configure_php
396
+
397
+    nginx_ensite "$SMOLRSS_DOMAIN_NAME"
398
+
399
+    systemctl restart php7.0-fpm
400
+
401
+    systemctl restart nginx
402
+
403
+    "${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a smolrss -p "$SMOLRSS_ADMIN_PASSWORD"
404
+    set_completion_param "smolrss domain" "$SMOLRSS_DOMAIN_NAME"
405
+
406
+    APP_INSTALLED=1
407
+}
408
+
409
+# NOTE: deliberately there is no "exit 0"

+ 1
- 2
src/freedombone-app-xmpp Ver fichero

@@ -644,7 +644,6 @@ function remove_xmpp {
644 644
 
645 645
     function_check remove_onion_service
646 646
     remove_onion_service xmpp 5222 5223 5269
647
-    sed -i '/HiddenServiceVersion 2/d' "$ONION_SERVICES_FILE"
648 647
 
649 648
     apt-mark -q unhold prosody
650 649
     apt-get -yq remove --purge prosody
@@ -1133,7 +1132,7 @@ function install_xmpp {
1133 1132
     fi
1134 1133
     if ! grep -q "hidden_service_xmpp" "$ONION_SERVICES_FILE"; then
1135 1134
         { echo 'HiddenServiceDir /var/lib/tor/hidden_service_xmpp/';
1136
-          echo 'HiddenServiceVersion 2';
1135
+          echo 'HiddenServiceVersion 3';
1137 1136
           echo "HiddenServicePort 5222 127.0.0.1:5222";
1138 1137
           echo "HiddenServicePort 5269 127.0.0.1:5269"; } >> "$ONION_SERVICES_FILE"
1139 1138
         echo $'Added onion site for xmpp chat'

+ 1
- 0
src/freedombone-image-customise Ver fichero

@@ -1997,6 +1997,7 @@ image_preinstall_repos() {
1997 1997
     git clone "$PRIVATEBIN_REPO" "$rootdir/repos/privatebin"
1998 1998
     git clone "$EDITH_REPO" "$rootdir/repos/edith"
1999 1999
     git clone "$BDSMAIL_REPO" "$rootdir/repos/bdsmail"
2000
+    git clone "$SMOLRSS_REPO" "$rootdir/repos/smolrss"
2000 2001
     #git clone "$WEKAN_REPO" "$rootdir/repos/wekan"
2001 2002
     #git clone "$FLOW_ROUTER_REPO" "$rootdir/repos/flowrouter"
2002 2003
     #git clone "$ZERONET_REPO" "$rootdir/repos/zeronet"

+ 10
- 8
src/freedombone-template Ver fichero

@@ -344,22 +344,22 @@ echo '}'
344 344
 if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" || "$database_type" == "postgres"* || "$database_type" == "mongo"* ]]; then
345 345
     echo ''
346 346
     echo "function ${app_name}_create_database {"
347
-    echo "    if [ -f \$IMAGE_PASSWORD_FILE ]; then"
347
+    echo "    if [ -f \"\$IMAGE_PASSWORD_FILE\" ]; then"
348 348
     echo "        ${app_name_upper}_ADMIN_PASSWORD=\"\$(printf \"%d\" \"\$(cat \"$IMAGE_PASSWORD_FILE\")\")\""
349 349
     echo '    else'
350
-    echo "        if [ ! \$${app_name_upper}_ADMIN_PASSWORD ]; then"
351
-    echo "            ${app_name_upper}_ADMIN_PASSWORD=\"\$(create_password \${MINIMUM_PASSWORD_LENGTH})\""
350
+    echo "        if [ ! \"\$${app_name_upper}_ADMIN_PASSWORD\" ]; then"
351
+    echo "            ${app_name_upper}_ADMIN_PASSWORD=\$(create_password \"\${MINIMUM_PASSWORD_LENGTH}\")"
352 352
     echo '        fi'
353 353
     echo '    fi'
354
-    echo "    if [ ! \$${app_name_upper}_ADMIN_PASSWORD ]; then"
354
+    echo "    if [ ! \"\$${app_name_upper}_ADMIN_PASSWORD\" ]; then"
355 355
     echo '        return'
356 356
     echo '    fi'
357 357
     echo ''
358 358
     if [[ "$database_type" = "mysql" || "$database_type" = "mariadb" ]]; then
359
-        echo "    create_database ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \$MY_USERNAME"
359
+        echo "    create_database ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \"\$MY_USERNAME\""
360 360
     fi
361 361
     if [[ "$database_type" = "mongo"* ]]; then
362
-        echo "    create_database_mongodb ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \$MY_USERNAME"
362
+        echo "    create_database_mongodb ${app_name} \"\$${app_name_upper}_ADMIN_PASSWORD\" \"\$MY_USERNAME\""
363 363
     fi
364 364
     if [[ "$database_type" == "postgres"* ]]; then
365 365
         echo '    systemctl restart postgresql'
@@ -1002,8 +1002,10 @@ if [ $app_daemon ]; then
1002 1002
     echo "    systemctl start ${app_name}"
1003 1003
 fi
1004 1004
 if [ $app_webui ]; then
1005
-    echo ''
1006
-    echo "    create_site_certificate \"\$${app_name_upper}_DOMAIN_NAME\" 'yes'"
1005
+    if [ ! $app_onion_only ]; then
1006
+        echo ''
1007
+        echo "    create_site_certificate \"\$${app_name_upper}_DOMAIN_NAME\" 'yes'"
1008
+    fi
1007 1009
     echo ''
1008 1010
     echo "    nginx_ensite \"\$${app_name_upper}_DOMAIN_NAME\""
1009 1011
 fi

+ 219
- 0
website/EN/app_smolrss.html Ver fichero

@@ -0,0 +1,219 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
+<head>
6
+<title></title>
7
+<!-- 2018-05-19 Sat 23:12 -->
8
+<meta  http-equiv="Content-Type" content="text/html;charset=utf-8" />
9
+<meta  name="generator" content="Org-mode" />
10
+<meta  name="author" content="Bob Mottram" />
11
+<meta  name="description" content="How to use Smol RSS"
12
+ />
13
+<meta  name="keywords" content="freedombone, smolrss, rss" />
14
+<style type="text/css">
15
+ <!--/*--><![CDATA[/*><!--*/
16
+  .title  { text-align: center; }
17
+  .todo   { font-family: monospace; color: red; }
18
+  .done   { color: green; }
19
+  .tag    { background-color: #eee; font-family: monospace;
20
+            padding: 2px; font-size: 80%; font-weight: normal; }
21
+  .timestamp { color: #bebebe; }
22
+  .timestamp-kwd { color: #5f9ea0; }
23
+  .right  { margin-left: auto; margin-right: 0px;  text-align: right; }
24
+  .left   { margin-left: 0px;  margin-right: auto; text-align: left; }
25
+  .center { margin-left: auto; margin-right: auto; text-align: center; }
26
+  .underline { text-decoration: underline; }
27
+  #postamble p, #preamble p { font-size: 90%; margin: .2em; }
28
+  p.verse { margin-left: 3%; }
29
+  pre {
30
+    border: 1px solid #ccc;
31
+    box-shadow: 3px 3px 3px #eee;
32
+    padding: 8pt;
33
+    font-family: monospace;
34
+    overflow: auto;
35
+    margin: 1.2em;
36
+  }
37
+  pre.src {
38
+    position: relative;
39
+    overflow: visible;
40
+    padding-top: 1.2em;
41
+  }
42
+  pre.src:before {
43
+    display: none;
44
+    position: absolute;
45
+    background-color: white;
46
+    top: -10px;
47
+    right: 10px;
48
+    padding: 3px;
49
+    border: 1px solid black;
50
+  }
51
+  pre.src:hover:before { display: inline;}
52
+  pre.src-sh:before    { content: 'sh'; }
53
+  pre.src-bash:before  { content: 'sh'; }
54
+  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
55
+  pre.src-R:before     { content: 'R'; }
56
+  pre.src-perl:before  { content: 'Perl'; }
57
+  pre.src-java:before  { content: 'Java'; }
58
+  pre.src-sql:before   { content: 'SQL'; }
59
+
60
+  table { border-collapse:collapse; }
61
+  caption.t-above { caption-side: top; }
62
+  caption.t-bottom { caption-side: bottom; }
63
+  td, th { vertical-align:top;  }
64
+  th.right  { text-align: center;  }
65
+  th.left   { text-align: center;   }
66
+  th.center { text-align: center; }
67
+  td.right  { text-align: right;  }
68
+  td.left   { text-align: left;   }
69
+  td.center { text-align: center; }
70
+  dt { font-weight: bold; }
71
+  .footpara:nth-child(2) { display: inline; }
72
+  .footpara { display: block; }
73
+  .footdef  { margin-bottom: 1em; }
74
+  .figure { padding: 1em; }
75
+  .figure p { text-align: center; }
76
+  .inlinetask {
77
+    padding: 10px;
78
+    border: 2px solid gray;
79
+    margin: 10px;
80
+    background: #ffffcc;
81
+  }
82
+  #org-div-home-and-up
83
+   { text-align: right; font-size: 70%; white-space: nowrap; }
84
+  textarea { overflow-x: auto; }
85
+  .linenr { font-size: smaller }
86
+  .code-highlighted { background-color: #ffff00; }
87
+  .org-info-js_info-navigation { border-style: none; }
88
+  #org-info-js_console-label
89
+    { font-size: 10px; font-weight: bold; white-space: nowrap; }
90
+  .org-info-js_search-highlight
91
+    { background-color: #ffff00; color: #000000; font-weight: bold; }
92
+  /*]]>*/-->
93
+</style>
94
+<link rel="stylesheet" type="text/css" href="freedombone.css" />
95
+<script type="text/javascript">
96
+/*
97
+@licstart  The following is the entire license notice for the
98
+JavaScript code in this tag.
99
+
100
+Copyright (C) 2012-2013 Free Software Foundation, Inc.
101
+
102
+The JavaScript code in this tag is free software: you can
103
+redistribute it and/or modify it under the terms of the GNU
104
+General Public License (GNU GPL) as published by the Free Software
105
+Foundation, either version 3 of the License, or (at your option)
106
+any later version.  The code is distributed WITHOUT ANY WARRANTY;
107
+without even the implied warranty of MERCHANTABILITY or FITNESS
108
+FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
109
+
110
+As additional permission under GNU GPL version 3 section 7, you
111
+may distribute non-source (e.g., minimized or compacted) forms of
112
+that code without the copy of the GNU GPL normally required by
113
+section 4, provided you include this license notice and a URL
114
+through which recipients can access the Corresponding Source.
115
+
116
+
117
+@licend  The above is the entire license notice
118
+for the JavaScript code in this tag.
119
+*/
120
+<!--/*--><![CDATA[/*><!--*/
121
+ function CodeHighlightOn(elem, id)
122
+ {
123
+   var target = document.getElementById(id);
124
+   if(null != target) {
125
+     elem.cacheClassElem = elem.className;
126
+     elem.cacheClassTarget = target.className;
127
+     target.className = "code-highlighted";
128
+     elem.className   = "code-highlighted";
129
+   }
130
+ }
131
+ function CodeHighlightOff(elem, id)
132
+ {
133
+   var target = document.getElementById(id);
134
+   if(elem.cacheClassElem)
135
+     elem.className = elem.cacheClassElem;
136
+   if(elem.cacheClassTarget)
137
+     target.className = elem.cacheClassTarget;
138
+ }
139
+/*]]>*///-->
140
+</script>
141
+</head>
142
+<body>
143
+<div id="preamble" class="status">
144
+<a name="top" id="top"></a>
145
+</div>
146
+<div id="content">
147
+<h1 class="title"></h1>
148
+
149
+<div class="figure">
150
+<p><img src="images/logo.png" alt="logo.png" width="80%" height="10%" align="center" />
151
+</p>
152
+</div>
153
+
154
+<div id="outline-container-sec-1" class="outline-2">
155
+<h2 id="sec-1">Smol RSS</h2>
156
+<div class="outline-text-2" id="text-1">
157
+<p>
158
+This is an extremely simple RSS reader which is available only from an onion address, so that you have <i>the right to read</i>. There is very little code and so not much attack surface, and it will scale to screens of any size. This should be a better reading experience on mobile than with <a href="./app_ttrss.html">tt-rss</a>.
159
+</p>
160
+
161
+<p>
162
+A disadvantage is that you can only add or remove feeds via the Freedombone administrator control panel, so this isn't suitable for multi-user environments. But once you have your feeds set up it's trivial to use, and unless you publish the onion address confidentiality should be maintained.
163
+</p>
164
+</div>
165
+</div>
166
+
167
+<div id="outline-container-sec-2" class="outline-2">
168
+<h2 id="sec-2">Installation</h2>
169
+<div class="outline-text-2" id="text-2">
170
+<p>
171
+ssh into the system with:
172
+</p>
173
+
174
+<div class="org-src-container">
175
+
176
+<pre class="src src-bash">ssh myusername@mydomain.com -p 2222
177
+</pre>
178
+</div>
179
+
180
+<p>
181
+Select <b>Administrator controls</b> then <b>Add/Remove Apps</b> then <b>smolrss</b>.
182
+</p>
183
+
184
+<p>
185
+After installation within <b>Administrator controls</b> go to <b>App settings</b> then <b>smolrss</b>. You can then add some feeds or edit the existing feed list. There are a few default feeds as an example.
186
+</p>
187
+
188
+<p>
189
+Within <b>Administrator controls</b> go to <b>About this system</b> and select <b>smolrss</b>. You will then have the onion address. Navigate to your reader in a Tor compatible browser. You may need to allow the site within NoScript. Then select a feed from the list and begin reading. That's all there is to it.
190
+</p>
191
+</div>
192
+</div>
193
+</div>
194
+<div id="postamble" class="status">
195
+
196
+<style type="text/css">
197
+.back-to-top {
198
+    position: fixed;
199
+    bottom: 2em;
200
+    right: 0px;
201
+    text-decoration: none;
202
+    color: #000000;
203
+    background-color: rgba(235, 235, 235, 0.80);
204
+    font-size: 12px;
205
+    padding: 1em;
206
+    display: none;
207
+}
208
+
209
+.back-to-top:hover {
210
+    background-color: rgba(135, 135, 135, 0.50);
211
+}
212
+</style>
213
+
214
+<div class="back-to-top">
215
+<a href="#top">Back to top</a> | <a href="mailto:bob@freedombone.net">E-mail me</a>
216
+</div>
217
+</div>
218
+</body>
219
+</html>

+ 177
- 256
website/EN/apps.html Ver fichero

@@ -3,33 +3,26 @@
3 3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5 5
 <head>
6
-<!-- 2018-05-16 Wed 15:51 -->
7
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
-<meta name="viewport" content="width=device-width, initial-scale=1" />
9
-<title>&lrm;</title>
10
-<meta name="generator" content="Org mode" />
11
-<meta name="author" content="Bob Mottram" />
12
-<meta name="description" content="List of apps available on freedombone"
6
+<title></title>
7
+<!-- 2018-05-19 Sat 23:02 -->
8
+<meta  http-equiv="Content-Type" content="text/html;charset=utf-8" />
9
+<meta  name="generator" content="Org-mode" />
10
+<meta  name="author" content="Bob Mottram" />
11
+<meta  name="description" content="List of apps available on freedombone"
13 12
  />
14
-<meta name="keywords" content="freedombone, apps" />
13
+<meta  name="keywords" content="freedombone, apps" />
15 14
 <style type="text/css">
16 15
  <!--/*--><![CDATA[/*><!--*/
17
-  .title  { text-align: center;
18
-             margin-bottom: .2em; }
19
-  .subtitle { text-align: center;
20
-              font-size: medium;
21
-              font-weight: bold;
22
-              margin-top:0; }
16
+  .title  { text-align: center; }
23 17
   .todo   { font-family: monospace; color: red; }
24
-  .done   { font-family: monospace; color: green; }
25
-  .priority { font-family: monospace; color: orange; }
18
+  .done   { color: green; }
26 19
   .tag    { background-color: #eee; font-family: monospace;
27 20
             padding: 2px; font-size: 80%; font-weight: normal; }
28 21
   .timestamp { color: #bebebe; }
29 22
   .timestamp-kwd { color: #5f9ea0; }
30
-  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
31
-  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
32
-  .org-center { margin-left: auto; margin-right: auto; text-align: center; }
23
+  .right  { margin-left: auto; margin-right: 0px;  text-align: right; }
24
+  .left   { margin-left: 0px;  margin-right: auto; text-align: left; }
25
+  .center { margin-left: auto; margin-right: auto; text-align: center; }
33 26
   .underline { text-decoration: underline; }
34 27
   #postamble p, #preamble p { font-size: 90%; margin: .2em; }
35 28
   p.verse { margin-left: 3%; }
@@ -56,111 +49,27 @@
56 49
     border: 1px solid black;
57 50
   }
58 51
   pre.src:hover:before { display: inline;}
59
-  /* Languages per Org manual */
60
-  pre.src-asymptote:before { content: 'Asymptote'; }
61
-  pre.src-awk:before { content: 'Awk'; }
62
-  pre.src-C:before { content: 'C'; }
63
-  /* pre.src-C++ doesn't work in CSS */
64
-  pre.src-clojure:before { content: 'Clojure'; }
65
-  pre.src-css:before { content: 'CSS'; }
66
-  pre.src-D:before { content: 'D'; }
67
-  pre.src-ditaa:before { content: 'ditaa'; }
68
-  pre.src-dot:before { content: 'Graphviz'; }
69
-  pre.src-calc:before { content: 'Emacs Calc'; }
52
+  pre.src-sh:before    { content: 'sh'; }
53
+  pre.src-bash:before  { content: 'sh'; }
70 54
   pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
71
-  pre.src-fortran:before { content: 'Fortran'; }
72
-  pre.src-gnuplot:before { content: 'gnuplot'; }
73
-  pre.src-haskell:before { content: 'Haskell'; }
74
-  pre.src-hledger:before { content: 'hledger'; }
75
-  pre.src-java:before { content: 'Java'; }
76
-  pre.src-js:before { content: 'Javascript'; }
77
-  pre.src-latex:before { content: 'LaTeX'; }
78
-  pre.src-ledger:before { content: 'Ledger'; }
79
-  pre.src-lisp:before { content: 'Lisp'; }
80
-  pre.src-lilypond:before { content: 'Lilypond'; }
81
-  pre.src-lua:before { content: 'Lua'; }
82
-  pre.src-matlab:before { content: 'MATLAB'; }
83
-  pre.src-mscgen:before { content: 'Mscgen'; }
84
-  pre.src-ocaml:before { content: 'Objective Caml'; }
85
-  pre.src-octave:before { content: 'Octave'; }
86
-  pre.src-org:before { content: 'Org mode'; }
87
-  pre.src-oz:before { content: 'OZ'; }
88
-  pre.src-plantuml:before { content: 'Plantuml'; }
89
-  pre.src-processing:before { content: 'Processing.js'; }
90
-  pre.src-python:before { content: 'Python'; }
91
-  pre.src-R:before { content: 'R'; }
92
-  pre.src-ruby:before { content: 'Ruby'; }
93
-  pre.src-sass:before { content: 'Sass'; }
94
-  pre.src-scheme:before { content: 'Scheme'; }
95
-  pre.src-screen:before { content: 'Gnu Screen'; }
96
-  pre.src-sed:before { content: 'Sed'; }
97
-  pre.src-sh:before { content: 'shell'; }
98
-  pre.src-sql:before { content: 'SQL'; }
99
-  pre.src-sqlite:before { content: 'SQLite'; }
100
-  /* additional languages in org.el's org-babel-load-languages alist */
101
-  pre.src-forth:before { content: 'Forth'; }
102
-  pre.src-io:before { content: 'IO'; }
103
-  pre.src-J:before { content: 'J'; }
104
-  pre.src-makefile:before { content: 'Makefile'; }
105
-  pre.src-maxima:before { content: 'Maxima'; }
106
-  pre.src-perl:before { content: 'Perl'; }
107
-  pre.src-picolisp:before { content: 'Pico Lisp'; }
108
-  pre.src-scala:before { content: 'Scala'; }
109
-  pre.src-shell:before { content: 'Shell Script'; }
110
-  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
111
-  /* additional language identifiers per "defun org-babel-execute"
112
-       in ob-*.el */
113
-  pre.src-cpp:before  { content: 'C++'; }
114
-  pre.src-abc:before  { content: 'ABC'; }
115
-  pre.src-coq:before  { content: 'Coq'; }
116
-  pre.src-groovy:before  { content: 'Groovy'; }
117
-  /* additional language identifiers from org-babel-shell-names in
118
-     ob-shell.el: ob-shell is the only babel language using a lambda to put
119
-     the execution function name together. */
120
-  pre.src-bash:before  { content: 'bash'; }
121
-  pre.src-csh:before  { content: 'csh'; }
122
-  pre.src-ash:before  { content: 'ash'; }
123
-  pre.src-dash:before  { content: 'dash'; }
124
-  pre.src-ksh:before  { content: 'ksh'; }
125
-  pre.src-mksh:before  { content: 'mksh'; }
126
-  pre.src-posh:before  { content: 'posh'; }
127
-  /* Additional Emacs modes also supported by the LaTeX listings package */
128
-  pre.src-ada:before { content: 'Ada'; }
129
-  pre.src-asm:before { content: 'Assembler'; }
130
-  pre.src-caml:before { content: 'Caml'; }
131
-  pre.src-delphi:before { content: 'Delphi'; }
132
-  pre.src-html:before { content: 'HTML'; }
133
-  pre.src-idl:before { content: 'IDL'; }
134
-  pre.src-mercury:before { content: 'Mercury'; }
135
-  pre.src-metapost:before { content: 'MetaPost'; }
136
-  pre.src-modula-2:before { content: 'Modula-2'; }
137
-  pre.src-pascal:before { content: 'Pascal'; }
138
-  pre.src-ps:before { content: 'PostScript'; }
139
-  pre.src-prolog:before { content: 'Prolog'; }
140
-  pre.src-simula:before { content: 'Simula'; }
141
-  pre.src-tcl:before { content: 'tcl'; }
142
-  pre.src-tex:before { content: 'TeX'; }
143
-  pre.src-plain-tex:before { content: 'Plain TeX'; }
144
-  pre.src-verilog:before { content: 'Verilog'; }
145
-  pre.src-vhdl:before { content: 'VHDL'; }
146
-  pre.src-xml:before { content: 'XML'; }
147
-  pre.src-nxml:before { content: 'XML'; }
148
-  /* add a generic configuration mode; LaTeX export needs an additional
149
-     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
150
-  pre.src-conf:before { content: 'Configuration File'; }
55
+  pre.src-R:before     { content: 'R'; }
56
+  pre.src-perl:before  { content: 'Perl'; }
57
+  pre.src-java:before  { content: 'Java'; }
58
+  pre.src-sql:before   { content: 'SQL'; }
151 59
 
152 60
   table { border-collapse:collapse; }
153 61
   caption.t-above { caption-side: top; }
154 62
   caption.t-bottom { caption-side: bottom; }
155 63
   td, th { vertical-align:top;  }
156
-  th.org-right  { text-align: center;  }
157
-  th.org-left   { text-align: center;   }
158
-  th.org-center { text-align: center; }
159
-  td.org-right  { text-align: right;  }
160
-  td.org-left   { text-align: left;   }
161
-  td.org-center { text-align: center; }
64
+  th.right  { text-align: center;  }
65
+  th.left   { text-align: center;   }
66
+  th.center { text-align: center; }
67
+  td.right  { text-align: right;  }
68
+  td.left   { text-align: left;   }
69
+  td.center { text-align: center; }
162 70
   dt { font-weight: bold; }
163
-  .footpara { display: inline; }
71
+  .footpara:nth-child(2) { display: inline; }
72
+  .footpara { display: block; }
164 73
   .footdef  { margin-bottom: 1em; }
165 74
   .figure { padding: 1em; }
166 75
   .figure p { text-align: center; }
@@ -180,7 +89,6 @@
180 89
     { font-size: 10px; font-weight: bold; white-space: nowrap; }
181 90
   .org-info-js_search-highlight
182 91
     { background-color: #ffff00; color: #000000; font-weight: bold; }
183
-  .org-svg { width: 90%; }
184 92
   /*]]>*/-->
185 93
 </style>
186 94
 <link rel="stylesheet" type="text/css" href="freedombone.css" />
@@ -189,7 +97,7 @@
189 97
 @licstart  The following is the entire license notice for the
190 98
 JavaScript code in this tag.
191 99
 
192
-Copyright (C) 2012-2017 Free Software Foundation, Inc.
100
+Copyright (C) 2012-2013 Free Software Foundation, Inc.
193 101
 
194 102
 The JavaScript code in this tag is free software: you can
195 103
 redistribute it and/or modify it under the terms of the GNU
@@ -236,6 +144,7 @@ for the JavaScript code in this tag.
236 144
 <a name="top" id="top"></a>
237 145
 </div>
238 146
 <div id="content">
147
+<h1 class="title"></h1>
239 148
 
240 149
 <div class="figure">
241 150
 <p><img src="images/logo.png" alt="logo.png" width="80%" height="10%" align="center" />
@@ -258,9 +167,9 @@ The base install of the system just contains an email server and Mutt client, bu
258 167
 </p>
259 168
 </div>
260 169
 
261
-<div id="outline-container-org9ebecbb" class="outline-2">
262
-<h2 id="org9ebecbb">Akaunting</h2>
263
-<div class="outline-text-2" id="text-org9ebecbb">
170
+<div id="outline-container-sec-1" class="outline-2">
171
+<h2 id="sec-1">Akaunting</h2>
172
+<div class="outline-text-2" id="text-1">
264 173
 <p>
265 174
 A web based accounts system for small businesses or freelancers.
266 175
 </p>
@@ -270,9 +179,9 @@ A web based accounts system for small businesses or freelancers.
270 179
 </p>
271 180
 </div>
272 181
 </div>
273
-<div id="outline-container-orgabfaf48" class="outline-2">
274
-<h2 id="orgabfaf48">BDS Mail</h2>
275
-<div class="outline-text-2" id="text-orgabfaf48">
182
+<div id="outline-container-sec-2" class="outline-2">
183
+<h2 id="sec-2">BDS Mail</h2>
184
+<div class="outline-text-2" id="text-2">
276 185
 <p>
277 186
 It's like ordinary email, but with <a href="https://en.wikipedia.org/wiki/I2P">i2p</a> as the transport mechanism.
278 187
 </p>
@@ -282,9 +191,9 @@ It's like ordinary email, but with <a href="https://en.wikipedia.org/wiki/I2P">i
282 191
 </p>
283 192
 </div>
284 193
 </div>
285
-<div id="outline-container-org3172e34" class="outline-2">
286
-<h2 id="org3172e34">Bludit</h2>
287
-<div class="outline-text-2" id="text-org3172e34">
194
+<div id="outline-container-sec-3" class="outline-2">
195
+<h2 id="sec-3">Bludit</h2>
196
+<div class="outline-text-2" id="text-3">
288 197
 <p>
289 198
 This is a simple databaseless blogging system which uses markdown files. It should run well on any hardware.
290 199
 </p>
@@ -294,9 +203,9 @@ This is a simple databaseless blogging system which uses markdown files. It shou
294 203
 </p>
295 204
 </div>
296 205
 </div>
297
-<div id="outline-container-org1e93869" class="outline-2">
298
-<h2 id="org1e93869">CryptPad</h2>
299
-<div class="outline-text-2" id="text-org1e93869">
206
+<div id="outline-container-sec-4" class="outline-2">
207
+<h2 id="sec-4">CryptPad</h2>
208
+<div class="outline-text-2" id="text-4">
300 209
 <p>
301 210
 Collaborate on editing documents, presentations and source code, or vote on things. All with a good level of security.
302 211
 </p>
@@ -306,9 +215,9 @@ Collaborate on editing documents, presentations and source code, or vote on thin
306 215
 </p>
307 216
 </div>
308 217
 </div>
309
-<div id="outline-container-org4f47b31" class="outline-2">
310
-<h2 id="org4f47b31">DLNA</h2>
311
-<div class="outline-text-2" id="text-org4f47b31">
218
+<div id="outline-container-sec-5" class="outline-2">
219
+<h2 id="sec-5">DLNA</h2>
220
+<div class="outline-text-2" id="text-5">
312 221
 <p>
313 222
 Enables you to use the system as a music server which any DLNA compatible devices can connect to within your home network.
314 223
 </p>
@@ -318,9 +227,9 @@ Enables you to use the system as a music server which any DLNA compatible device
318 227
 </p>
319 228
 </div>
320 229
 </div>
321
-<div id="outline-container-orga5d09ad" class="outline-2">
322
-<h2 id="orga5d09ad">Dokuwiki</h2>
323
-<div class="outline-text-2" id="text-orga5d09ad">
230
+<div id="outline-container-sec-6" class="outline-2">
231
+<h2 id="sec-6">Dokuwiki</h2>
232
+<div class="outline-text-2" id="text-6">
324 233
 <p>
325 234
 A databaseless wiki system.
326 235
 </p>
@@ -330,9 +239,9 @@ A databaseless wiki system.
330 239
 </p>
331 240
 </div>
332 241
 </div>
333
-<div id="outline-container-orgfd3fe55" class="outline-2">
334
-<h2 id="orgfd3fe55">Edith</h2>
335
-<div class="outline-text-2" id="text-orgfd3fe55">
242
+<div id="outline-container-sec-7" class="outline-2">
243
+<h2 id="sec-7">Edith</h2>
244
+<div class="outline-text-2" id="text-7">
336 245
 <p>
337 246
 Extremely simple and distraction-free notes system.
338 247
 </p>
@@ -342,9 +251,9 @@ Extremely simple and distraction-free notes system.
342 251
 </p>
343 252
 </div>
344 253
 </div>
345
-<div id="outline-container-org4180f98" class="outline-2">
346
-<h2 id="org4180f98">Emacs</h2>
347
-<div class="outline-text-2" id="text-org4180f98">
254
+<div id="outline-container-sec-8" class="outline-2">
255
+<h2 id="sec-8">Emacs</h2>
256
+<div class="outline-text-2" id="text-8">
348 257
 <p>
349 258
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
350 259
 </p>
@@ -354,17 +263,17 @@ If you use the Mutt client to read your email then this will set it up to use em
354 263
 </p>
355 264
 </div>
356 265
 </div>
357
-<div id="outline-container-org8be04fc" class="outline-2">
358
-<h2 id="org8be04fc">Email Server</h2>
359
-<div class="outline-text-2" id="text-org8be04fc">
266
+<div id="outline-container-sec-9" class="outline-2">
267
+<h2 id="sec-9">Email Server</h2>
268
+<div class="outline-text-2" id="text-9">
360 269
 <p>
361 270
 Since many apps require email registration an email server is installed by default. You can find advice on using the email system <a href="./usage_email.html">here</a>.
362 271
 </p>
363 272
 </div>
364 273
 </div>
365
-<div id="outline-container-org95ea316" class="outline-2">
366
-<h2 id="org95ea316">Etherpad</h2>
367
-<div class="outline-text-2" id="text-org95ea316">
274
+<div id="outline-container-sec-10" class="outline-2">
275
+<h2 id="sec-10">Etherpad</h2>
276
+<div class="outline-text-2" id="text-10">
368 277
 <p>
369 278
 Collaborate on creating documents in real time. Maybe you're planning a holiday with other family members or creating documentation for a Free Software project along with other volunteers. Etherpad is hard to beat for simplicity and speed. Only users of the system will be able to access it.
370 279
 </p>
@@ -374,9 +283,9 @@ Collaborate on creating documents in real time. Maybe you're planning a holiday
374 283
 </p>
375 284
 </div>
376 285
 </div>
377
-<div id="outline-container-org27dc49b" class="outline-2">
378
-<h2 id="org27dc49b">Federated wiki</h2>
379
-<div class="outline-text-2" id="text-org27dc49b">
286
+<div id="outline-container-sec-11" class="outline-2">
287
+<h2 id="sec-11">Federated wiki</h2>
288
+<div class="outline-text-2" id="text-11">
380 289
 <p>
381 290
 A new approach to creating wiki content.
382 291
 </p>
@@ -386,9 +295,9 @@ A new approach to creating wiki content.
386 295
 </p>
387 296
 </div>
388 297
 </div>
389
-<div id="outline-container-orge659bcd" class="outline-2">
390
-<h2 id="orge659bcd">Friendica</h2>
391
-<div class="outline-text-2" id="text-orge659bcd">
298
+<div id="outline-container-sec-12" class="outline-2">
299
+<h2 id="sec-12">Friendica</h2>
300
+<div class="outline-text-2" id="text-12">
392 301
 <p>
393 302
 Federated social network system.
394 303
 </p>
@@ -398,9 +307,9 @@ Federated social network system.
398 307
 </p>
399 308
 </div>
400 309
 </div>
401
-<div id="outline-container-org4d88ad9" class="outline-2">
402
-<h2 id="org4d88ad9">GNU Social</h2>
403
-<div class="outline-text-2" id="text-org4d88ad9">
310
+<div id="outline-container-sec-13" class="outline-2">
311
+<h2 id="sec-13">GNU Social</h2>
312
+<div class="outline-text-2" id="text-13">
404 313
 <p>
405 314
 Federated social network based on the OStatus protocol. You can "<i>remote follow</i>" other users within the GNU Social federation.
406 315
 </p>
@@ -410,9 +319,9 @@ Federated social network based on the OStatus protocol. You can "<i>remote follo
410 319
 </p>
411 320
 </div>
412 321
 </div>
413
-<div id="outline-container-orgb12489b" class="outline-2">
414
-<h2 id="orgb12489b">Gogs</h2>
415
-<div class="outline-text-2" id="text-orgb12489b">
322
+<div id="outline-container-sec-14" class="outline-2">
323
+<h2 id="sec-14">Gogs</h2>
324
+<div class="outline-text-2" id="text-14">
416 325
 <p>
417 326
 Lightweight git project hosting system. You can mirror projects from Github, or if Github turns evil then just host your own projects while retaining the familiar <i>fork-and-pull</i> workflow. If you can use Github then you can also use Gogs.
418 327
 </p>
@@ -422,9 +331,9 @@ Lightweight git project hosting system. You can mirror projects from Github, or
422 331
 </p>
423 332
 </div>
424 333
 </div>
425
-<div id="outline-container-org399677f" class="outline-2">
426
-<h2 id="org399677f">HTMLy</h2>
427
-<div class="outline-text-2" id="text-org399677f">
334
+<div id="outline-container-sec-15" class="outline-2">
335
+<h2 id="sec-15">HTMLy</h2>
336
+<div class="outline-text-2" id="text-15">
428 337
 <p>
429 338
 Databaseless blogging system. Quite simple and with a markdown-like format.
430 339
 </p>
@@ -434,9 +343,9 @@ Databaseless blogging system. Quite simple and with a markdown-like format.
434 343
 </p>
435 344
 </div>
436 345
 </div>
437
-<div id="outline-container-org2fcaeeb" class="outline-2">
438
-<h2 id="org2fcaeeb">Hubzilla</h2>
439
-<div class="outline-text-2" id="text-org2fcaeeb">
346
+<div id="outline-container-sec-16" class="outline-2">
347
+<h2 id="sec-16">Hubzilla</h2>
348
+<div class="outline-text-2" id="text-16">
440 349
 <p>
441 350
 Web publishing platform with social network like features and good privacy controls so that it's possible to specify who can see which content. Includes photo albums, calendar, wiki and file storage.
442 351
 </p>
@@ -446,9 +355,9 @@ Web publishing platform with social network like features and good privacy contr
446 355
 </p>
447 356
 </div>
448 357
 </div>
449
-<div id="outline-container-org0bce17a" class="outline-2">
450
-<h2 id="org0bce17a">Icecast media stream</h2>
451
-<div class="outline-text-2" id="text-org0bce17a">
358
+<div id="outline-container-sec-17" class="outline-2">
359
+<h2 id="sec-17">Icecast media stream</h2>
360
+<div class="outline-text-2" id="text-17">
452 361
 <p>
453 362
 Make your own internet radio station.
454 363
 </p>
@@ -458,9 +367,9 @@ Make your own internet radio station.
458 367
 </p>
459 368
 </div>
460 369
 </div>
461
-<div id="outline-container-orgd083573" class="outline-2">
462
-<h2 id="orgd083573">IRC Server (ngirc)</h2>
463
-<div class="outline-text-2" id="text-orgd083573">
370
+<div id="outline-container-sec-18" class="outline-2">
371
+<h2 id="sec-18">IRC Server (ngirc)</h2>
372
+<div class="outline-text-2" id="text-18">
464 373
 <p>
465 374
 Run your own IRC chat channel which can be secured with a password and accessible via an onion address. A bouncer is included so that you can receive messages sent while you were offline. Works with Hexchat and other popular clients.
466 375
 </p>
@@ -470,18 +379,18 @@ Run your own IRC chat channel which can be secured with a password and accessibl
470 379
 </p>
471 380
 </div>
472 381
 </div>
473
-<div id="outline-container-orgdaa15cf" class="outline-2">
474
-<h2 id="orgdaa15cf">Jitsi Meet</h2>
475
-<div class="outline-text-2" id="text-orgdaa15cf">
382
+<div id="outline-container-sec-19" class="outline-2">
383
+<h2 id="sec-19">Jitsi Meet</h2>
384
+<div class="outline-text-2" id="text-19">
476 385
 <p>
477 386
 Experimental WebRTC video conferencing system, similar to Google Hangouts. This may not be fully functional, but is hoped to be in the near future.
478 387
 </p>
479 388
 </div>
480 389
 </div>
481 390
 
482
-<div id="outline-container-org15f9534" class="outline-2">
483
-<h2 id="org15f9534">KanBoard</h2>
484
-<div class="outline-text-2" id="text-org15f9534">
391
+<div id="outline-container-sec-20" class="outline-2">
392
+<h2 id="sec-20">KanBoard</h2>
393
+<div class="outline-text-2" id="text-20">
485 394
 <p>
486 395
 A simple kanban system for managing projects or TODO lists.
487 396
 </p>
@@ -491,9 +400,9 @@ A simple kanban system for managing projects or TODO lists.
491 400
 </p>
492 401
 </div>
493 402
 </div>
494
-<div id="outline-container-org1090474" class="outline-2">
495
-<h2 id="org1090474">Key Server</h2>
496
-<div class="outline-text-2" id="text-org1090474">
403
+<div id="outline-container-sec-21" class="outline-2">
404
+<h2 id="sec-21">Key Server</h2>
405
+<div class="outline-text-2" id="text-21">
497 406
 <p>
498 407
 An OpenPGP key server for storing and retrieving GPG public keys.
499 408
 </p>
@@ -503,9 +412,9 @@ An OpenPGP key server for storing and retrieving GPG public keys.
503 412
 </p>
504 413
 </div>
505 414
 </div>
506
-<div id="outline-container-org80f825f" class="outline-2">
507
-<h2 id="org80f825f">Koel</h2>
508
-<div class="outline-text-2" id="text-org80f825f">
415
+<div id="outline-container-sec-22" class="outline-2">
416
+<h2 id="sec-22">Koel</h2>
417
+<div class="outline-text-2" id="text-22">
509 418
 <p>
510 419
 Access your music collection from any internet connected device.
511 420
 </p>
@@ -515,9 +424,9 @@ Access your music collection from any internet connected device.
515 424
 </p>
516 425
 </div>
517 426
 </div>
518
-<div id="outline-container-orgd6e6623" class="outline-2">
519
-<h2 id="orgd6e6623">Lychee</h2>
520
-<div class="outline-text-2" id="text-orgd6e6623">
427
+<div id="outline-container-sec-23" class="outline-2">
428
+<h2 id="sec-23">Lychee</h2>
429
+<div class="outline-text-2" id="text-23">
521 430
 <p>
522 431
 Make your photo albums available on the web.
523 432
 </p>
@@ -527,9 +436,9 @@ Make your photo albums available on the web.
527 436
 </p>
528 437
 </div>
529 438
 </div>
530
-<div id="outline-container-org3588890" class="outline-2">
531
-<h2 id="org3588890">Mailpile</h2>
532
-<div class="outline-text-2" id="text-org3588890">
439
+<div id="outline-container-sec-24" class="outline-2">
440
+<h2 id="sec-24">Mailpile</h2>
441
+<div class="outline-text-2" id="text-24">
533 442
 <p>
534 443
 Modern email client which supports GPG encryption.
535 444
 </p>
@@ -539,9 +448,9 @@ Modern email client which supports GPG encryption.
539 448
 </p>
540 449
 </div>
541 450
 </div>
542
-<div id="outline-container-orgb1ec8b5" class="outline-2">
543
-<h2 id="orgb1ec8b5">Matrix</h2>
544
-<div class="outline-text-2" id="text-orgb1ec8b5">
451
+<div id="outline-container-sec-25" class="outline-2">
452
+<h2 id="sec-25">Matrix</h2>
453
+<div class="outline-text-2" id="text-25">
545 454
 <p>
546 455
 Multi-user chat with some security and moderation controls.
547 456
 </p>
@@ -551,9 +460,9 @@ Multi-user chat with some security and moderation controls.
551 460
 </p>
552 461
 </div>
553 462
 </div>
554
-<div id="outline-container-org2765a47" class="outline-2">
555
-<h2 id="org2765a47">Mediagoblin</h2>
556
-<div class="outline-text-2" id="text-org2765a47">
463
+<div id="outline-container-sec-26" class="outline-2">
464
+<h2 id="sec-26">Mediagoblin</h2>
465
+<div class="outline-text-2" id="text-26">
557 466
 <p>
558 467
 Publicly host video and audio files so that you don't need to use YouTube/Vimeo/etc.
559 468
 </p>
@@ -563,9 +472,9 @@ Publicly host video and audio files so that you don't need to use YouTube/Vimeo/
563 472
 </p>
564 473
 </div>
565 474
 </div>
566
-<div id="outline-container-org03e8661" class="outline-2">
567
-<h2 id="org03e8661">Mumble</h2>
568
-<div class="outline-text-2" id="text-org03e8661">
475
+<div id="outline-container-sec-27" class="outline-2">
476
+<h2 id="sec-27">Mumble</h2>
477
+<div class="outline-text-2" id="text-27">
569 478
 <p>
570 479
 The popular VoIP and text chat system. Say goodbye to old-fashioned telephony conferences with silly dial codes. Also works well on mobile.
571 480
 </p>
@@ -575,9 +484,9 @@ The popular VoIP and text chat system. Say goodbye to old-fashioned telephony co
575 484
 </p>
576 485
 </div>
577 486
 </div>
578
-<div id="outline-container-org2be2a1a" class="outline-2">
579
-<h2 id="org2be2a1a">NextCloud</h2>
580
-<div class="outline-text-2" id="text-org2be2a1a">
487
+<div id="outline-container-sec-28" class="outline-2">
488
+<h2 id="sec-28">NextCloud</h2>
489
+<div class="outline-text-2" id="text-28">
581 490
 <p>
582 491
 Store files on your server and sync them with laptops or mobile devices. Includes many plugins including videoconferencing and collaborative document editing.
583 492
 </p>
@@ -587,9 +496,9 @@ Store files on your server and sync them with laptops or mobile devices. Include
587 496
 </p>
588 497
 </div>
589 498
 </div>
590
-<div id="outline-container-orga9b8ff0" class="outline-2">
591
-<h2 id="orga9b8ff0">PeerTube</h2>
592
-<div class="outline-text-2" id="text-orga9b8ff0">
499
+<div id="outline-container-sec-29" class="outline-2">
500
+<h2 id="sec-29">PeerTube</h2>
501
+<div class="outline-text-2" id="text-29">
593 502
 <p>
594 503
 Peer-to-peer video hosting. Similar to Mediagoblin, but the P2P aspect better enables the streaming load to be shared across servers.
595 504
 </p>
@@ -599,9 +508,9 @@ Peer-to-peer video hosting. Similar to Mediagoblin, but the P2P aspect better en
599 508
 </p>
600 509
 </div>
601 510
 </div>
602
-<div id="outline-container-orge124cb5" class="outline-2">
603
-<h2 id="orge124cb5">PI-Hole</h2>
604
-<div class="outline-text-2" id="text-orge124cb5">
511
+<div id="outline-container-sec-30" class="outline-2">
512
+<h2 id="sec-30">PI-Hole</h2>
513
+<div class="outline-text-2" id="text-30">
605 514
 <p>
606 515
 The black hole for web adverts. Block adverts at the domain name level within your local network. It can significantly reduce bandwidth, speed up page load times and protect your systems from being tracked by spyware.
607 516
 </p>
@@ -611,9 +520,9 @@ The black hole for web adverts. Block adverts at the domain name level within yo
611 520
 </p>
612 521
 </div>
613 522
 </div>
614
-<div id="outline-container-org7d249a4" class="outline-2">
615
-<h2 id="org7d249a4">Pleroma</h2>
616
-<div class="outline-text-2" id="text-org7d249a4">
523
+<div id="outline-container-sec-31" class="outline-2">
524
+<h2 id="sec-31">Pleroma</h2>
525
+<div class="outline-text-2" id="text-31">
617 526
 <p>
618 527
 Fediverse instance which is compatible with GNU Social and Mastodon, and suited for systems without much RAM or CPU resource.
619 528
 </p>
@@ -623,9 +532,9 @@ Fediverse instance which is compatible with GNU Social and Mastodon, and suited
623 532
 </p>
624 533
 </div>
625 534
 </div>
626
-<div id="outline-container-orgce303d5" class="outline-2">
627
-<h2 id="orgce303d5">PostActiv</h2>
628
-<div class="outline-text-2" id="text-orgce303d5">
535
+<div id="outline-container-sec-32" class="outline-2">
536
+<h2 id="sec-32">PostActiv</h2>
537
+<div class="outline-text-2" id="text-32">
629 538
 <p>
630 539
 An alternative federated social networking system compatible with GNU Social, Pleroma and Mastodon. It includes some optimisations and fixes currently not available within the main GNU Social project.
631 540
 </p>
@@ -635,9 +544,9 @@ An alternative federated social networking system compatible with GNU Social, Pl
635 544
 </p>
636 545
 </div>
637 546
 </div>
638
-<div id="outline-container-orgfc8be3c" class="outline-2">
639
-<h2 id="orgfc8be3c">PrivateBin</h2>
640
-<div class="outline-text-2" id="text-orgfc8be3c">
547
+<div id="outline-container-sec-33" class="outline-2">
548
+<h2 id="sec-33">PrivateBin</h2>
549
+<div class="outline-text-2" id="text-33">
641 550
 <p>
642 551
 A pastebin where the server has zero knowledge of the content being pasted.
643 552
 </p>
@@ -647,9 +556,9 @@ A pastebin where the server has zero knowledge of the content being pasted.
647 556
 </p>
648 557
 </div>
649 558
 </div>
650
-<div id="outline-container-org169bce5" class="outline-2">
651
-<h2 id="org169bce5">Profanity</h2>
652
-<div class="outline-text-2" id="text-org169bce5">
559
+<div id="outline-container-sec-34" class="outline-2">
560
+<h2 id="sec-34">Profanity</h2>
561
+<div class="outline-text-2" id="text-34">
653 562
 <p>
654 563
 A shell based XMPP client which you can run on the Freedombone server via ssh.
655 564
 </p>
@@ -659,9 +568,9 @@ A shell based XMPP client which you can run on the Freedombone server via ssh.
659 568
 </p>
660 569
 </div>
661 570
 </div>
662
-<div id="outline-container-orgef8d37a" class="outline-2">
663
-<h2 id="orgef8d37a">Riot Web</h2>
664
-<div class="outline-text-2" id="text-orgef8d37a">
571
+<div id="outline-container-sec-35" class="outline-2">
572
+<h2 id="sec-35">Riot Web</h2>
573
+<div class="outline-text-2" id="text-35">
665 574
 <p>
666 575
 A browser based user interface for the Matrix federated communications system, including WebRTC audio and video chat.
667 576
 </p>
@@ -671,9 +580,9 @@ A browser based user interface for the Matrix federated communications system, i
671 580
 </p>
672 581
 </div>
673 582
 </div>
674
-<div id="outline-container-orgb2b8eaf" class="outline-2">
675
-<h2 id="orgb2b8eaf">Rocketchat</h2>
676
-<div class="outline-text-2" id="text-orgb2b8eaf">
583
+<div id="outline-container-sec-36" class="outline-2">
584
+<h2 id="sec-36">Rocketchat</h2>
585
+<div class="outline-text-2" id="text-36">
677 586
 <p>
678 587
 A non-federated chat server (x86 systems only).
679 588
 </p>
@@ -683,9 +592,9 @@ A non-federated chat server (x86 systems only).
683 592
 </p>
684 593
 </div>
685 594
 </div>
686
-<div id="outline-container-org86dc8e9" class="outline-2">
687
-<h2 id="org86dc8e9">SearX</h2>
688
-<div class="outline-text-2" id="text-org86dc8e9">
595
+<div id="outline-container-sec-37" class="outline-2">
596
+<h2 id="sec-37">SearX</h2>
597
+<div class="outline-text-2" id="text-37">
689 598
 <p>
690 599
 A metasearch engine for customised and private web searches.
691 600
 </p>
@@ -695,21 +604,21 @@ A metasearch engine for customised and private web searches.
695 604
 </p>
696 605
 </div>
697 606
 </div>
698
-<div id="outline-container-orgd3988e5" class="outline-2">
699
-<h2 id="orgd3988e5">tt-rss</h2>
700
-<div class="outline-text-2" id="text-orgd3988e5">
607
+<div id="outline-container-sec-38" class="outline-2">
608
+<h2 id="sec-38">Smol RSS</h2>
609
+<div class="outline-text-2" id="text-38">
701 610
 <p>
702
-Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "<i>the right to read</i>" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
611
+A very minimal RSS reader.
703 612
 </p>
704 613
 
705 614
 <p>
706
-<a href="./app_rss.html">How to use it</a>
615
+<a href="./app_smolrss.html">How to use it</a>
707 616
 </p>
708 617
 </div>
709 618
 </div>
710
-<div id="outline-container-org773fb88" class="outline-2">
711
-<h2 id="org773fb88">Syncthing</h2>
712
-<div class="outline-text-2" id="text-org773fb88">
619
+<div id="outline-container-sec-39" class="outline-2">
620
+<h2 id="sec-39">Syncthing</h2>
621
+<div class="outline-text-2" id="text-39">
713 622
 <p>
714 623
 Possibly the best way to synchronise files across all of your devices. Once it has been set up it "just works" with no user intervention needed.
715 624
 </p>
@@ -719,9 +628,21 @@ Possibly the best way to synchronise files across all of your devices. Once it h
719 628
 </p>
720 629
 </div>
721 630
 </div>
722
-<div id="outline-container-org6ad810d" class="outline-2">
723
-<h2 id="org6ad810d">Tahoe-LAFS</h2>
724
-<div class="outline-text-2" id="text-org6ad810d">
631
+<div id="outline-container-sec-40" class="outline-2">
632
+<h2 id="sec-40">tt-rss</h2>
633
+<div class="outline-text-2" id="text-40">
634
+<p>
635
+Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "<i>the right to read</i>" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
636
+</p>
637
+
638
+<p>
639
+<a href="./app_rss.html">How to use it</a>
640
+</p>
641
+</div>
642
+</div>
643
+<div id="outline-container-sec-41" class="outline-2">
644
+<h2 id="sec-41">Tahoe-LAFS</h2>
645
+<div class="outline-text-2" id="text-41">
725 646
 <p>
726 647
 Robust and encrypted storage of files on one or more server.
727 648
 </p>
@@ -731,9 +652,9 @@ Robust and encrypted storage of files on one or more server.
731 652
 </p>
732 653
 </div>
733 654
 </div>
734
-<div id="outline-container-orgc866a19" class="outline-2">
735
-<h2 id="orgc866a19">Tox</h2>
736
-<div class="outline-text-2" id="text-orgc866a19">
655
+<div id="outline-container-sec-42" class="outline-2">
656
+<h2 id="sec-42">Tox</h2>
657
+<div class="outline-text-2" id="text-42">
737 658
 <p>
738 659
 Client and bootstrap node for the Tox chat/VoIP system.
739 660
 </p>
@@ -743,9 +664,9 @@ Client and bootstrap node for the Tox chat/VoIP system.
743 664
 </p>
744 665
 </div>
745 666
 </div>
746
-<div id="outline-container-orge8c9d44" class="outline-2">
747
-<h2 id="orge8c9d44">Turtl</h2>
748
-<div class="outline-text-2" id="text-orge8c9d44">
667
+<div id="outline-container-sec-43" class="outline-2">
668
+<h2 id="sec-43">Turtl</h2>
669
+<div class="outline-text-2" id="text-43">
749 670
 <p>
750 671
 A system for privately creating and sharing notes and images, similar to Evernote but without the spying.
751 672
 </p>
@@ -755,18 +676,18 @@ A system for privately creating and sharing notes and images, similar to Evernot
755 676
 </p>
756 677
 </div>
757 678
 </div>
758
-<div id="outline-container-org99b644d" class="outline-2">
759
-<h2 id="org99b644d">Vim</h2>
760
-<div class="outline-text-2" id="text-org99b644d">
679
+<div id="outline-container-sec-44" class="outline-2">
680
+<h2 id="sec-44">Vim</h2>
681
+<div class="outline-text-2" id="text-44">
761 682
 <p>
762 683
 If you use the Mutt client to read your email then this will set it up to use vim for composing new mail.
763 684
 </p>
764 685
 </div>
765 686
 </div>
766 687
 
767
-<div id="outline-container-org880c87c" class="outline-2">
768
-<h2 id="org880c87c">Virtual Private Network (VPN)</h2>
769
-<div class="outline-text-2" id="text-org880c87c">
688
+<div id="outline-container-sec-45" class="outline-2">
689
+<h2 id="sec-45">Virtual Private Network (VPN)</h2>
690
+<div class="outline-text-2" id="text-45">
770 691
 <p>
771 692
 Set up a VPN on your server so that you can bypass local internet censorship.
772 693
 </p>
@@ -776,9 +697,9 @@ Set up a VPN on your server so that you can bypass local internet censorship.
776 697
 </p>
777 698
 </div>
778 699
 </div>
779
-<div id="outline-container-org6237f89" class="outline-2">
780
-<h2 id="org6237f89">XMPP</h2>
781
-<div class="outline-text-2" id="text-org6237f89">
700
+<div id="outline-container-sec-46" class="outline-2">
701
+<h2 id="sec-46">XMPP</h2>
702
+<div class="outline-text-2" id="text-46">
782 703
 <p>
783 704
 Chat server which can be used together with client such as Gajim or Conversations to provide end-to-end content security and also onion routed metadata security. Includes advanced features such as <i>client state notification</i> to save battery power on your mobile devices, support for seamless roaming between networks and <i>message carbons</i> so that you can receive the same messages while being simultaneously logged in to your account on more than one device.
784 705
 </p>