浏览代码

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

Bob Mottram 7 年前
父节点
当前提交
26b237f09c

+ 29
- 0
doc/EN/app_smolrss.org 查看文件

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 查看文件

163
 A metasearch engine for customised and private web searches.
163
 A metasearch engine for customised and private web searches.
164
 
164
 
165
 [[./app_searx.html][How to use it]]
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
 * Syncthing
170
 * Syncthing
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.
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
 [[./app_syncthing.html][How to use it]]
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
 * Tahoe-LAFS
178
 * Tahoe-LAFS
175
 Robust and encrypted storage of files on one or more server.
179
 Robust and encrypted storage of files on one or more server.
176
 
180
 

+ 1
- 1
src/freedombone-app-matrix 查看文件

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

+ 1
- 1
src/freedombone-app-pleroma 查看文件

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

+ 409
- 0
src/freedombone-app-smolrss 查看文件

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 查看文件

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

+ 1
- 0
src/freedombone-image-customise 查看文件

1997
     git clone "$PRIVATEBIN_REPO" "$rootdir/repos/privatebin"
1997
     git clone "$PRIVATEBIN_REPO" "$rootdir/repos/privatebin"
1998
     git clone "$EDITH_REPO" "$rootdir/repos/edith"
1998
     git clone "$EDITH_REPO" "$rootdir/repos/edith"
1999
     git clone "$BDSMAIL_REPO" "$rootdir/repos/bdsmail"
1999
     git clone "$BDSMAIL_REPO" "$rootdir/repos/bdsmail"
2000
+    git clone "$SMOLRSS_REPO" "$rootdir/repos/smolrss"
2000
     #git clone "$WEKAN_REPO" "$rootdir/repos/wekan"
2001
     #git clone "$WEKAN_REPO" "$rootdir/repos/wekan"
2001
     #git clone "$FLOW_ROUTER_REPO" "$rootdir/repos/flowrouter"
2002
     #git clone "$FLOW_ROUTER_REPO" "$rootdir/repos/flowrouter"
2002
     #git clone "$ZERONET_REPO" "$rootdir/repos/zeronet"
2003
     #git clone "$ZERONET_REPO" "$rootdir/repos/zeronet"

+ 10
- 8
src/freedombone-template 查看文件

344
 if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" || "$database_type" == "postgres"* || "$database_type" == "mongo"* ]]; then
344
 if [[ "$database_type" == "mariadb" || "$database_type" == "mysql" || "$database_type" == "postgres"* || "$database_type" == "mongo"* ]]; then
345
     echo ''
345
     echo ''
346
     echo "function ${app_name}_create_database {"
346
     echo "function ${app_name}_create_database {"
347
-    echo "    if [ -f \$IMAGE_PASSWORD_FILE ]; then"
347
+    echo "    if [ -f \"\$IMAGE_PASSWORD_FILE\" ]; then"
348
     echo "        ${app_name_upper}_ADMIN_PASSWORD=\"\$(printf \"%d\" \"\$(cat \"$IMAGE_PASSWORD_FILE\")\")\""
348
     echo "        ${app_name_upper}_ADMIN_PASSWORD=\"\$(printf \"%d\" \"\$(cat \"$IMAGE_PASSWORD_FILE\")\")\""
349
     echo '    else'
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
     echo '        fi'
352
     echo '        fi'
353
     echo '    fi'
353
     echo '    fi'
354
-    echo "    if [ ! \$${app_name_upper}_ADMIN_PASSWORD ]; then"
354
+    echo "    if [ ! \"\$${app_name_upper}_ADMIN_PASSWORD\" ]; then"
355
     echo '        return'
355
     echo '        return'
356
     echo '    fi'
356
     echo '    fi'
357
     echo ''
357
     echo ''
358
     if [[ "$database_type" = "mysql" || "$database_type" = "mariadb" ]]; then
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
     fi
360
     fi
361
     if [[ "$database_type" = "mongo"* ]]; then
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
     fi
363
     fi
364
     if [[ "$database_type" == "postgres"* ]]; then
364
     if [[ "$database_type" == "postgres"* ]]; then
365
         echo '    systemctl restart postgresql'
365
         echo '    systemctl restart postgresql'
1002
     echo "    systemctl start ${app_name}"
1002
     echo "    systemctl start ${app_name}"
1003
 fi
1003
 fi
1004
 if [ $app_webui ]; then
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
     echo ''
1009
     echo ''
1008
     echo "    nginx_ensite \"\$${app_name_upper}_DOMAIN_NAME\""
1010
     echo "    nginx_ensite \"\$${app_name_upper}_DOMAIN_NAME\""
1009
 fi
1011
 fi

+ 219
- 0
website/EN/app_smolrss.html 查看文件

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 查看文件

3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
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">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
 <head>
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
 <style type="text/css">
14
 <style type="text/css">
16
  <!--/*--><![CDATA[/*><!--*/
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
   .todo   { font-family: monospace; color: red; }
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
   .tag    { background-color: #eee; font-family: monospace;
19
   .tag    { background-color: #eee; font-family: monospace;
27
             padding: 2px; font-size: 80%; font-weight: normal; }
20
             padding: 2px; font-size: 80%; font-weight: normal; }
28
   .timestamp { color: #bebebe; }
21
   .timestamp { color: #bebebe; }
29
   .timestamp-kwd { color: #5f9ea0; }
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
   .underline { text-decoration: underline; }
26
   .underline { text-decoration: underline; }
34
   #postamble p, #preamble p { font-size: 90%; margin: .2em; }
27
   #postamble p, #preamble p { font-size: 90%; margin: .2em; }
35
   p.verse { margin-left: 3%; }
28
   p.verse { margin-left: 3%; }
56
     border: 1px solid black;
49
     border: 1px solid black;
57
   }
50
   }
58
   pre.src:hover:before { display: inline;}
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
   pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
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
   table { border-collapse:collapse; }
60
   table { border-collapse:collapse; }
153
   caption.t-above { caption-side: top; }
61
   caption.t-above { caption-side: top; }
154
   caption.t-bottom { caption-side: bottom; }
62
   caption.t-bottom { caption-side: bottom; }
155
   td, th { vertical-align:top;  }
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
   dt { font-weight: bold; }
70
   dt { font-weight: bold; }
163
-  .footpara { display: inline; }
71
+  .footpara:nth-child(2) { display: inline; }
72
+  .footpara { display: block; }
164
   .footdef  { margin-bottom: 1em; }
73
   .footdef  { margin-bottom: 1em; }
165
   .figure { padding: 1em; }
74
   .figure { padding: 1em; }
166
   .figure p { text-align: center; }
75
   .figure p { text-align: center; }
180
     { font-size: 10px; font-weight: bold; white-space: nowrap; }
89
     { font-size: 10px; font-weight: bold; white-space: nowrap; }
181
   .org-info-js_search-highlight
90
   .org-info-js_search-highlight
182
     { background-color: #ffff00; color: #000000; font-weight: bold; }
91
     { background-color: #ffff00; color: #000000; font-weight: bold; }
183
-  .org-svg { width: 90%; }
184
   /*]]>*/-->
92
   /*]]>*/-->
185
 </style>
93
 </style>
186
 <link rel="stylesheet" type="text/css" href="freedombone.css" />
94
 <link rel="stylesheet" type="text/css" href="freedombone.css" />
189
 @licstart  The following is the entire license notice for the
97
 @licstart  The following is the entire license notice for the
190
 JavaScript code in this tag.
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
 The JavaScript code in this tag is free software: you can
102
 The JavaScript code in this tag is free software: you can
195
 redistribute it and/or modify it under the terms of the GNU
103
 redistribute it and/or modify it under the terms of the GNU
236
 <a name="top" id="top"></a>
144
 <a name="top" id="top"></a>
237
 </div>
145
 </div>
238
 <div id="content">
146
 <div id="content">
147
+<h1 class="title"></h1>
239
 
148
 
240
 <div class="figure">
149
 <div class="figure">
241
 <p><img src="images/logo.png" alt="logo.png" width="80%" height="10%" align="center" />
150
 <p><img src="images/logo.png" alt="logo.png" width="80%" height="10%" align="center" />
258
 </p>
167
 </p>
259
 </div>
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
 <p>
173
 <p>
265
 A web based accounts system for small businesses or freelancers.
174
 A web based accounts system for small businesses or freelancers.
266
 </p>
175
 </p>
270
 </p>
179
 </p>
271
 </div>
180
 </div>
272
 </div>
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
 <p>
185
 <p>
277
 It's like ordinary email, but with <a href="https://en.wikipedia.org/wiki/I2P">i2p</a> as the transport mechanism.
186
 It's like ordinary email, but with <a href="https://en.wikipedia.org/wiki/I2P">i2p</a> as the transport mechanism.
278
 </p>
187
 </p>
282
 </p>
191
 </p>
283
 </div>
192
 </div>
284
 </div>
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
 <p>
197
 <p>
289
 This is a simple databaseless blogging system which uses markdown files. It should run well on any hardware.
198
 This is a simple databaseless blogging system which uses markdown files. It should run well on any hardware.
290
 </p>
199
 </p>
294
 </p>
203
 </p>
295
 </div>
204
 </div>
296
 </div>
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
 <p>
209
 <p>
301
 Collaborate on editing documents, presentations and source code, or vote on things. All with a good level of security.
210
 Collaborate on editing documents, presentations and source code, or vote on things. All with a good level of security.
302
 </p>
211
 </p>
306
 </p>
215
 </p>
307
 </div>
216
 </div>
308
 </div>
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
 <p>
221
 <p>
313
 Enables you to use the system as a music server which any DLNA compatible devices can connect to within your home network.
222
 Enables you to use the system as a music server which any DLNA compatible devices can connect to within your home network.
314
 </p>
223
 </p>
318
 </p>
227
 </p>
319
 </div>
228
 </div>
320
 </div>
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
 <p>
233
 <p>
325
 A databaseless wiki system.
234
 A databaseless wiki system.
326
 </p>
235
 </p>
330
 </p>
239
 </p>
331
 </div>
240
 </div>
332
 </div>
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
 <p>
245
 <p>
337
 Extremely simple and distraction-free notes system.
246
 Extremely simple and distraction-free notes system.
338
 </p>
247
 </p>
342
 </p>
251
 </p>
343
 </div>
252
 </div>
344
 </div>
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
 <p>
257
 <p>
349
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
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
 </p>
259
 </p>
354
 </p>
263
 </p>
355
 </div>
264
 </div>
356
 </div>
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
 <p>
269
 <p>
361
 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>.
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
 </p>
271
 </p>
363
 </div>
272
 </div>
364
 </div>
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
 <p>
277
 <p>
369
 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.
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
 </p>
279
 </p>
374
 </p>
283
 </p>
375
 </div>
284
 </div>
376
 </div>
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
 <p>
289
 <p>
381
 A new approach to creating wiki content.
290
 A new approach to creating wiki content.
382
 </p>
291
 </p>
386
 </p>
295
 </p>
387
 </div>
296
 </div>
388
 </div>
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
 <p>
301
 <p>
393
 Federated social network system.
302
 Federated social network system.
394
 </p>
303
 </p>
398
 </p>
307
 </p>
399
 </div>
308
 </div>
400
 </div>
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
 <p>
313
 <p>
405
 Federated social network based on the OStatus protocol. You can "<i>remote follow</i>" other users within the GNU Social federation.
314
 Federated social network based on the OStatus protocol. You can "<i>remote follow</i>" other users within the GNU Social federation.
406
 </p>
315
 </p>
410
 </p>
319
 </p>
411
 </div>
320
 </div>
412
 </div>
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
 <p>
325
 <p>
417
 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.
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
 </p>
327
 </p>
422
 </p>
331
 </p>
423
 </div>
332
 </div>
424
 </div>
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
 <p>
337
 <p>
429
 Databaseless blogging system. Quite simple and with a markdown-like format.
338
 Databaseless blogging system. Quite simple and with a markdown-like format.
430
 </p>
339
 </p>
434
 </p>
343
 </p>
435
 </div>
344
 </div>
436
 </div>
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
 <p>
349
 <p>
441
 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.
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
 </p>
351
 </p>
446
 </p>
355
 </p>
447
 </div>
356
 </div>
448
 </div>
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
 <p>
361
 <p>
453
 Make your own internet radio station.
362
 Make your own internet radio station.
454
 </p>
363
 </p>
458
 </p>
367
 </p>
459
 </div>
368
 </div>
460
 </div>
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
 <p>
373
 <p>
465
 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.
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
 </p>
375
 </p>
470
 </p>
379
 </p>
471
 </div>
380
 </div>
472
 </div>
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
 <p>
385
 <p>
477
 Experimental WebRTC video conferencing system, similar to Google Hangouts. This may not be fully functional, but is hoped to be in the near future.
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
 </p>
387
 </p>
479
 </div>
388
 </div>
480
 </div>
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
 <p>
394
 <p>
486
 A simple kanban system for managing projects or TODO lists.
395
 A simple kanban system for managing projects or TODO lists.
487
 </p>
396
 </p>
491
 </p>
400
 </p>
492
 </div>
401
 </div>
493
 </div>
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
 <p>
406
 <p>
498
 An OpenPGP key server for storing and retrieving GPG public keys.
407
 An OpenPGP key server for storing and retrieving GPG public keys.
499
 </p>
408
 </p>
503
 </p>
412
 </p>
504
 </div>
413
 </div>
505
 </div>
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
 <p>
418
 <p>
510
 Access your music collection from any internet connected device.
419
 Access your music collection from any internet connected device.
511
 </p>
420
 </p>
515
 </p>
424
 </p>
516
 </div>
425
 </div>
517
 </div>
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
 <p>
430
 <p>
522
 Make your photo albums available on the web.
431
 Make your photo albums available on the web.
523
 </p>
432
 </p>
527
 </p>
436
 </p>
528
 </div>
437
 </div>
529
 </div>
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
 <p>
442
 <p>
534
 Modern email client which supports GPG encryption.
443
 Modern email client which supports GPG encryption.
535
 </p>
444
 </p>
539
 </p>
448
 </p>
540
 </div>
449
 </div>
541
 </div>
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
 <p>
454
 <p>
546
 Multi-user chat with some security and moderation controls.
455
 Multi-user chat with some security and moderation controls.
547
 </p>
456
 </p>
551
 </p>
460
 </p>
552
 </div>
461
 </div>
553
 </div>
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
 <p>
466
 <p>
558
 Publicly host video and audio files so that you don't need to use YouTube/Vimeo/etc.
467
 Publicly host video and audio files so that you don't need to use YouTube/Vimeo/etc.
559
 </p>
468
 </p>
563
 </p>
472
 </p>
564
 </div>
473
 </div>
565
 </div>
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
 <p>
478
 <p>
570
 The popular VoIP and text chat system. Say goodbye to old-fashioned telephony conferences with silly dial codes. Also works well on mobile.
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
 </p>
480
 </p>
575
 </p>
484
 </p>
576
 </div>
485
 </div>
577
 </div>
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
 <p>
490
 <p>
582
 Store files on your server and sync them with laptops or mobile devices. Includes many plugins including videoconferencing and collaborative document editing.
491
 Store files on your server and sync them with laptops or mobile devices. Includes many plugins including videoconferencing and collaborative document editing.
583
 </p>
492
 </p>
587
 </p>
496
 </p>
588
 </div>
497
 </div>
589
 </div>
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
 <p>
502
 <p>
594
 Peer-to-peer video hosting. Similar to Mediagoblin, but the P2P aspect better enables the streaming load to be shared across servers.
503
 Peer-to-peer video hosting. Similar to Mediagoblin, but the P2P aspect better enables the streaming load to be shared across servers.
595
 </p>
504
 </p>
599
 </p>
508
 </p>
600
 </div>
509
 </div>
601
 </div>
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
 <p>
514
 <p>
606
 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.
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
 </p>
516
 </p>
611
 </p>
520
 </p>
612
 </div>
521
 </div>
613
 </div>
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
 <p>
526
 <p>
618
 Fediverse instance which is compatible with GNU Social and Mastodon, and suited for systems without much RAM or CPU resource.
527
 Fediverse instance which is compatible with GNU Social and Mastodon, and suited for systems without much RAM or CPU resource.
619
 </p>
528
 </p>
623
 </p>
532
 </p>
624
 </div>
533
 </div>
625
 </div>
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
 <p>
538
 <p>
630
 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.
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
 </p>
540
 </p>
635
 </p>
544
 </p>
636
 </div>
545
 </div>
637
 </div>
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
 <p>
550
 <p>
642
 A pastebin where the server has zero knowledge of the content being pasted.
551
 A pastebin where the server has zero knowledge of the content being pasted.
643
 </p>
552
 </p>
647
 </p>
556
 </p>
648
 </div>
557
 </div>
649
 </div>
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
 <p>
562
 <p>
654
 A shell based XMPP client which you can run on the Freedombone server via ssh.
563
 A shell based XMPP client which you can run on the Freedombone server via ssh.
655
 </p>
564
 </p>
659
 </p>
568
 </p>
660
 </div>
569
 </div>
661
 </div>
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
 <p>
574
 <p>
666
 A browser based user interface for the Matrix federated communications system, including WebRTC audio and video chat.
575
 A browser based user interface for the Matrix federated communications system, including WebRTC audio and video chat.
667
 </p>
576
 </p>
671
 </p>
580
 </p>
672
 </div>
581
 </div>
673
 </div>
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
 <p>
586
 <p>
678
 A non-federated chat server (x86 systems only).
587
 A non-federated chat server (x86 systems only).
679
 </p>
588
 </p>
683
 </p>
592
 </p>
684
 </div>
593
 </div>
685
 </div>
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
 <p>
598
 <p>
690
 A metasearch engine for customised and private web searches.
599
 A metasearch engine for customised and private web searches.
691
 </p>
600
 </p>
695
 </p>
604
 </p>
696
 </div>
605
 </div>
697
 </div>
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
 <p>
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
 </p>
612
 </p>
704
 
613
 
705
 <p>
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
 </p>
616
 </p>
708
 </div>
617
 </div>
709
 </div>
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
 <p>
622
 <p>
714
 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.
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
 </p>
624
 </p>
719
 </p>
628
 </p>
720
 </div>
629
 </div>
721
 </div>
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
 <p>
646
 <p>
726
 Robust and encrypted storage of files on one or more server.
647
 Robust and encrypted storage of files on one or more server.
727
 </p>
648
 </p>
731
 </p>
652
 </p>
732
 </div>
653
 </div>
733
 </div>
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
 <p>
658
 <p>
738
 Client and bootstrap node for the Tox chat/VoIP system.
659
 Client and bootstrap node for the Tox chat/VoIP system.
739
 </p>
660
 </p>
743
 </p>
664
 </p>
744
 </div>
665
 </div>
745
 </div>
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
 <p>
670
 <p>
750
 A system for privately creating and sharing notes and images, similar to Evernote but without the spying.
671
 A system for privately creating and sharing notes and images, similar to Evernote but without the spying.
751
 </p>
672
 </p>
755
 </p>
676
 </p>
756
 </div>
677
 </div>
757
 </div>
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
 <p>
682
 <p>
762
 If you use the Mutt client to read your email then this will set it up to use vim for composing new mail.
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
 </p>
684
 </p>
764
 </div>
685
 </div>
765
 </div>
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
 <p>
691
 <p>
771
 Set up a VPN on your server so that you can bypass local internet censorship.
692
 Set up a VPN on your server so that you can bypass local internet censorship.
772
 </p>
693
 </p>
776
 </p>
697
 </p>
777
 </div>
698
 </div>
778
 </div>
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
 <p>
703
 <p>
783
 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.
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
 </p>
705
 </p>