aboutsummaryrefslogtreecommitdiffstats
path: root/doc/en
diff options
context:
space:
mode:
Diffstat (limited to 'doc/en')
-rw-r--r--doc/en/AdvancedSearch.md53
-rw-r--r--doc/en/Comparison-of-activity-stream-networks.md23
-rw-r--r--doc/en/Creating-Templates.md93
-rw-r--r--doc/en/DerivedTheme1.md101
-rw-r--r--doc/en/Developers.md54
-rw-r--r--doc/en/Features.md108
-rw-r--r--doc/en/Hubzilla_on_OpenShift.bb105
-rw-r--r--doc/en/Plugins.md263
-rw-r--r--doc/en/Primary-Directory.md47
-rw-r--r--doc/en/Remove-Account.md26
-rw-r--r--doc/en/Schema-development.md81
-rw-r--r--doc/en/TermsOfService.md11
-rw-r--r--doc/en/Translations.md93
-rw-r--r--doc/en/Widgets.md174
-rw-r--r--doc/en/Zot---A-High-Level-Overview.md109
-rw-r--r--doc/en/about/about.bb204
-rw-r--r--doc/en/about/about_hub.bb7
-rw-r--r--doc/en/about/project.bb186
-rw-r--r--doc/en/accounts_profiles_channels_basics.bb19
-rw-r--r--doc/en/acl_dialog_post.html16
-rw-r--r--doc/en/addons.bb117
-rw-r--r--doc/en/addons_gnusocial.bb65
-rw-r--r--doc/en/admin/administrator_guide.md464
-rw-r--r--doc/en/admin/hub_snapshots.md127
-rw-r--r--doc/en/admin/zarlog_msgs.md112
-rw-r--r--doc/en/admins.bb15
-rw-r--r--doc/en/api/api_albums.md66
-rw-r--r--doc/en/api/api_filedata.md66
-rw-r--r--doc/en/api/api_files.md103
-rw-r--r--doc/en/api/api_functions.bb133
-rw-r--r--doc/en/api/api_group_members.md133
-rw-r--r--doc/en/api/api_item_update.md225
-rw-r--r--doc/en/api/api_posting.bb24
-rw-r--r--doc/en/api/api_xchan.md44
-rw-r--r--doc/en/api/group.md41
-rw-r--r--doc/en/api/statuses_update.bb23
-rw-r--r--doc/en/bugs.bb32
-rw-r--r--doc/en/campaign.bb237
-rw-r--r--doc/en/checking_account_quota_usage.bb20
-rw-r--r--doc/en/comanche.bb261
-rw-r--r--doc/en/context/de/admin/logs/help.html8
-rw-r--r--doc/en/context/de/admin/queue/help.html4
-rw-r--r--doc/en/context/de/admin/security/help.html4
-rw-r--r--doc/en/context/de/appman/help.html4
-rw-r--r--doc/en/context/de/channel/help.html8
-rw-r--r--doc/en/context/de/chat/help.html8
-rw-r--r--doc/en/context/de/cloud/help.html6
-rw-r--r--doc/en/context/de/connections/help.html8
-rw-r--r--doc/en/context/de/connections/ifpending/help.html8
-rw-r--r--doc/en/context/de/events/help.html8
-rw-r--r--doc/en/context/de/mail/help.html12
-rw-r--r--doc/en/context/de/network/help.html10
-rw-r--r--doc/en/context/de/photos/help.html6
-rw-r--r--doc/en/context/de/profile/help.html6
-rw-r--r--doc/en/context/de/register/help.html12
-rw-r--r--doc/en/context/de/settings/account/help.html19
-rw-r--r--doc/en/context/de/settings/channel/help.html19
-rw-r--r--doc/en/context/de/settings/features/help.html12
-rw-r--r--doc/en/context/de/settings/tokens/help.html20
-rw-r--r--doc/en/context/de/wiki/help.html10
-rw-r--r--doc/en/context/en/admin/addons/assets/addon_repo_gui_1.pngbin0 -> 16983 bytes
-rw-r--r--doc/en/context/en/admin/addons/help.html14
-rw-r--r--doc/en/context/en/admin/logs/help.html8
-rw-r--r--doc/en/context/en/admin/queue/help.html4
-rw-r--r--doc/en/context/en/admin/security/help.html4
-rw-r--r--doc/en/context/en/appman/help.html4
-rw-r--r--doc/en/context/en/cards/help.html20
-rw-r--r--doc/en/context/en/channel/help.html6
-rw-r--r--doc/en/context/en/chat/help.html8
-rw-r--r--doc/en/context/en/cloud/help.html6
-rw-r--r--doc/en/context/en/connections/help.html8
-rw-r--r--doc/en/context/en/connections/ifpending/help.html8
-rw-r--r--doc/en/context/en/connedit/help.html12
-rw-r--r--doc/en/context/en/events/help.html8
-rw-r--r--doc/en/context/en/mail/help.html10
-rw-r--r--doc/en/context/en/network/help.html10
-rw-r--r--doc/en/context/en/photos/help.html6
-rw-r--r--doc/en/context/en/profile/help.html6
-rw-r--r--doc/en/context/en/profiles/help.html35
-rw-r--r--doc/en/context/en/register/help.html12
-rw-r--r--doc/en/context/en/settings/account/help.html35
-rw-r--r--doc/en/context/en/settings/channel/help.html35
-rw-r--r--doc/en/context/en/settings/features/help.html12
-rw-r--r--doc/en/context/en/settings/tokens/help.html23
-rw-r--r--doc/en/context/en/webpages/help.html8
-rw-r--r--doc/en/context/en/wiki/help.html10
l---------doc/en/context/es1
-rw-r--r--doc/en/context/es-es/admin/addons/assets/addon_repo_gui_1.pngbin0 -> 16983 bytes
-rw-r--r--doc/en/context/es-es/admin/addons/help.html14
-rw-r--r--doc/en/context/es-es/admin/logs/help.html9
-rw-r--r--doc/en/context/es-es/admin/queue/help.html4
-rw-r--r--doc/en/context/es-es/admin/security/help.html4
-rw-r--r--doc/en/context/es-es/appman/help.html4
-rw-r--r--doc/en/context/es-es/articles/help.html20
-rw-r--r--doc/en/context/es-es/cards/help.html19
-rw-r--r--doc/en/context/es-es/channel/help.html8
-rw-r--r--doc/en/context/es-es/chat/help.html8
-rw-r--r--doc/en/context/es-es/cloud/help.html6
-rw-r--r--doc/en/context/es-es/connections/help.html15
-rw-r--r--doc/en/context/es-es/connections/ifpending/help.html15
-rw-r--r--doc/en/context/es-es/connedit/help.html12
-rw-r--r--doc/en/context/es-es/events/help.html8
-rw-r--r--doc/en/context/es-es/mail/help.html10
-rw-r--r--doc/en/context/es-es/network/help.html12
-rw-r--r--doc/en/context/es-es/photos/help.html6
-rw-r--r--doc/en/context/es-es/profile/help.html6
-rw-r--r--doc/en/context/es-es/profiles/help.html35
-rw-r--r--doc/en/context/es-es/settings/account/help.html35
-rw-r--r--doc/en/context/es-es/settings/channel/help.html35
-rw-r--r--doc/en/context/es-es/settings/features/help.html12
-rw-r--r--doc/en/context/es-es/settings/tokens/help.html23
-rw-r--r--doc/en/context/es-es/webpages/help.html8
-rw-r--r--doc/en/context/es-es/wiki/help.html10
-rw-r--r--doc/en/context/fr/admin/logs/help.html8
-rw-r--r--doc/en/context/fr/admin/queue/help.html4
-rw-r--r--doc/en/context/fr/appman/help.html5
-rw-r--r--doc/en/context/fr/cards/help.html20
-rw-r--r--doc/en/context/fr/channel/help.html6
-rw-r--r--doc/en/context/fr/chat/help.html8
-rw-r--r--doc/en/context/fr/cloud/help.html7
-rw-r--r--doc/en/context/fr/connections/help.html8
-rw-r--r--doc/en/context/fr/connections/ifpending/help.html8
-rw-r--r--doc/en/context/fr/connedit/help.html13
-rw-r--r--doc/en/context/fr/events/help.html8
-rw-r--r--doc/en/context/fr/mail/help.html10
-rw-r--r--doc/en/context/fr/photos/help.html6
-rw-r--r--doc/en/context/fr/profile/help.html6
-rw-r--r--doc/en/context/fr/settings/account/help.html18
-rw-r--r--doc/en/context/fr/settings/channel/help.html18
-rw-r--r--doc/en/context/fr/settings/features/help.html12
-rw-r--r--doc/en/context/fr/settings/tokens20
-rw-r--r--doc/en/context/fr/webpages/help.html8
-rw-r--r--doc/en/context/fr/wiki/help.html13
-rw-r--r--doc/en/context/it/wiki/help.html10
-rw-r--r--doc/en/context/pl/admin/addons/assets/addon_repo_gui_1.pngbin0 -> 16983 bytes
-rw-r--r--doc/en/context/pl/admin/addons/help.html14
-rw-r--r--doc/en/context/pl/admin/logs/help.html20
-rw-r--r--doc/en/context/pl/admin/queue/help.html7
-rw-r--r--doc/en/context/pl/admin/security/help.html8
-rw-r--r--doc/en/context/pl/appman/help.html10
-rw-r--r--doc/en/context/pl/cards/help.html31
-rw-r--r--doc/en/context/pl/channel/help.html13
-rw-r--r--doc/en/context/pl/chat/help.html19
-rw-r--r--doc/en/context/pl/cloud/help.html17
-rw-r--r--doc/en/context/pl/connections/help.html24
-rw-r--r--doc/en/context/pl/connections/ifpending/help.html24
-rw-r--r--doc/en/context/pl/connedit/help.html44
-rw-r--r--doc/en/context/pl/events/help.html18
-rw-r--r--doc/en/context/pl/mail/help.html25
-rw-r--r--doc/en/context/pl/network/help.html36
-rw-r--r--doc/en/context/pl/photos/help.html15
-rw-r--r--doc/en/context/pl/profile/help.html17
-rw-r--r--doc/en/context/pl/profiles/help.html49
-rw-r--r--doc/en/context/pl/register/help.html54
-rw-r--r--doc/en/context/pl/settings/account/help.html49
-rw-r--r--doc/en/context/pl/settings/channel/help.html49
-rw-r--r--doc/en/context/pl/settings/features/help.html50
-rw-r--r--doc/en/context/pl/settings/tokens/help.html43
-rw-r--r--doc/en/context/pl/webpages/help.html24
-rw-r--r--doc/en/context/pl/wiki/help.html29
-rw-r--r--doc/en/context/ru/cards/help.html16
-rw-r--r--doc/en/context/ru/connections/help.html7
-rw-r--r--doc/en/context/ru/network/help.html9
-rw-r--r--doc/en/database.bb71
-rw-r--r--doc/en/database/db_abook.bb55
-rw-r--r--doc/en/database/db_account.bb66
-rw-r--r--doc/en/database/db_addon.bb24
-rw-r--r--doc/en/database/db_app.bb48
-rw-r--r--doc/en/database/db_attach.bb54
-rw-r--r--doc/en/database/db_auth_codes.bb19
-rw-r--r--doc/en/database/db_cache.bb15
-rw-r--r--doc/en/database/db_channel.bb104
-rw-r--r--doc/en/database/db_chat.bb16
-rw-r--r--doc/en/database/db_chatpresence.bb18
-rw-r--r--doc/en/database/db_chatroom.bb28
-rw-r--r--doc/en/database/db_clients.bb18
-rw-r--r--doc/en/database/db_config.bb14
-rw-r--r--doc/en/database/db_conv.bb25
-rw-r--r--doc/en/database/db_event.bb64
-rw-r--r--doc/en/database/db_fcontact.bb38
-rw-r--r--doc/en/database/db_ffinder.bb14
-rw-r--r--doc/en/database/db_fserver.bb14
-rw-r--r--doc/en/database/db_fsuggest.bb24
-rw-r--r--doc/en/database/db_hook.bb18
-rw-r--r--doc/en/database/db_hubloc.bb38
-rw-r--r--doc/en/database/db_issue.bb20
-rw-r--r--doc/en/database/db_item.bb151
-rw-r--r--doc/en/database/db_item_id.bb16
-rw-r--r--doc/en/database/db_likes.bb24
-rw-r--r--doc/en/database/db_mail.bb34
-rw-r--r--doc/en/database/db_menu.bb16
-rw-r--r--doc/en/database/db_menu_item.bb28
-rw-r--r--doc/en/database/db_notify.bb36
-rw-r--r--doc/en/database/db_obj.bb26
-rw-r--r--doc/en/database/db_outq.bb28
-rw-r--r--doc/en/database/db_pconfig.bb16
-rw-r--r--doc/en/database/db_pgrp.bb18
-rw-r--r--doc/en/database/db_pgrp_member.bb14
-rw-r--r--doc/en/database/db_photo.bb52
-rw-r--r--doc/en/database/db_poll.bb16
-rw-r--r--doc/en/database/db_poll_elm.bb16
-rw-r--r--doc/en/database/db_profdef.bb18
-rw-r--r--doc/en/database/db_profext.bb16
-rw-r--r--doc/en/database/db_profile.bb94
-rw-r--r--doc/en/database/db_profile_check.bb18
-rw-r--r--doc/en/database/db_register.bb18
-rw-r--r--doc/en/database/db_session.bb14
-rw-r--r--doc/en/database/db_shares.bb14
-rw-r--r--doc/en/database/db_sign.bb18
-rw-r--r--doc/en/database/db_site.bb28
-rw-r--r--doc/en/database/db_source.bb16
-rw-r--r--doc/en/database/db_spam.bb18
-rw-r--r--doc/en/database/db_sys_perms.bb16
-rw-r--r--doc/en/database/db_term.bb28
-rw-r--r--doc/en/database/db_tokens.bb18
-rw-r--r--doc/en/database/db_updates.bb20
-rw-r--r--doc/en/database/db_verify.bb18
-rw-r--r--doc/en/database/db_vote.bb16
-rw-r--r--doc/en/database/db_xchan.bb59
-rw-r--r--doc/en/database/db_xchat.bb16
-rw-r--r--doc/en/database/db_xconfig.bb16
-rw-r--r--doc/en/database/db_xign.bb13
-rw-r--r--doc/en/database/db_xlink.bb22
-rw-r--r--doc/en/database/db_xprof.bb37
-rw-r--r--doc/en/database/db_xtag.bb14
-rw-r--r--doc/en/dev-function-overview.md51
-rw-r--r--doc/en/dev_beginner.bb419
-rw-r--r--doc/en/develop.bb31
-rw-r--r--doc/en/developer/api_zot.bb766
-rw-r--r--doc/en/developer/covenant.bb47
-rw-r--r--doc/en/developer/developer_guide.bb176
-rw-r--r--doc/en/developer/testing.md130
-rw-r--r--doc/en/developer/unorganized.md73
-rw-r--r--doc/en/developer/zot_protocol.bb478
-rw-r--r--doc/en/developer_function_primer.bb47
-rw-r--r--doc/en/developers.bb71
-rw-r--r--doc/en/diaspora_compat.bb68
-rw-r--r--doc/en/directories.bb95
-rw-r--r--doc/en/dnt-policy.txt218
-rw-r--r--doc/en/doco.bb33
-rw-r--r--doc/en/encryption.bb18
-rw-r--r--doc/en/external-resource-links.bb21
-rw-r--r--doc/en/extra_features.bb98
-rw-r--r--doc/en/faq_admins.bb78
-rw-r--r--doc/en/feature/access_tokens.bb47
-rw-r--r--doc/en/feature/additional/access.md41
-rw-r--r--doc/en/feature/additional/composition.md67
-rw-r--r--doc/en/feature/additional/filtering.md57
-rw-r--r--doc/en/feature/additional/general.md130
-rw-r--r--doc/en/feature/additional/overview.md33
-rw-r--r--doc/en/feature/additional/posts.md57
-rw-r--r--doc/en/federate.bb71
-rw-r--r--doc/en/filesync.md61
-rw-r--r--doc/en/first-post.bb3
-rw-r--r--doc/en/gdpr1.md114
-rw-r--r--doc/en/general.bb18
-rw-r--r--doc/en/git_for_non_developers.bb71
-rw-r--r--doc/en/hidden_configs.bb127
-rw-r--r--doc/en/hook/about_hook.bb1
-rw-r--r--doc/en/hook/accept_follow.bb1
-rw-r--r--doc/en/hook/account_downgrade.bb1
-rw-r--r--doc/en/hook/account_settings.bb1
-rw-r--r--doc/en/hook/account_settings_post.bb1
-rw-r--r--doc/en/hook/activity_decode_mapper.bb1
-rw-r--r--doc/en/hook/activity_filter.bb1
-rw-r--r--doc/en/hook/activity_mapper.bb1
-rw-r--r--doc/en/hook/activity_obj_decode_mapper.bb1
-rw-r--r--doc/en/hook/activity_obj_mapper.bb1
-rw-r--r--doc/en/hook/activity_order.bb1
-rw-r--r--doc/en/hook/activity_received.bb1
-rw-r--r--doc/en/hook/addon_app_installed_filter.bb18
-rw-r--r--doc/en/hook/affinity_labels.bb1
-rw-r--r--doc/en/hook/api_perm_is_allowed.bb1
-rw-r--r--doc/en/hook/app_destroy.bb4
-rw-r--r--doc/en/hook/app_installed_filter.bb17
-rw-r--r--doc/en/hook/atom_author.bb1
-rw-r--r--doc/en/hook/atom_entry.bb1
-rw-r--r--doc/en/hook/atom_feed.bb1
-rw-r--r--doc/en/hook/atom_feed_end.bb1
-rw-r--r--doc/en/hook/attach_delete.bb11
-rw-r--r--doc/en/hook/attach_upload_file.bb1
-rw-r--r--doc/en/hook/authenticate.bb29
-rw-r--r--doc/en/hook/author_is_pmable.bb14
-rw-r--r--doc/en/hook/bb2diaspora.bb1
-rw-r--r--doc/en/hook/bbcode.bb6
-rw-r--r--doc/en/hook/bbcode_filter.bb7
-rw-r--r--doc/en/hook/build_pagehead.bb2
-rw-r--r--doc/en/hook/can_comment_on_post.bb13
-rw-r--r--doc/en/hook/change_channel.bb11
-rw-r--r--doc/en/hook/channel_links.bb12
-rw-r--r--doc/en/hook/channel_remove.bb1
-rw-r--r--doc/en/hook/chat_message.bb1
-rw-r--r--doc/en/hook/chat_post.bb1
-rw-r--r--doc/en/hook/check_account_email.bb1
-rw-r--r--doc/en/hook/check_account_invite.bb1
-rw-r--r--doc/en/hook/check_account_password.bb17
-rw-r--r--doc/en/hook/check_channelallowed.bb11
-rw-r--r--doc/en/hook/check_siteallowed.bb10
-rw-r--r--doc/en/hook/collect_public_recipients.bb42
-rw-r--r--doc/en/hook/comments_are_now_closed.bb11
-rw-r--r--doc/en/hook/connect_premium.bb1
-rw-r--r--doc/en/hook/connection_remove.bb9
-rw-r--r--doc/en/hook/connector_settings.bb1
-rw-r--r--doc/en/hook/construct_page.bb1
-rw-r--r--doc/en/hook/contact_block_end.bb1
-rw-r--r--doc/en/hook/contact_edit.bb1
-rw-r--r--doc/en/hook/contact_edit_post.bb1
-rw-r--r--doc/en/hook/contact_select_options.bb1
-rw-r--r--doc/en/hook/content_security_policy.bb39
-rw-r--r--doc/en/hook/conversation_start.bb1
-rw-r--r--doc/en/hook/create_identity.bb1
-rw-r--r--doc/en/hook/cron.bb5
-rw-r--r--doc/en/hook/cron_daily.bb3
-rw-r--r--doc/en/hook/cron_weekly.bb3
-rw-r--r--doc/en/hook/crypto_methods.bb5
-rw-r--r--doc/en/hook/daemon_addon.bb15
-rw-r--r--doc/en/hook/daemon_master_release.bb5
-rw-r--r--doc/en/hook/directory_item.bb1
-rw-r--r--doc/en/hook/discover_channel_webfinger.bb14
-rw-r--r--doc/en/hook/display_item.bb1
-rw-r--r--doc/en/hook/display_settings.bb1
-rw-r--r--doc/en/hook/display_settings_post.bb1
-rw-r--r--doc/en/hook/donate_contributors.bb1
-rw-r--r--doc/en/hook/donate_plugin.bb1
-rw-r--r--doc/en/hook/donate_sponsors.bb1
-rw-r--r--doc/en/hook/dreport_is_storable.bb1
-rw-r--r--doc/en/hook/dreport_process.bb7
-rw-r--r--doc/en/hook/drop_item.bb1
-rw-r--r--doc/en/hook/dropdown_extras.bb17
-rw-r--r--doc/en/hook/encode_object.bb1
-rw-r--r--doc/en/hook/enotify.bb1
-rw-r--r--doc/en/hook/enotify_mail.bb1
-rw-r--r--doc/en/hook/enotify_store.bb1
-rw-r--r--doc/en/hook/event_created.bb1
-rw-r--r--doc/en/hook/event_store_event.bb11
-rw-r--r--doc/en/hook/event_updated.bb1
-rw-r--r--doc/en/hook/externals_url_select.bb1
-rw-r--r--doc/en/hook/feature_enabled.bb1
-rw-r--r--doc/en/hook/feature_settings.bb1
-rw-r--r--doc/en/hook/feature_settings_post.bb1
-rw-r--r--doc/en/hook/fetch_and_store.bb1
-rw-r--r--doc/en/hook/follow.bb1
-rw-r--r--doc/en/hook/follow_allow.bb1
-rw-r--r--doc/en/hook/gender_selector.bb1
-rw-r--r--doc/en/hook/gender_selector_min.bb1
-rw-r--r--doc/en/hook/generate_map.bb1
-rw-r--r--doc/en/hook/generate_named_map.bb1
-rw-r--r--doc/en/hook/get_all_api_perms.bb1
-rw-r--r--doc/en/hook/get_all_perms.bb1
-rw-r--r--doc/en/hook/get_default_export_sections10
-rw-r--r--doc/en/hook/get_features.bb1
-rw-r--r--doc/en/hook/get_photo.bb14
-rw-r--r--doc/en/hook/get_profile_photo.bb18
-rw-r--r--doc/en/hook/get_role_perms.bb1
-rw-r--r--doc/en/hook/global_permissions.bb1
-rw-r--r--doc/en/hook/home_content.bb1
-rw-r--r--doc/en/hook/home_init.bb1
-rw-r--r--doc/en/hook/hostxrd.bb1
-rw-r--r--doc/en/hook/html2bbcode.bb1
-rw-r--r--doc/en/hook/identity_basic_export.bb10
-rw-r--r--doc/en/hook/import_author_xchan.bb1
-rw-r--r--doc/en/hook/import_channel.bb1
-rw-r--r--doc/en/hook/import_directory_profile.bb1
-rw-r--r--doc/en/hook/import_xchan.bb1
-rw-r--r--doc/en/hook/item_custom.bb24
-rw-r--r--doc/en/hook/item_photo_menu.bb1
-rw-r--r--doc/en/hook/item_store.bb1
-rw-r--r--doc/en/hook/item_store_update.bb1
-rw-r--r--doc/en/hook/item_stored.bb18
-rw-r--r--doc/en/hook/item_stored_update.bb15
-rw-r--r--doc/en/hook/item_translate.bb1
-rw-r--r--doc/en/hook/jot_header_tpl_filter.bb5
-rw-r--r--doc/en/hook/jot_networks.bb1
-rw-r--r--doc/en/hook/jot_tool.bb1
-rw-r--r--doc/en/hook/jot_tpl_filter.bb5
-rw-r--r--doc/en/hook/legal_webbie.bb10
-rw-r--r--doc/en/hook/legal_webbie_text.bb7
-rw-r--r--doc/en/hook/load_pdl.bb1
-rw-r--r--doc/en/hook/local_dir_update.bb1
-rw-r--r--doc/en/hook/logged_in.bb1
-rw-r--r--doc/en/hook/logger.bb16
-rw-r--r--doc/en/hook/logging_out.bb1
-rw-r--r--doc/en/hook/login_hook.bb1
-rw-r--r--doc/en/hook/magic_auth.bb1
-rw-r--r--doc/en/hook/magic_auth_openid_success.bb1
-rw-r--r--doc/en/hook/magic_auth_success.bb1
-rw-r--r--doc/en/hook/main_slider.bb1
-rw-r--r--doc/en/hook/marital_selector.bb1
-rw-r--r--doc/en/hook/marital_selector_min.bb1
-rw-r--r--doc/en/hook/markdown_to_bb.bb5
-rw-r--r--doc/en/hook/module_loaded.bb1
-rw-r--r--doc/en/hook/module_mod_aftercontent.bb12
-rw-r--r--doc/en/hook/module_mod_content.bb10
-rw-r--r--doc/en/hook/module_mod_init.bb1
-rw-r--r--doc/en/hook/module_mod_post.bb1
-rw-r--r--doc/en/hook/mood_verbs.bb1
-rw-r--r--doc/en/hook/nav.bb28
-rw-r--r--doc/en/hook/network_content_init.bb1
-rw-r--r--doc/en/hook/network_ping.bb1
-rw-r--r--doc/en/hook/network_to_name.bb1
-rw-r--r--doc/en/hook/notifier_end.bb1
-rw-r--r--doc/en/hook/notifier_hub.bb1
-rw-r--r--doc/en/hook/notifier_normal.bb1
-rw-r--r--doc/en/hook/obj_verbs.bb1
-rw-r--r--doc/en/hook/oembed_probe.bb1
-rw-r--r--doc/en/hook/other_encapsulate.bb7
-rw-r--r--doc/en/hook/other_unencapsulate.bb5
-rw-r--r--doc/en/hook/page_content_top.bb1
-rw-r--r--doc/en/hook/page_end.bb1
-rw-r--r--doc/en/hook/page_header.bb1
-rw-r--r--doc/en/hook/page_meta.bb13
-rw-r--r--doc/en/hook/parse_atom.bb1
-rw-r--r--doc/en/hook/parse_link.bb1
-rw-r--r--doc/en/hook/pdl_selector.bb1
-rw-r--r--doc/en/hook/perm_is_allowed.bb1
-rw-r--r--doc/en/hook/permissions_create.bb1
-rw-r--r--doc/en/hook/permissions_update.bb1
-rw-r--r--doc/en/hook/permit_hook.bb0
-rw-r--r--doc/en/hook/personal_xrd.bb1
-rw-r--r--doc/en/hook/photo_post_end.bb1
-rw-r--r--doc/en/hook/photo_upload_begin.bb1
-rw-r--r--doc/en/hook/photo_upload_end.bb1
-rw-r--r--doc/en/hook/photo_upload_file.bb1
-rw-r--r--doc/en/hook/photo_upload_form.bb1
-rw-r--r--doc/en/hook/photo_view_filter.bb1
-rw-r--r--doc/en/hook/poke_verbs.bb1
-rw-r--r--doc/en/hook/post_local.bb1
-rw-r--r--doc/en/hook/post_local_end.bb1
-rw-r--r--doc/en/hook/post_local_start.bb1
-rw-r--r--doc/en/hook/post_mail.bb1
-rw-r--r--doc/en/hook/post_mail_end.bb1
-rw-r--r--doc/en/hook/post_remote.bb1
-rw-r--r--doc/en/hook/post_remote_end.bb1
-rw-r--r--doc/en/hook/post_remote_update.bb1
-rw-r--r--doc/en/hook/post_remote_update_end.bb1
-rw-r--r--doc/en/hook/prepare_body.bb1
-rw-r--r--doc/en/hook/prepare_body_final.bb1
-rw-r--r--doc/en/hook/prepare_body_init.bb1
-rw-r--r--doc/en/hook/privacygroup_extras.bb12
-rw-r--r--doc/en/hook/privacygroup_extras_drop.bb11
-rw-r--r--doc/en/hook/privacygroup_extras_post.bb11
-rw-r--r--doc/en/hook/proc_run.bb1
-rw-r--r--doc/en/hook/process_channel_sync_delivery.bb1
-rw-r--r--doc/en/hook/profile_advanced.bb1
-rw-r--r--doc/en/hook/profile_edit.bb1
-rw-r--r--doc/en/hook/profile_photo_content_end.bb1
-rw-r--r--doc/en/hook/profile_post.bb1
-rw-r--r--doc/en/hook/profile_sidebar.bb1
-rw-r--r--doc/en/hook/profile_sidebar_enter.bb1
-rw-r--r--doc/en/hook/register_account.bb1
-rw-r--r--doc/en/hook/render_location.bb1
-rw-r--r--doc/en/hook/replace_macros.bb1
-rw-r--r--doc/en/hook/reverse_magic_auth.bb1
-rw-r--r--doc/en/hook/settings_form.bb1
-rw-r--r--doc/en/hook/settings_post.bb1
-rw-r--r--doc/en/hook/sexpref_selector.bb1
-rw-r--r--doc/en/hook/sexpref_selector_min.bb1
-rw-r--r--doc/en/hook/smilie.bb19
-rw-r--r--doc/en/hook/status_editor.bb31
-rw-r--r--doc/en/hook/stream_item.bb13
-rw-r--r--doc/en/hook/system_app_installed_filter.bb18
-rw-r--r--doc/en/hook/tagged.bb16
-rw-r--r--doc/en/hook/update_unseen.bb9
-rw-r--r--doc/en/hook/validate_channelname.bb23
-rw-r--r--doc/en/hook/webfinger.bb1
-rw-r--r--doc/en/hook/well_known.bb1
-rw-r--r--doc/en/hook/wiki_preprocess.bb11
-rw-r--r--doc/en/hook/zid.bb1
-rw-r--r--doc/en/hook/zid_init.bb1
-rw-r--r--doc/en/hook/zot_best_algorithm.bb3
-rw-r--r--doc/en/hook/zot_finger.bb1
-rw-r--r--doc/en/hooklist.bb698
-rw-r--r--doc/en/hooks.html1
-rw-r--r--doc/en/intro_for_developers.bb113
-rw-r--r--doc/en/macros/addons_footer.bb2
-rw-r--r--doc/en/macros/cloud_footer.bb2
-rw-r--r--doc/en/macros/de/addons_footer.bb2
-rw-r--r--doc/en/macros/de/cloud_footer.bb2
-rw-r--r--doc/en/macros/de/main_footer.bb1
-rw-r--r--doc/en/macros/de/troubleshooting_footer.bb2
-rw-r--r--doc/en/macros/main_footer.bb1
-rw-r--r--doc/en/macros/pl/addons_footer.bb2
-rw-r--r--doc/en/macros/pl/cloud_footer.bb2
-rw-r--r--doc/en/macros/pl/main_footer.bb1
-rw-r--r--doc/en/macros/pl/troubleshooting_footer.bb2
-rw-r--r--doc/en/macros/troubleshooting_footer.bb2
-rw-r--r--doc/en/member/assets/bookmarker-save-icon.pngbin0 -> 33987 bytes
-rw-r--r--doc/en/member/assets/bookmarks-menu-dropdown.pngbin0 -> 53526 bytes
-rw-r--r--doc/en/member/assets/privacy-group-tool-public.pngbin0 -> 39262 bytes
-rw-r--r--doc/en/member/assets/privacy-tool-3.pngbin0 -> 140093 bytes
-rw-r--r--doc/en/member/assets/qr_text_to_post.pngbin0 -> 273 bytes
-rw-r--r--doc/en/member/assets/zat_dialog.pngbin0 -> 81837 bytes
-rw-r--r--doc/en/member/bbcode.html337
-rw-r--r--doc/en/member/member_faq.bb10
-rw-r--r--doc/en/member/member_guide.bb1081
-rw-r--r--doc/en/plugins.bb312
-rw-r--r--doc/en/problems-following-an-update.bb38
-rw-r--r--doc/en/red2pi.bb342
-rw-r--r--doc/en/roadmap.bb28
-rw-r--r--doc/en/schema_development.bb78
-rw-r--r--doc/en/schemaspy_hubzilla/zot.meta.xml283
-rw-r--r--doc/en/sql_conventions.bb91
-rw-r--r--doc/en/toc.html75
-rw-r--r--doc/en/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.pngbin0 -> 249151 bytes
-rw-r--r--doc/en/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.pngbin0 -> 293314 bytes
-rw-r--r--doc/en/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.pngbin0 -> 178913 bytes
-rw-r--r--doc/en/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.pngbin0 -> 43797 bytes
-rw-r--r--doc/en/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.pngbin0 -> 46752 bytes
-rw-r--r--doc/en/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.pngbin0 -> 257211 bytes
-rw-r--r--doc/en/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.pngbin0 -> 91478 bytes
-rw-r--r--doc/en/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.pngbin0 -> 293611 bytes
-rw-r--r--doc/en/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.pngbin0 -> 318766 bytes
-rw-r--r--doc/en/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.pngbin0 -> 298857 bytes
-rw-r--r--doc/en/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.pngbin0 -> 532838 bytes
-rw-r--r--doc/en/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.pngbin0 -> 137827 bytes
-rw-r--r--doc/en/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.pngbin0 -> 466641 bytes
-rw-r--r--doc/en/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.pngbin0 -> 240495 bytes
-rw-r--r--doc/en/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.pngbin0 -> 665755 bytes
-rw-r--r--doc/en/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.pngbin0 -> 324092 bytes
-rw-r--r--doc/en/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.pngbin0 -> 466584 bytes
-rw-r--r--doc/en/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.pngbin0 -> 155763 bytes
-rw-r--r--doc/en/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.pngbin0 -> 134643 bytes
-rw-r--r--doc/en/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.pngbin0 -> 306069 bytes
-rw-r--r--doc/en/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.pngbin0 -> 57185 bytes
-rw-r--r--doc/en/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.pngbin0 -> 255688 bytes
-rw-r--r--doc/en/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.pngbin0 -> 83265 bytes
-rw-r--r--doc/en/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.pngbin0 -> 264916 bytes
-rw-r--r--doc/en/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.pngbin0 -> 68194 bytes
-rw-r--r--doc/en/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.pngbin0 -> 99210 bytes
-rw-r--r--doc/en/tutorials/personal_channel.html162
530 files changed, 16136 insertions, 0 deletions
diff --git a/doc/en/AdvancedSearch.md b/doc/en/AdvancedSearch.md
new file mode 100644
index 000000000..a67c1fc1f
--- /dev/null
+++ b/doc/en/AdvancedSearch.md
@@ -0,0 +1,53 @@
+Advanced Directory Search
+=========================
+
+
+Advanced Directory Search is enabled in "Expert Mode" from your Settings => Additional features page.
+
+On the Directory page an option named "Advanced" will apear in the "Find Channels" widget (typically in the sidebar). Clicking "Advanced" will open another search box for entering advanced search requests.
+
+Advanced requests include
+
+* name=xxx
+[Channel name contains xxx]
+
+* address=xxx
+[Channel address (webbie) contains xxx]
+
+* locale=xxx
+[Locale (typically 'city') contains xxx]
+
+* region=xxx
+[Region (state/territory) contains xxx]
+
+* postcode=xxx
+[Postcode or zip code contains xxx]
+
+* country=xxx
+[Country name contains xxx]
+
+* gender=xxx
+[Gender contains xxx]
+
+* marital=xxx
+[Marital status contains xxx]
+
+* sexual=xxx
+[Sexual preference contains xxx]
+
+* keywords=xxx
+[Keywords contain xxx]
+
+There are many reasons why a match may not return what you're looking for, as many channels do not provide detailed information in their default (public) profile, and many of these fields allow free-text input in several languages - and this may be difficult to match precisely. For instance you may have better results finding somebody in the USA with 'country=u' (along with some odd channels from Deutschland and Bulgaria and Australia) because this could be represented in a profile as US, U.S.A, USA, United States, etc...
+
+Future revisions of this tool may try to smooth over some of these difficulties.
+
+Requests may be joined together with 'and', 'or', and 'and not'.
+
+Terms containing spaces must be quoted.
+
+Example:
+
+ name="charlie brown" and country=canada and not gender=female
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Comparison-of-activity-stream-networks.md b/doc/en/Comparison-of-activity-stream-networks.md
new file mode 100644
index 000000000..d76ae1006
--- /dev/null
+++ b/doc/en/Comparison-of-activity-stream-networks.md
@@ -0,0 +1,23 @@
+Comparison of different server-client networks providing activity streams to users
+====================================
+The goal of this table was to provide an overview of the security and privacy provided by server-client networks providing activity-streams.
+
+| project | license | distributed | supports node isolation | server-to-server encryption | 1-click E2EE* | database encryption sceme | supports cloning[^5] | encryption of private messages | PFS chat | wall-to-wall interaction | supports post editing and unsend private message | other |
+|-----------+---------------+-------------+-------------------------+-------------------------------------------+------------------------------------------+-----------------------------------------------------+-------------------------+-------------------------------------------------------------------------------------------------+-----------------------------------------------+--------------------------------------------------------------+--------------------------------------------------+------------------------------------------------------------------------------|
+| hubzilla | ISC aka MIT | yes | yes | Zot (PKI) + TLS | yes (via JavaScript, AES-256) | content obfuscation, private keys hidden in the DB. | yes, partly implemented | impossible to message privately in plaintext | no | yes, multiple separated channels possible within one account | yes | privacy built in, run your own @ home, nodes are called hubs |
+| diaspora | AGPLv3orlater | yes | no[^1] | PKI + SSL/TLS[^1] | no[^2] | mostly plaintext | no | ? | no | yes, no naming policy | no | nodes are called pods |
+| facebook | proprietary | no | no | planned, probably not implemented yet[^3] | implemented but not offered to users[^4] | unknown | no, walled garden | no, 3-d party plugin Cryptocat and pidgin is availiable but the user is not informed about this | no, with Cryptocat: yes, with pidgin+OTR: yes | only one wall allowed | only post editing | "real name"-policy enforced, advertising-driven, for profit company US-based |
+| twitter | proprietary | no | no | unknown | no | unknown, probably none | no, walled garden | no | no | yes | only post editing | advertising-driven, for profit company US-based |
+| | | | | | | | | | | | | |
+
+This table was edited with emacs using org-mode.
+
+[^1]: https://wiki.diasporafoundation.org/Federation_protocol_overview
+
+[^2]: forks providing this exists
+
+[^3]: http://news.softpedia.com/news/Facebook-Aims-to-Encrypt-Everything-Between-Data-Centers-433091.shtml
+
+[^4]: http://www.computerworld.com/article/2488773/cybercrime-hacking/facebook-holds-back-on-end-to-end-encryption.html
+
+[^5]: see the hubzilla help files for details about this feature.
diff --git a/doc/en/Creating-Templates.md b/doc/en/Creating-Templates.md
new file mode 100644
index 000000000..fc3f18dd3
--- /dev/null
+++ b/doc/en/Creating-Templates.md
@@ -0,0 +1,93 @@
+Creating Page Templates
+=======================
+
+
+A page template for use with Comanche requires two files - a PHP template and a CSS file. Page templates will need to be installed by the system administrator of your site.
+
+
+First choose a name. Here we'll create a template and call it "demo".
+
+You will need to create the files "view/php/demo.php" and "view/css/demo.css" to hold the PHP template and CSS respectively.
+
+To get a better idea of this process, let's look at an existing template - the "default" template. This is used by default throughout the application.
+
+view/php/default.php
+====================
+
+ <!DOCTYPE html >
+ <html>
+ <head>
+ <title><?php if(x($page,'title')) echo $page['title'] ?></title>
+ <script>var baseurl="<?php echo z_root() ?>";</script>
+ <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
+ </head>
+ <body>
+ <?php if(x($page,'nav')) echo $page['nav']; ?>
+ <aside id="region_1"><?php if(x($page,'aside')) echo $page['aside']; ?></aside>
+ <section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?>
+ <div id="page-footer"></div>
+ <div id="pause"></div>
+ </section>
+ <aside id="region_3"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
+ <footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
+ </body>
+ </html>
+
+
+Here's is the corresponding CSS file
+
+view/php/default.css
+====================
+
+
+ aside#region_1 {
+ display: block;
+ width: 210px;
+ position: absolute;
+ top: 65px;
+ left: 0;
+ margin-left: 10px;
+ }
+
+ aside input[type='text'] {
+ width: 174px;
+ }
+
+
+ section {
+ position: absolute;
+ top: 65px;
+ left: 250px;
+ display: block;
+ right: 15px;
+ padding-bottom: 350px;
+ }
+
+
+Some things you may notice when looking at these definitions:
+
+* We have not specified any CSS for the "nav", "right_aside", or "footer" regions. In this template "nav" and "footer" will be the full page width and we will let the size and placement of these elements be controlled by the theme. "right_aside" is not currently used.
+
+* There are elements on the page such as "page-footer" and "pause" for which there is no apparent content. This content will come from Javascript elements.
+
+* Our default template uses absolute positioning. Modern web design often uses "float" div containers so that scrollbars aren't typically needed when viewing on small-screen devices.
+
+To design a new template, it is best to start with an existing template, and modify it as desired. That is what we will do here.
+
+The way that Comanche provides content inside a specific region is by using a region tag.
+
+ [region=aside][widget=profile][/widget][/region]
+
+This example will place a "profile" widget in the "aside" region. But what it actually does is place the HTML for the widget into a code variable **$page['aside']**. Our default page template defines a region on the page (the CSS positions this as an absolute sidebar) and then inserts the contents of $page['aside'] (if it exists).
+
+So if you wanted to create a template with a region named "foo", you would provide a place for it on the page, then include the contents of $page['foo'] wherever you wanted to use it, and then using Comanche, you could specify
+
+ [region=foo][widget=profile][/widget][/region]
+
+and this would place a profile widget into the "foo" region you created.
+
+Use the CSS file to position the region on the page where desired and optionally control its size.
+
+[To be continued]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/DerivedTheme1.md b/doc/en/DerivedTheme1.md
new file mode 100644
index 000000000..b120c628c
--- /dev/null
+++ b/doc/en/DerivedTheme1.md
@@ -0,0 +1,101 @@
+Creating a Derived Theme
+========================
+
+**Lesson 1**
+
+A derived theme takes most of the settings from its "parent" theme and lets you change a few things to your liking without creating an entire theme package.
+
+
+To create a derived theme, first choose a name. For our example we'll call our theme 'mytheme'. Hopefully you'll be a bit more creative. But throughout this document, wherever you see 'mytheme', replace that with the name you chose.
+
+**Directory Structure**
+
+First you need to create a theme directory structure. We'll keep it simple. We need a php directory and a css directory. Here are the Unix/Linux commands to do this. Assume that 'mywebsite' is your top level $Projectname folder.
+
+
+ cd mywebsite
+ mkdir view/theme/mytheme
+ mkdir view/theme/mytheme/css
+ mkdir view/theme/mytheme/php
+
+
+Great. Now we need a couple of files. The first one is your theme info file, which describes the theme.
+
+It will be called view/theme/mytheme/php/theme.php (clever name huh?)
+
+Inside it, put the following information - edit as needed
+
+ <?php
+
+ /**
+ * * Name: Mytheme
+ * * Description: Sample Derived theme
+ * * Version: 1.0
+ * * Author: Your Name
+ * * Compat: Red [*]
+ *
+ */
+
+ function mytheme_init(&$a) {
+
+ App::$theme_info['extends'] = 'redbasic';
+
+
+ }
+
+
+Remember to rename the mytheme_init function with your theme name. In this case we will be extending the theme 'redbasic'.
+
+
+Now create another file. We call this a PCSS file, but it's really a PHP file.
+
+The file is called view/theme/mytheme/php/style.php
+
+In it, put the following:
+
+ <?php
+
+ require_once('view/theme/redbasic/php/style.php');
+
+ echo @file_get_contents('view/theme/mytheme/css/style.css');
+
+
+
+That's it. This tells the software to read the PCSS information for the redbasic theme first, and then read our CSS file which will just consist of changes we want to make from our parent theme (redbasic).
+
+Now create the actual CSS file for your theme. Put it in view/theme/mytheme/css/style.css (where we just told the software to look for it). For our example, we'll just change the body background color so you can see that it works. You can use any CSS you'd like.
+
+
+ body {
+ background-color: #DDD;
+ }
+
+
+You've just successfully created a derived theme. This needs to be enabled in the admin "themes" panel, and then anybody on the site can use it by selecting it in Settings->Display Settings as their default theme.
+
+**Lesson 2**
+
+If you want to use the redbasic schemas for your derived theme, you have to do a bit more.
+
+Do everything as above, but don't create view/theme/mytheme/php/style.php, but copy instead view/theme/redbasic/php/style.php to view/theme/mytheme/php/style.php. Modify that file and remove (or comment out) these two lines:
+
+ if(local_channel() && App::$channel && App::$channel['channel_theme'] != 'redbasic')
+ set_pconfig(local_channel(), 'redbasic', 'schema', '---');
+
+Also add this line at the bottom:
+
+ echo @file_get_contents('view/theme/mytheme/css/style.css');
+
+To show the schema selector you have to copy view/theme/redbasic/tpl/theme_settings.tpl to view/theme/mytheme/tpl/theme_settings.tpl. Modify that file and replace the lines:
+
+ {{if $theme == redbasic}}
+ {{include file="field_select.tpl" field=$schema}}
+ {{/if}}
+
+with:
+
+ {{include file="field_select.tpl" field=$schema}}
+
+
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Developers.md b/doc/en/Developers.md
new file mode 100644
index 000000000..624c058d2
--- /dev/null
+++ b/doc/en/Developers.md
@@ -0,0 +1,54 @@
+Developer Guide
+===================
+
+**Here is how you can join us.**
+
+First, get yourself a working git package on the system where you will be
+doing development.
+
+Create your own github account.
+
+You may fork/clone the $Projectname repository from [https://framagit.org/hubzilla/core.git](https://framagit.org/hubzilla/core.git).
+
+Follow the instructions provided here: [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/)
+to create and use your own tracking fork on framagit
+
+Then go to your framagit page and create a "Pull request" when you are ready
+to notify us to merge your work.
+
+**Translations**
+
+Our translations are managed through Transifex. If you wish to help out translating $Projectname to another language, sign up on transifex.com, visit [https://www.transifex.com/projects/p/hubzilla/](https://www.transifex.com/projects/p/hubzilla/) and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+[Translations - More Info](help/Translations)
+
+**Important**
+
+Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+
+**Licensing**
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+**Coding Style**
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+
+* All comments should be in English.
+
+* We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
+
+* Indentation is accomplished primarily with tabs using a tab-width of 4.
+
+* String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
+
+* Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
+
+* Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
+
+* Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Features.md b/doc/en/Features.md
new file mode 100644
index 000000000..a43fd73fa
--- /dev/null
+++ b/doc/en/Features.md
@@ -0,0 +1,108 @@
+Extra Features
+==============
+
+The default interface of $Projectname was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the [Extra Features](settings/features) link of your [Settings](settings) page.
+
+**Content Expiration**
+
+Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in "yyyy-mm-dd hh:mm" format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as "next Thursday" or "+1 day". At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed.
+
+**Multiple Profiles**
+
+The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned.
+
+**Web Pages**
+
+Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks.
+
+**Private Notes**
+
+On pages where it is available (your matrix page and personal web pages) provide a "widget" to create and store personal reminders and notes.
+
+**Enhanced Photo Albums**
+
+Provides a photo album viewer that is a bit prettier than the normal interface.
+
+**Extended Identity Sharing**
+
+By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix.
+
+**Expert Mode**
+
+This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking.
+
+**Premium Channel**
+
+This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect.
+
+
+**Richtext Editor**
+
+The status post editor is plaintext, but the matrix allows a wide range of markup using BBcode. The visual editor provides "what you see is what you get" for many of the most frequently used markup tags.
+
+**Post Preview**
+
+Allows previewing posts and comments exactly as they would look on the page before publishing them.
+
+**Channel Sources**
+
+Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel.
+
+**Even More Encryption**
+
+Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content "end-to-end" with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as "the name of aunt Claire's first dog".
+
+
+**Search by Date**
+
+This provides the ability to select posts by date ranges
+
+**Privacy Group Filter**
+
+Enable widget to display stream posts only from selected groups of connection. This also toggles the outbound permissions while you are viewing a privacy group. This is analogous to Google "circles" or Disapora "aspects".
+
+**Saved Searches**
+
+Provides a search widget on your matrix page which can save selected search terms for re-use.
+
+**Personal Tab**
+
+Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation.
+
+**New Tab**
+
+Enables a tab to display all new matrix activity as a firehose or timeline.
+
+**Affinity Tool**
+
+Filter matrix stream activity by the depth of your relationships
+
+**Edit Sent Posts**
+
+Edit and correct posts and comments after sending
+
+**Tagging**
+
+Ability to tag existing posts, including those written by others.
+
+**Post Categories**
+
+Add categories to your channel posts
+
+**Saved Folders**
+
+Ability to file posts under folders or tags for later recall
+
+**Dislike Posts**
+
+Ability to dislike posts/comments
+
+**Star Posts**
+
+Ability to mark special posts with a star indicator
+
+**Tag Cloud**
+
+Provide a personal tag cloud on your channel page
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Hubzilla_on_OpenShift.bb b/doc/en/Hubzilla_on_OpenShift.bb
new file mode 100644
index 000000000..7bdd70955
--- /dev/null
+++ b/doc/en/Hubzilla_on_OpenShift.bb
@@ -0,0 +1,105 @@
+[b]$Projectname on OpenShift[/b]
+You will notice a new .openshift folder when you fetch from upstream, i.e. from [url=https://framagit.org/hubzilla/core.git]https://framagit.org/hubzilla/core.git[/url] , which contains a deploy script to set up Hubzilla on OpenShift with plugins and extra themes.
+
+As of this writing, 2015-10-28, you do not have to pay for OpenShift on the Free plan, which gives you three gears at no cost. The Bronze plan gives you three gears at no cost too, but you can expand to 16 gears by paying, and this requires you to register your payment card. The three gears can give three instances of Hubzilla with one gear each, or you can combine two gears into one high-availability Hubzilla instance and one extra gear. The main difference to be aware of is this: gears on the Free plan will go into hibernation if left idle for too long, this does not happen on the Bronze plan.
+
+Create an account on OpenShift, then use the registration e-mail and password to create your first Hubzilla instance. Install git and RedHat's command line tools - rhc - if you have not already done so. See for example https://developers.openshift.com/en/getting-started-debian-ubuntu.html on how to do this on Debian GNU/Linux, or in the menu on that page for other GNU/Linux distributions or other operating systems.
+
+[code]rhc app-create your_app_name php-5.4 mysql-5.5 cron phpmyadmin --namespace your_domain --from-code https://framagit.org/hubzilla/core.git -l your@email.address -p your_account_password
+[/code]
+
+Make a note of the database username and password OpenShift creates for your instance, and use these at [url=https://your_app_name-your_domain.rhcloud.com/]https://your_app_name-your_domain.rhcloud.com/[/url] to complete the setup. You MUST change server address from 127.0.0.1 to localhost.
+
+NOTE: PostgreSQL is NOT supported by the deploy script yet, see [zrl=https://zot-mor.rhcloud.com/display/3c7035f2a6febf87057d84ea0ae511223e9b38dc27913177bc0df053edecac7c@zot-mor.rhcloud.com?zid=haakon%40zot-mor.rhcloud.com]this thread[/zrl].
+
+[b]Update[/b]
+To update, consider your own workflow first. I have forked Hubzilla code into my GitHub account to be able to try things out, this remote repo is called origin. Here is how I fetch new code from upstream, merge into my local repo, then push the updated code both into origin and the remote repo called openshift.
+
+[code]git fetch upstream;git checkout master;git merge upstream/master;git push origin;git push openshift HEAD
+[/code]
+
+[b]Administration[/b]
+Symptoms of need for MySQL database administration are:
+[list]
+[*] you can visit your domain and see the Hubzilla frontpage, but trying to login throws you back to login. This can mean your session table is marked as crashed.
+[*] you can login, but your channel posts are not visible. This can mean your item table is marked as crashed.
+[*] you can login and you can see your channel posts, but apparently nobody is getting your posts, comments, likes and so on. This can mean your outq table is marked as crashed.
+[/list]
+
+You can check your OpenShift logs by doing
+
+[code]
+rhc tail -a your_app_name -n your_domain -l your@email.address -p your_account_password
+[/code]
+
+and you might be able to confirm the above suspicions about crashed tables, or other problems you need to fix.
+
+[b]How to fix crashed tables in MySQL[/b]
+Using MySQL and the MyISAM database engine can result in table indexes coming out of sync, and you have at least two options for fixing tables marked as crashed.
+[list]
+[*] Use the database username and password OpenShift creates for your instance at [url=https://your_app_name-your_domain.rhcloud.com/phpmyadmin/]https://your_app_name-your_domain.rhcloud.com/phpmyadmin/[/url] to login via the web into your phpMyAdmin web interface, click your database in the left column, in the right column scroll down to the bottom of the list of tables and click the checkbox for marking all tables, then select Check tables from the drop down menu. This will check the tables for problems, and you can then checkmark only those tables with problems, and select Repair table from the same drop down menu at the bottom.
+[*] You can port-forward the MySQL database service to your own machine and use the MySQL client called mysqlcheck to check, repair and optimize your database or individual database tables without stopping the MySQL service on OpenShift. Run the following in two separate console windows.
+
+To port-forward do
+
+[code]rhc port-forward -a your_app_name -n your_domain -l your@email.address -p your_password[/code]
+
+in one console window, then do either -o for optimize, -c for check or -r for repair, like this
+
+[code]mysqlcheck -h 127.0.0.1 -r your_app_name -u your_app_admin_name -p[/code]
+
+and give the app's password at the prompt. If all goes well you should see a number of table names with an OK behind them.
+
+You can now
+[code]Press CTRL-C to terminate port forwarding[/code]
+[*] You can do
+
+[code]rhc cartridge stop mysql-5.5 -a your_app_name[/code]
+
+to stop the MySQL service running in your app on OpenShift before running myisamchk - which should only be run when MySQL is stopped, and then
+login to your instance with SSH - see OpenShift for details - and do
+
+[code]cd mysql/data/your_database
+myisamchk -r *.MYI[/code]
+
+or if you get
+
+[code]Can't create new tempfile[/code]
+
+check your OpenShift's gear quota with
+
+[code]quota -gus[/code]
+
+and if you are short on space, then locally (not SSH) do
+
+[code]rhc app-tidy your_app_name -l your_login -p your_password[/code]
+
+to have rhc delete temporary files and OpenShift logs to free space first, then check the size of your local repo dir and execute
+
+[code]git gc[/code]
+
+against it and check the size again, and then to minimize your remote repo connect via SSH to your application gear and execute the same command against it by changing to the remote repo directory - your repo should be in
+
+[code]~/git/your_app_name.git[/code]
+
+(if not, do find -size +1M to find it), then do
+
+[code]
+cd
+cd mysql/data/yourdatabase
+myisamchk -r -v -f*.MYI[/code]
+
+and hopefully your database tables are now okay.
+You can now start the MySQL service on OpenShift by locally doing
+
+[code]rhc cartridge start mysql-5.5 -a your_app_name[/code]
+[/list]
+
+[b]Notes[/b]
+[list]
+[*] definitely DO turn off feeds and discovery by default and limit delivery reports from 30 days to 3 days if you are on the Free or Bronze plan on OpenShift with a single 1Gb gear by visiting [observer.baseurl]/admin/site when logged in as administrator of your Hubzilla site.
+[*] The above defaults have been added into the deploy script.
+[*] DO add git gc to the deploy script
+[*] MAYBE DO add myisamchk - only checking? to the end of the deploy script.
+[*] mysqlcheck is similar in function to myisamchk, but works differently. The main operational difference is that mysqlcheck must be used when the mysqld server is running, whereas myisamchk should be used when it is not. The benefit of using mysqlcheck is that you do not have to stop the server to perform table maintenance - this means this documenation should be fixed.
+[/list]
diff --git a/doc/en/Plugins.md b/doc/en/Plugins.md
new file mode 100644
index 000000000..88b42185b
--- /dev/null
+++ b/doc/en/Plugins.md
@@ -0,0 +1,263 @@
+
+Creating Plugins/Addons for $Projectname
+==========================================
+
+
+So you want to make $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
+
+
+In your $Projectname folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
+
+
+ mkdir addon
+
+Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters.
+
+Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files.
+
+ mkdir addon/randplace
+
+Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file
+
+ addon/randplace/randplace.php
+
+The very first line of this file needs to be
+
+ <?php
+
+Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of
+
+ /**
+ *
+ * Name: Random Place (here you can use better descriptions than you could in the filename)
+ * Description: Sample $Projectname plugin, Sets a random place when posting.
+ * Version: 1.0
+ * Author: Mike Macgirvin <mike@zothub.com>
+ *
+ */
+
+These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'.
+
+The typical plugin will have at least the following functions:
+
+* pluginname_load()
+* pluginname_unload()
+
+In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named
+
+* pluginname_install()
+* pluginname_uninstall()
+
+
+Next we'll talk about **hooks**. Hooks are places in $Projectname code where we allow plugins to do stuff. There are a [lot of these](help/Hooks), and they each have a name. What we normally do is use the pluginname_load() function to register a "handler function" for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
+
+We register hook handlers with the 'register_hook()' function. It takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
+
+
+ function randplace_load() {
+ register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+
+ register_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ register_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+
+ }
+
+
+So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings.
+
+Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
+
+ function randplace_unload() {
+ unregister_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+
+ unregister_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ unregister_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+
+ }
+
+
+Hooks are called with two arguments. The first is always $a, which is our global App structure and contains a huge amount of information about the state of the web request we are processing; as well as who the viewer is, and what our login state is, and the current contents of the web page we're probably constructing.
+
+The second argument is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the second argument is a named array of data structures. Please see the "hook reference" (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
+
+Let's go ahead and add some code to implement our post_local hook handler.
+
+ function randplace_post_hook($a, &$item) {
+
+ /**
+ *
+ * An item was posted on the local system.
+ * We are going to look for specific items:
+ * - A status post by a profile owner
+ * - The profile owner must have allowed our plugin
+ *
+ */
+
+ logger('randplace invoked');
+
+ if(! local_channel()) /* non-zero if this is a logged in user of this system */
+ return;
+
+ if(local_channel() != $item['uid']) /* Does this person own the post? */
+ return;
+
+ if(($item['parent']) || (! is_item_normal($item))) {
+ /* If the item has a parent, or isn't "normal", this is a comment or something else, not a status post. */
+ return;
+ }
+
+ /* Retrieve our personal config setting */
+
+ $active = get_pconfig(local_channel(), 'randplace', 'enable');
+
+ if(! $active)
+ return;
+ /**
+ *
+ * OK, we're allowed to do our stuff.
+ * Here's what we are going to do:
+ * load the list of timezone names, and use that to generate a list of world cities.
+ * Then we'll pick one of those at random and put it in the "location" field for the post.
+ *
+ */
+
+ $cities = array();
+ $zones = timezone_identifiers_list();
+ foreach($zones as $zone) {
+ if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/')))
+ $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
+ }
+
+ if(! count($cities))
+ return;
+ $city = array_rand($cities,1);
+ $item['location'] = $cities[$city];
+
+ return;
+ }
+
+
+Now let's add our functions to create and store preference settings.
+
+ /**
+ *
+ * Callback from the settings post function.
+ * $post contains the global $_POST array.
+ * We will make sure we've got a valid user account
+ * and that only our own submit button was clicked
+ * and if so set our configuration setting for this person.
+ *
+ */
+
+ function randplace_settings_post($a,$post) {
+ if(! local_channel())
+ return;
+ if($_POST['randplace-submit'])
+ set_pconfig(local_channel(),'randplace','enable',intval($_POST['randplace']));
+ }
+
+
+
+ /**
+ *
+ * Called from the Feature Setting form.
+ * The second argument is a string in this case, the HTML content region of the page.
+ * Add our own settings info to the string.
+ *
+ * For uniformity of settings pages, we use the following convention
+ * <div class="settings-block">
+ * <h3>title</h3>
+ * .... settings html - many elements will be floated...
+ * <div class="clear"></div> <!-- generic class which clears all floats -->
+ * <input type="submit" name="pluginnname-submit" class="settings-submit" ..... />
+ * </div>
+ */
+
+
+
+ function randplace_settings(&$a,&$s) {
+
+ if(! local_channel())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ head_add_css('/addon/randplace/randplace.css');
+
+ /* Get the current state of our config variable */
+
+ $enabled = get_pconfig(local_channel(),'randplace','enable');
+
+ $checked = (($enabled) ? ' checked="checked" ' : '');
+
+ /* Add some HTML to the existing form */
+
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . t('Randplace Settings') . '</h3>';
+ $s .= '<div id="randplace-enable-wrapper">';
+ $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>';
+ $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
+ $s .= '</div><div class="clear"></div>';
+
+ /* provide a submit button */
+
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+ }
+
+
+
+
+
+***Advanced Plugins***
+
+Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
+
+The key to this is to create a simple function named pluginname_module() which does nothing.
+
+ function randplace_module() { return; }
+
+Once this function exists, the URL https://yoursite/randplace will access your plugin as a module. Then you can define functions which are called at various points to build a webpage just like the modules in the mod/ directory. The typical functions and the order which they are called is
+
+ modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
+ // you should do it here, followed by killme() which will avoid the default action of building a webpage
+ modulename_aside($a) // Often used to create sidebar content
+ modulename_post($a) // Called whenever the page is accessed via the "post" method
+ modulename_content($a) // called to generate the central page content. This function should return a string
+ // consisting of the central page content.
+
+Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page
+
+ https://yoursite/randplace/something/somewhere/whatever
+
+we will create an argc/argv list for use by your module functions
+
+ $x = argc(); $x will be 4, the number of path arguments after the sitename
+
+ for($x = 0; $x < argc(); $x ++)
+ echo $x . ' ' . argv($x);
+
+
+ 0 randplace
+ 1 something
+ 2 somewhere
+ 3 whatever
+
+
+***Porting Friendica Plugins***
+
+$Projectname uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica plugins can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are:
+
+* Friendica's pluginname_install() is pluginname_load()
+
+* Friendica's pluginname_uninstall() is pluginname_unload()
+
+$Projectname has _install and _uninstall functions but these are used differently.
+
+* Friendica's "plugin_settings" hook is called "feature_settings"
+
+* Friendica's "plugin_settings_post" hook is called "feature_settings_post"
+
+Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in $Projectname. Many structured data names (especially DB schema columns) are also quite different.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Primary-Directory.md b/doc/en/Primary-Directory.md
new file mode 100644
index 000000000..92460c346
--- /dev/null
+++ b/doc/en/Primary-Directory.md
@@ -0,0 +1,47 @@
+#Primary Directory#
+
+By default, $Projectname will use available Directories on the web, which show you channels available around the world.
+
+There are certain scenarios where you might want your own directory-server that you can connect multiple hubs to. This will limit the channels that appear in all of your hubs to only channels on hubs connected to your directory-server.
+
+
+
+##Instuctions on how to set up one hub as the Primary Directory for a series of private hubs.##
+***
+
+
+* On the hub that will be the Directory Server, open the .htconfig.php file and set:
+
+ `App::$config['system']['directory_mode'] = DIRECTORY_MODE_PRIMARY;`
+
+
+ By default it should already be set as **DIRECTORY_MODE_NORMAL**, so just edit that line to say **DIRECTORY_MODE_PRIMARY**
+
+* Next, for each hub (including the Directory Server), from a terminal, cd into the folder where it is installed and run this :
+
+ `util/config system directory_realm YOURREALMNAME`
+
+ (**YOURREALMNAME** can be whatever you want your realm-name to be)
+
+ then:
+
+ `util/config system realm_token THEPASSWORD`
+
+ (**THEPASSWORD** is whatever password you want for your realm)
+
+ **NOTE:** Use the same realm-name and password for each hub
+
+* Lastly, for each "client" hub, (from a terminal) run:
+
+ `util/config system directory_server https://theaddressofyourdirectoryserver.com`
+
+***
+Now when you view the directory of each hub, it should only show the channels that exist on the hubs in your realm. I have tested with two hubs so far, and it seems to be working fine.
+Channels created in each hub are reflected in the Primary Directory, and subsequently in the directory of all client hubs
+
+##Issues##
+***
+
+When I created the first hub,it was up and running for an hour or so before I changed it to PRIMARY_MODE, and after changing it, there were a few channels from across the matrix still present in the directory. I deleted them from the xchan table and that seems to have fixed the issue.
+
+
diff --git a/doc/en/Remove-Account.md b/doc/en/Remove-Account.md
new file mode 100644
index 000000000..a8ef733a6
--- /dev/null
+++ b/doc/en/Remove-Account.md
@@ -0,0 +1,26 @@
+// this page is out of date...
+Remove Account
+==============
+
+It is presently not possible to remove an account without asking your site administrator for assistance.
+We'll have better doco when somebody finishes that bit.
+
+
+Remove Channel
+==============
+
+Visit the URL
+
+ https://yoursite/removeme
+
+(replace 'yoursite' with the domain name of your $Projectname site).
+
+You will need to confirm your password and the channel you are currently logged into will be removed.
+
+This is irreversible.
+
+If you have identity clones on other sites this only removes the channel instance which exists
+on this site.
+
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Schema-development.md b/doc/en/Schema-development.md
new file mode 100644
index 000000000..e811bb8c3
--- /dev/null
+++ b/doc/en/Schema-development.md
@@ -0,0 +1,81 @@
+Red development - a guide to the schema system
+==============================================
+
+
+A schema, in a nutshell, is a collection of settings for a bunch of variables to define
+certain elements of a theme. A schema is loaded as though it were part of config.php
+and has access to all the same information. Importantly, this means it is identity aware,
+and can be used to do some interesting things. One could, for example, restrict options
+by service class, or present different options to different members.
+
+By default, we filter only by whether or not expert mode is enabled. If expert mode is
+enabled, all options are presented to the member. If it is not, only scheme, background
+image, font face, and iconset are available as choices.
+
+A schema is loaded *after* the member's personal settings. Therefore, to allow a member
+to overwrite a particular aspect of a schema you would use the following syntax:
+
+ if (! $foo)
+ $foo = 'bar';
+
+However, there are circumstances - particularly with positional elements - where it
+may be desirable (or necessary) to override a member's settings. In this case, the syntax
+is even simpler:
+
+ $foo = 'bar';
+
+Members will not thank you for this, however, so only use it when it is required.
+
+If no personal options are set, and no schema is selected, we will first try to load a schema
+with the file name "default.php". This file should never be included with a theme. If it
+is, merge conflicts will occur as people update their code. Rather, this should be defined
+by administrators on a site by site basis.
+default.php and default.css MUST be symlinks to existing scheme files.
+
+You schema does not need to - and should not - contain all of these values. Only the values
+that differ from the defaults should be listed. This gives you some very powerful options
+with very few lines of code.
+
+Note the options available differ with each theme. The options available with the Redbasic
+theme are as follows:
+
+* nav_colour
+ The colour of the navigation bar. Options are red, black and silver. Alternatively,
+ one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and
+ hover effects.
+* banner_colour
+ The font colour of the banner element. Accepts an RGB or Hex value.
+* bgcolour
+ Set the body background colour. Accepts an RGB or Hex value.
+* background_image
+ Sets a background image. Accepts a URL or path.
+* item_colour
+ Set the background colour of items. Accepts an RGB or Hex value.
+* item_opacity
+ Set the opacity of items. Accepts a value from 0.01 to 1
+* toolicon_colour
+ Set the colour of tool icons. Accepts an RGB or Hex value.
+* toolicon_activecolour
+ Set the colour of active or hovered icon tools.
+* font_size
+ Set the size of fonts in items and posts. Accepts px or em.
+* body_font_size
+ Sets the size of fonts at the body level. Accepts px or em.
+* font_colour
+ Sets the font colour. Accepts an RGB or Hex value.
+* radius
+ Set the radius of corners. Accepts a numeral, and is always in px.
+* shadow
+ Set the size of shadows shown with inline images. Accepts a numerical
+ value. Note shadows are not applied to smileys.
+* converse_width
+ Set the maximum width of the content region in px.
+* nav_min_opacity
+* top_photo
+* reply_photo
+
+If a your_schema_name.css file is found, the content of this file will be attached to the end of style.css.
+This gives the schem developer the possiblity to override any style component.
+
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/TermsOfService.md b/doc/en/TermsOfService.md
new file mode 100644
index 000000000..1e085559e
--- /dev/null
+++ b/doc/en/TermsOfService.md
@@ -0,0 +1,11 @@
+Privacy Policy
+==============
+
+#include doc/gdpr1.md;
+
+
+Terms of Service
+================
+
+#include doc/SiteTOS.md;
+
diff --git a/doc/en/Translations.md b/doc/en/Translations.md
new file mode 100644
index 000000000..6106e43b1
--- /dev/null
+++ b/doc/en/Translations.md
@@ -0,0 +1,93 @@
+Translating $Projectname
+==========================
+
+Translation Process
+-------------------
+
+The strings used in the UI of $Projectname is translated at [Transifex][1] and then
+included in the git repository at github. If you want to help with translation
+for any language, be it correcting terms or translating $Projectname to a
+currently not supported language, please register an account at transifex.com
+and contact the Redmatrix translation team there.
+
+Translating $Projectname is simple. Just use the online tool at transifex. If you
+don't want to deal with git & co. that is fine, we check the status of the
+translations regularly and import them into the source tree at github so that
+others can use them.
+
+We do not include every translation from transifex in the source tree to avoid
+a scattered and disturbed overall experience. As an uneducated guess we have a
+lower limit of 50% translated strings before we include the language. This
+limit is judging only by the amount of translated strings under the assumption
+that the most prominent strings for the UI will be translated first by a
+translation team. If you feel your translation useable before this limit,
+please contact us and we will probably include your teams work in the source
+tree.
+
+If you want to get your work into the source tree yourself, feel free to do so
+and contact us with and question that arises. The process is simple and
+$Projectname ships with all the tools necessary.
+
+The location of the translated files in the source tree is
+ /view/LNG-CODE/
+where LNG-CODE is the language code used, e.g. de for German or fr for French.
+For the email templates (the *.tpl files) just place them into the directory
+and you are done. The translated strings come as a "hmessages.po" file from
+transifex which needs to be translated into the PHP file $Projectname uses. To do
+so, place the file in the directory mentioned above and use the "po2php"
+utility from the util directory of your $Projectname installation.
+
+Assuming you want to convert the German localization which is placed in
+view/de/hmessages.po you would do the following.
+
+1. Navigate at the command prompt to the base directory of your
+ $Projectname installation
+
+2. Execute the po2php script, which will place the translation
+ in the hstrings.php file that is used by $Projectname.
+
+ $> php util/po2php.php view/de/hmessages.po
+
+ The output of the script will be placed at view/de/hstrings.php where
+ froemdoca os expecting it, so you can test your translation mmediately.
+
+3. Visit your $Projectname page to check if it still works in the language you
+ just translated. If not try to find the error, most likely PHP will give
+ you a hint in the log/warnings.about the error.
+
+ For debugging you can also try to "run" the file with PHP. This should
+ not give any output if the file is ok but might give a hint for
+ searching the bug in the file.
+
+ $> php view/de/hstrings.php
+
+4. commit the two files with a meaningful commit message to your git
+ repository, push it to your fork of the $Projectname repository at github and
+ issue a pull request for that commit.
+
+Utilities
+---------
+
+Additional to the po2php script there are some more utilities for translation
+in the "util" directory of the $Projectname source tree. If you only want to
+translate $Projectname into another language you wont need any of these tools most
+likely but it gives you an idea how the translation process of $Projectname
+works.
+
+For further information see the utils/README file.
+
+Known Problems
+--------------
+
+* $Projectname uses the language setting of the visitors browser to determain the
+ language for the UI. Most of the time this works, but there are some known
+ quirks.
+* the early translations are based on the friendica translations, if you
+ some rough translations please let us know or fix them at Transifex.
+
+Links
+------
+[1]: http://www.transifex.com/projects/p/hubzilla/
+
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Widgets.md b/doc/en/Widgets.md
new file mode 100644
index 000000000..6779d7ffd
--- /dev/null
+++ b/doc/en/Widgets.md
@@ -0,0 +1,174 @@
+Core Widgets
+============
+
+Some/many of these widgets have restrictions which may restrict the type of page where they may appear or may require login
+
+
+* clock - displays the current time
+ * args: military (1 or 0) - use 24 hour time as opposed to AM/PM
+<br />&nbsp;<br />
+
+* profile - displays a profile sidebar on pages which load profiles (pages with nickname in the URL)
+
+* tagcloud - display a tagcloud of webpage items
+
+ * args: count - number of items to return (default 24)
+<br />&nbsp;<br />
+
+* collections - privacy group selector for the current logged in channel
+
+ * args: mode - one of "conversation", "group", "abook" depending on module
+<br />&nbsp;<br />
+
+* suggestions - friend suggestions for the current logged on channel
+
+* follow - presents a text box for following another channel
+
+* notes - private notes area for the current logged in channel if private_notes feature is enabled
+
+* savedsearch - network/matrix search with save - must be logged in and savedsearch feature enabled
+
+* filer - select filed items from network/matrix stream - must be logged in
+
+* archive - date range selector for network and channel pages
+ * args: 'wall' - 1 or 0, limit to wall posts or network/matrix posts (default)
+<br />&nbsp;<br />
+
+* fullprofile - same as profile currently
+
+* categories - categories filter (channel page)
+
+* tagcloud_wall - tagcloud for channel page only
+ * args: 'limit' - number of tags to return (default 50)
+<br />&nbsp;<br />
+
+* catcloud_wall - tagcloud for channel page categories
+ * args: 'limit' - number of categories to return (default 50)
+<br />&nbsp;<br />
+
+* affinity - affinity slider for network page - must be logged in
+
+* settings_menu - sidebar menu for settings page, must be logged in
+
+* mailmenu - sidebar menu for private message page - must be logged in
+
+* design_tools - design tools menu for webpage building pages, must be logged in
+
+* findpeople - tools to find other channels
+
+* photo_albums - list photo albums of the current page owner with a selector menu
+
+* vcard - mini profile sidebar for the person of interest (page owner, whatever)
+
+* dirsafemode - directory selection tool - only on directory pages
+
+* dirsort - directory selection tool - only on directory pages
+
+* dirtags - directory tool - only on directory pages
+
+* menu_preview - preview a menu - only on menu edit pages
+
+* chatroom_list - list of chatrooms for the page owner
+
+* bookmarkedchats - list of bookmarked chatrooms collected on this site for the current observer
+
+* suggestedchats - "interesting" chatrooms chosen for the current observer
+
+* item - displays a single webpage item by mid or page title
+ * args:
+ * channel_id - channel that owns the content, defualt is the profile_uid
+ * mid - message_id of webpage to display (must be webpage, not a conversation item)
+ * title - URL page title of webpage (must provide one of either title or mid)
+<br />&nbsp;<br />
+
+* photo - display a single photo
+ * args:
+ * src - URL of photo, must be http or https
+ * zrl - use zid authenticated link
+ * style - CSS style string
+<br />&nbsp;<br />
+
+* cover_photo - display the cover photo for the selected channel
+ * args:
+ * channel_id - channel to use, default is the profile_uid
+ * style - CSS style string (default is dynamically resized to width of region)
+<br />&nbsp;<br />
+
+
+* photo_rand - display a random photo from one of your photo albums. Photo permissions are honoured
+ * args:
+ * album - album name (very strongly recommended if you have lots of photos)
+ * scale - typically 0 (original size), 1 (1024px), 2, (640px), or 3 (320px)
+ * style - CSS style string
+ * channel_id - if not your own
+<br />&nbsp;<br />
+
+* random_block - display a random block element from your webpage design tools collection. Permissions are honoured.
+ * args:
+ * contains - only return blocks which include the contains string in the block name
+ * channel_id - if not your own
+<br />&nbsp;<br />
+
+* tasklist - provide a task or to-do list for the currently logged-in channel.
+ * args:
+ * all - display completed tasks if all is non-zero.
+<br />&nbsp;<br />
+
+* forums - provide a list of connected public forums with unseen counts for the current logged-in channel.
+<br />&nbsp;<br />
+
+* activity - provide a list of authors of unread network content for the current logged-in channel.
+
+* album - provides a widget containing a complete photo album from albums belonging to the page owner; this may be too large to present in a sidebar region as is best implemented as a content region widget.
+ * args:
+ * album - album name
+ * title - optional title, album name is used if not present
+<br />&nbsp;<br />
+
+
+Creating New Widgets
+====================
+
+### Class Widgets
+
+To create a class-based widget named 'slugfish' create a file with the following contents:
+
+````
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Slugfish {
+
+ function widget($args) {
+
+ ... widget code goes here.
+ ... The function returns a string which is the HTML content of the widget.
+ ... $args is a named array which is passed any [var] variables from the layout editor
+ ... For instance [widget=slugfish][var=count]3[/var][/widget] will populate $args with
+ ... [ 'count' => 3 ]
+
+ }
+
+````
+
+The resultant file may be placed in widget/Slugfish/Slugfish.php , or Zotlabs/SiteWidgets/Slugfish.php . It also may be linked from a git repository using util/add_widget_repo.
+
+
+
+Traditional function based widget:
+
+If you want a widget named 'slugfish', create widget/widget_slugfish.php containing
+
+
+ <?php
+
+ function widget_slugfish($args) {
+
+ .. widget code goes here. See above information for class-based widgets for details.
+
+ }
+
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/Zot---A-High-Level-Overview.md b/doc/en/Zot---A-High-Level-Overview.md
new file mode 100644
index 000000000..990ea037b
--- /dev/null
+++ b/doc/en/Zot---A-High-Level-Overview.md
@@ -0,0 +1,109 @@
+# Zot - A High Level Overview
+
+Here's a high level description of how zot works.
+
+In this example, "Indigo" is going to send a public message from his website at "podunk.edu". "Nickordo" is a recipient on another site ("example.com").
+
+
+Indigo first posts his message at podunk.edu. podunk.edu looks up who should receive the message and finds Nickordo. Nickordo usually posts from example.com so we add that destination to our list of recipients. We may also add other destinations for nickordo and anybody else that is following Indigo's posts.
+
+In this example we find that we only have one known recipient at one known location.
+
+We send a packet to example.com:
+
+ {
+ "type":"notify",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ },
+ "callback":"\/post",
+ "version":1,
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467"
+ }
+
+This packet says the following:
+
+I'm Indigo and here is proof. I'm posting from podunk.edu and here is proof. I've got a package for you. The tracking number is "1eaa6613....".
+
+Example.com accepts this packet and says "whoa, hold on - I don't know you. I want to prove who you are." So Example.com connects to podunk.edu through a "well-known URL" that we use for this purpose and looks up the "guid" mentioned above. It should return a bunch of information, one item of which is a public key. Example.com uses this key to verify the signatures in the message to verify that indeed there is a person named Indigo at podunk.edu. We only need to do this once. (Note that Indigo can post from any location. All we have to do is prove that it's Indigo and that Indigo can prove that he's posting from another site.)
+
+Then example.com disconnects and flags that there's a message waiting at podunk.edu. Either immediately, or whenever the urge hits (depending on how important Indigo is to anybody on this site), example.com "calls" podunk.edu. It says something like this:
+
+ {
+ "type":"pickup",
+ "url":"http:\/\/example.com",
+ "callback_sig":"teE1_fLIqfyeCuZY4iS7sNU8jUlUuqYOYBiHLarkC99I9K-uSr8DAwVW8ZPZRK-uYdxRMuKFb6cumF_Gt9XjecCPBM8HkoXHOi_VselzJkxPwor4ZPtWYWWaFtRfcAm794LrWjdz62zdESTQd2JJIZWbrli1sUhK801BF3n0Ye6-X1MWhy9EUTVlNimOeRipcuD_srMhUcAXOEbLlrugZ8ovy2YBe6YOXkS8jj0RSFjsOduXAoVhQmNpcobSYsDvaQS3e3MvE6-oXE602zGQhuNLr7DIMt9PCdAeQo-ZM-DHlZGCkGk4O2oQFCXFzGPqLUMWDACGJfTfIWGoh_EJqT_SD5b_Yi_Wk9S1lj7vb-lmxe5JuIf7ezWzHoBT8vswnZxPYlidH2i9wapdzij9il_qqcCWWHIp7q_XkY_Zj52Z4r4gdmiqM-8y1c_1SDX7hrJFRwqL_PKFbEvyi5nMWTEzqp55Tay5Woiv19STK_H_8ufFfD9AOkYnk6rIOMsk9dn3a5tAFpDRyRndXkBWAXwiJjiND2zjue7BFu7Ty40THXcfYRh1a5XrAXcaGeYuagg-8J9tAufu9_LY3qGazFg8kRBVMOn4M8DRKSIhKj7z4MnbYL0s09gREojy4jqWO3VkaOjP2jUGzoPuUDLasudE1ehWFq0K_MTQNavgmp8",
+ "callback":"http:\/\/example.com\/post",
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467",
+ "secret_sig":"O7nB4_UJHBXi28Suwl9LBZF9hI_9KGVTgehnUlWF1oYMNRnBbVHB9lzUfAoalvp3STbU3xJbtD_S58tv6MfV7J5j2V_S1W5ex3dulmDGB8Pt_7Fe5mbEPmjQFcfv3Eg5dUjYIuDl0TDScfrHyImj7RZIWHbwd7wWVoMzzDa_o33klpYmKZCBvObCh55bRrlFkXZs_dRuOiPwkfX0C6_XES4OyOIYl45V30rdhmf-STrf4L9dKYy_axQ12RIwRcKychvVLwlUJn3bn9lgNXRRU_HTne-09OPcJbUOdcD3DkFoKOxMULBNKPHzsCau0ICYug7S0EP6LpCom_mW78s08LyVA1vYeFZjevBCiGecj57yIAQDYi6_rpWJfihYaWHRN0oqtScUR4Bdf0bQbEHxMs4zAtrOAxfyJCbi6U1pfnGgzXzB9ulOYGnVGNTF7Ey4K7FOZIBtk0ILY2JfvBUaVvVs8ttagOOHmhWhnbCvrnOFlkNdlce7zoJCSUJENUOCYmTRfwB_Jno5fAzRnrsYU3_Z-l1mzniU_OmUPz8mPEh7PwhkqAiVlyaM-q15gn7l2lAIDk9kp2X_iCme7v4V0ADN_DbpaI_0-6mPw5HLbKrCsA-sxlSMB4DO4lDCHYkauj0l25sbfroRWB_hax1O4Q0oWyOlVJLUqEC5nuUJCCE"
+ }
+
+
+What this message says is: This is example.com, I have proof, and I'm here to pick up a package. Here's the tracking number, and here's proof that this is the tracking number you presumably sent to example.com.
+
+Good enough. Podunk.edu checks out the story and indeed, it is example.com, and yes, there's a package waiting with that tracking number. Here's the package...
+
+ {
+ "success":1,
+ "pickup":{
+ "notify":{
+ "type":"notify",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/z.podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ },
+ "callback":"\/post",
+ "version":1,
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467"
+ },
+ "message":{
+ "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ "created":"2012-11-20 04:04:16",
+ "edited":"2012-11-20 04:04:16",
+ "title":"",
+ "body":"Hi Nickordo",
+ "app":"",
+ "verb":"post",
+ "object_type":"",
+ "target_type":"",
+ "permalink":"",
+ "location":"",
+ "longlat":"",
+ "owner":{
+ "name":"Indigo",
+ "address":"indigo@podunk.edu",
+ "url":"http:\/\/podunk.edu",
+ "photo":{
+ "mimetype":"image\/jpeg",
+ "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ },
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q"
+ },
+ "author":{
+ "name":"Indigo",
+ "address":"indigo@podunk.edu",
+ "url":"http:\/\/podunk.edu",
+ "photo":{
+ "mimetype":"image\/jpeg",
+ "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ },
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q"
+ }
+ }
+ }
+ }
+
+
+
+And that's the package (the original message). Example.com converts this into a form suitable for viewing by Nickordo and notifies Nickordo that there's a new message. Podunk.edu **might** discover that there are other packages waiting for example.com. If this happens it may also send any and all other waiting packages at this time. Each has the original tracking number attached.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/about/about.bb b/doc/en/about/about.bb
new file mode 100644
index 000000000..e909f54cd
--- /dev/null
+++ b/doc/en/about/about.bb
@@ -0,0 +1,204 @@
+[h3]What is $Projectname?[/h3]
+$Projectname is a [b]free and open source[/b] set of web applications and services running on a special kind of web server, called a "hub", that can connect to other hubs in a decentralised network we like to call "the grid", providing sophisticated communications, identity, and access control services which work together seamlessly across domains and independent websites. It allows anybody to publicly or [b]privately[/b] publish content via "channels", which are the fundamental, cryptographically secured identities that provide authentication independently of the hubs which host them. This revolutionary liberation of online identity from individual servers and domains is called "nomadic identity", and it is powered by the Zot protocol, a new framework for decentralised access control with fine-grained, extensible permissions.
+
+[h3]Right... so what is $Projectname?[/h3]
+From the practical perspective of hub members who use the software, $Projectname offers a variety of familiar, integrated web apps and services, including:
+[ul]
+[li]social networking discussion threads[/li]
+[li]cloud file storage[/li]
+[li]calendar and contacts (with CalDAV and CardDAV support)[/li]
+[li]webpage hosting with a content management system[/li]
+[li]wiki[/li]
+[li]and more...[/li][/ul]
+While all of these apps and services can be found in other software packages, only $Projectname allows you to set permissions for groups and individuals who may not even have accounts on your hub! In typical web apps, if you want to share things privately on the internet, the people you share with must have accounts on the server hosting your data; otherwise, there is no robust way for your server to [i]authenticate[/i] visitors to the site to know whether to grant them access. $Projectname solves this problem with an advanced system of [i]remote authentication[/i] that validates the identity of visitors by employing techniques that include public key cryptography.
+
+[h3]Software Stack[/h3]
+The $Projectname software stack is a relatively standard webserver application written primarily in PHP/MySQL and [url=https://framagit.org/hubzilla/core/blob/master/install/INSTALL.txt]requiring little more than a web server, a MySQL-compatible database, and the PHP scripting language[/url]. It is designed to be easily installable by those with basic website administration skills on typical shared hosting platforms with a broad range of computing hardware. It is also easily extended via plugins and themes and other third-party tools.
+
+[h3]Glossary[/h3]
+[dl terms="b"]
+[*= hub] An instance of this software running on a standard web server
+
+[*= grid] The global network of hubs that exchange information with each other using the Zot protocol.
+
+[*= channel] The fundamental identity on the grid. A channel can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions.
+
+[*= clone] Channels can have clones associated with separate and otherwise unrelated accounts on independent hubs. Communications shared with a channel are synchronized among the channel clones, allowing a channel to send and receive messages and access shared content from multiple hubs. This provides resilience against network and hardware failures, which can be a significant problem for self-hosted or limited-resource web servers. Cloning allows you to completely move a channel from one hub to another, taking your data and connections with you. See nomadic identity.
+
+[*= nomadic identity] The ability to authenticate and easily migrate an identity across independent hubs and web domains. Nomadic identity provides true ownership of an online identity, because the identities of the channels controlled by an account on a hub are not tied to the hub itself. A hub is more like a "host" for channels. With Hubzilla, you don't have an "account" on a server like you do on typical websites; you own an identity that you can take with you across the grid by using clones.
+
+[*= [url=[baseurl]/help/developer/zot_protocol]Zot[/url]] The novel JSON-based protocol for implementing secure decentralised communications and services. It differs from many other communication protocols by building communications on top of a decentralised identity and authentication framework. The authentication component is similar to OpenID conceptually but is insulated from DNS-based identities. Where possible remote authentication is silent and invisible. This provides a mechanism for internet-scale distributed access control which is unobtrusive.
+[/dl]
+
+[h3]Features[/h3]
+This page lists some of the core features of $Projectname that are bundled with the official release. $Projectname is a highly extensible platform, so more features and capabilities can be added via additional themes and plugins.
+
+[h4]Affinity Slider[/h4]
+
+When adding connnections in $Projectname, members have the option of assigning "affinity" levels (how close your friendship is) to the new connection. For example, when adding someone who happens to be a person whose blog you follow, you could assign their channel an affinity level of &quot;Acquaintances&quot;.
+
+On the other hand, when adding a friend's channel, they could be placed under the affinity level of &quot;Friends&quot;.
+
+At this point, $Projectname [i]Affinity Slider[/i] tool, which usually appears at the top of your &quot;Matrix&quot; page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them.
+
+The Affinity Slider allows instantaneous filtering of large amounts of content, grouped by levels of closeness.
+
+[h4]Connection Filtering[/h4]
+
+You have the ability to control precisely what appears in your stream using the optional "Connection Filter". When enabled, the Connection Editor provides inputs for selecting criteria which needs to be matched in order to include or exclude a specific post from a specific channel. Once a post has been allowed, all comments to that post are allowed regardless of whether they match the selection criteria. You may select words that if present block the post or ensure it is included in your stream. Regular expressions may be used for even finer control, as well as hashtags or even the detected language of the post.
+
+[h4]Access Control Lists[/h4]
+
+When sharing content, members have the option of restricting who sees the content. By clicking on the padlock underneath the sharing box, one may choose desired recipients of the post, by clicking on their names.
+
+Once sent, the message will be viewable only by the sender and the selected recipients. In other words, the message will not appear on any public walls.
+
+Access Control Lists may be applied to content and posts, photos, events, webpages, chatrooms and files.
+
+[h4]Single Sign-on[/h4]
+
+Access Control Lists work for all channels in the grid due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other $Projectname sites and used to control access to private resources. You login once to your home hub. After that, authentication to all $Projectname resources is "magic".
+
+
+[h4]WebDAV enabled File Storage[/h4]
+
+Files may be uploaded to your personal storage area using your operating system utilities (drag and drop in most cases). You may protect these files with Access Control Lists to any combination of $Projectname members (including some third party network members) or make them public.
+
+[h4]Photo Albums[/h4]
+
+Store photos in albums. All your photos may be protected by Access Control Lists.
+
+[h4]Events Calendar[/h4]
+
+Create and manage events and tasks, which may also be protected with Access Control Lists. Events can be imported/exported to other software using the industry standard vcalendar/iCal format and shared in posts with others. Birthday events are automatically added from your friends and converted to your correct timezone so that you will know precisely when the birthday occurs - no matter where you are located in the world in relation to the birthday person. Events are normally created with attendance counters so your friends and connections can RSVP instantly.
+
+[h4]Chatrooms[/h4]
+
+You may create any number of personal chatrooms and allow access via Access Control Lists. These are typically more secure than XMPP, IRC, and other Instant Messaging transports, though we also allow using these other services via plugins.
+
+[h4]Webpage Building[/h4]
+
+$Projectname has many "Content Management" creation tools for building webpages, including layout editing, menus, blocks, widgets, and page/content regions. All of these may be access controlled so that the resulting pages are private to their intended audience.
+
+[h4]Apps[/h4]
+
+Apps may be built and distributed by members. These are different from traditional "vendor lockin" apps because they are controlled completely by the author - who can provide access control on the destination app pages and charge accordingly for this access. Most apps in $Projectname are free and can be created easily by those with no programming skills.
+
+[h4]Layout[/h4]
+
+Page layout is based on a description language called Comanche. $Projectname is itself written in Comanche layouts which you can change. This allows a level of customisation you won't typically find in so-called "multi-user environments".
+
+[h4]Bookmarks[/h4]
+
+Share and save/manage bookmarks from links provided in conversations.
+
+
+[h4]Private Message Encryption and Privacy Concerns[/h4]
+
+Private mail is stored in an obscured format. While this is not bullet-proof it typically prevents casual snooping by the site administrator or ISP.
+
+Each $Projectname channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created. This is used to protect private messages and posts in transit.
+
+Additionally, messages may be created utilising "end-to-end encryption" which cannot be read by $Projectname operators or ISPs or anybody who does not know the passcode.
+
+Public messages are generally not encrypted in transit or in storage.
+
+Private messages may be retracted (unsent) although there is no guarantee the recipient hasn't read it yet.
+
+Posts and messages may be created with an expiration date, at which time they will be deleted/removed on the recipient's site.
+
+
+[h4]Service Federation[/h4]
+
+In addition to addon "cross-post connectors" to a variety of alternate networks, there is native support for importation of content from RSS/Atom feeds and using this to create special channels. Plugins are also available to communicate with others using the Diaspora and GNU-Social (OStatus) protocols. These networks do not support nomadic identity or cross-domain access control; however basic communications are supported to/from Diaspora, Friendica, GNU-Social, Mastodon and other providers which use these protocols.
+
+There is also experimental support for OpenID authentication which may be used in Access Control Lists. This is a work in progress. Your $Projectname hub may be used as an OpenID provider to authenticate you to external services which use this technology.
+
+Channels may have permissions to become "derivative channels" where two or more existing channels combine to create a new topical channel.
+
+[h4]Privacy Groups[/h4]
+
+Our implementation of privacy groups is similar to Google "Circles" and Diaspora "Aspects". This allows you to filter your incoming stream by selected groups, and automatically set the outbound Access Control List to only those in that privacy group when you post. You may over-ride this at any time (prior to sending the post).
+
+
+[h4]Directory Services[/h4]
+
+We provide easy access to a directory of members and provide decentralised tools capable of providing friend "suggestions". The directories are normal $Projectname sites which have chosen to accept the directory server role. This requires more resources than most typical sites so is not the default. Directories are synchronised and mirrored so that they all contain up-to-date information on the entire network (subject to normal propagation delays).
+
+
+[h4]TLS/SSL[/h4]
+
+For $Projectname hubs that use TLS/SSL, client to server communications are encrypted via TLS/SSL. Given recent disclosures in the media regarding widespread, global surveillance and encryption circumvention by the NSA and GCHQ, it is reasonable to assume that HTTPS-protected communications may be compromised in various ways. Private communications are consequently encrypted at a higher level before sending offsite.
+
+[h4]Channel Settings[/h4]
+
+When a channel is created, a role is chosen which applies a number of pre-configured security and privacy settings. These are chosen for best practives to maintain privacy at the requested levels.
+
+If you choose a "custom" privacy role, each channel allows fine-grained permissions to be set for various aspects of communication. For example, under the &quot;Security and Privacy Settings&quot; heading, each aspect on the left side of the page, has six (6) possible viewing/access options, that can be selected by clicking on the dropdown menu. There are also a number of other privacy settings you may edit.
+
+The options are:
+
+ - Nobody except yourself.
+ - Only those you specifically allow.
+ - Anybody in your address book.
+ - Anybody on this website.
+ - Anybody in this network.
+ - Anybody authenticated.
+ - Anybody on the Internet.
+
+
+[h4]Public and Private Forums[/h4]
+
+Forums are typically channels which may be open to participation from multiple authors. There are currently two mechanisms to post to forums: 1) "wall-to-wall" posts and 2) via forum @mention tags. Forums can be created by anybody and used for any purpose. The directory contains an option to search for public forums. Private forums can only be posted to and often only seen by members.
+
+
+[h4]Account Cloning[/h4]
+
+Accounts in $Projectname are referred to as [i]nomadic identities[/i], because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com.
+
+By contrast, say you've created a $Projectname identity called [b]tina@$Projectnamehub.com[/b]. You can clone it to another $Projectname hub by choosing the same, or a different name: [b]liveForever@Some$ProjectnameHub.info[/b]
+
+Both channels are now synchronized, which means all your contacts and preferences will be duplicated on your clone. It doesn't matter whether you send a post from your original hub, or the new hub. Posts will be mirrored on both accounts.
+
+This is a rather revolutionary feature, if we consider some scenarios:
+
+ - What happens if the hub where an identity is based suddenly goes offline? Without cloning, a member will not be able to communicate until that hub comes back online (no doubt many of you have seen and cursed the Twitter "Fail Whale"). With cloning, you just log into your cloned account, and life goes on happily ever after.
+
+ - The administrator of your hub can no longer afford to pay for his free and public $Projectname hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve your$Projectname relationships, friends and content.
+
+ - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, $Projectname offers [b]censorship resistance[/b]. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet.
+
+$Projectname offers interesting new possibilities for privacy. You can read more at the &lt;&lt;Private Communications Best Practices&gt;&gt; page.
+
+Some caveats apply. For a full explanation of identity cloning, read the &lt;HOW TO CLONE MY IDENTITY&gt;.
+
+[h4]Multiple Profiles[/h4]
+
+Any number of profiles may be created containing different information and these may be made visible to certain of your connections/friends. A "default" profile can be seen by anybody and may contain limited information, with more information available to select groups or people. This means that the profile (and site content) your beer-drinking buddies see may be different than what your co-workers see, and also completely different from what is visible to the general public.
+
+[h4]Account Backup[/h4]
+
+$Projectname offers a simple, one-click account backup, where you can download a complete backup of your profile(s). Backups can then be used to clone or restore a profile.
+
+[h4]Account Deletion[/h4]
+Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the grid (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical.
+
+[h4]Deletion of content[/h4]
+Any content created in $Projectname remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot ($Projectname communication and authentication protocol).
+
+[h4]Media[/h4]
+Similar to any other modern blogging system, social network, or a micro-blogging service, $Projectname supports the uploading of files, embedding of videos, linking web pages.
+
+[h4]Previewing/Editing[/h4]
+Posts and comments can be previewed prior to sending and edited after sending.
+
+[h4]Voting/Consensus[/h4]
+Posts can be turned into "consensus" items which allows readers to offer feedback, which is collated into "agree", "disagree", and "abstain" counters. This lets you gauge interest for ideas and create informal surveys.
+
+[h4]Extending $Projectname[/h4]
+
+$Projectname can be extended in a number of ways, through site customisation, personal customisation, option setting, themes, and addons/plugins.
+
+[h4]API[/h4]
+
+An API is available for use by third-party services. A plugin also provides a basic implementation of the Twitter API (for which hundreds of third-party tools exist). Access may be provided by login/password or OAuth, and client registration of OAuth applications is provided.
diff --git a/doc/en/about/about_hub.bb b/doc/en/about/about_hub.bb
new file mode 100644
index 000000000..0c1082f51
--- /dev/null
+++ b/doc/en/about/about_hub.bb
@@ -0,0 +1,7 @@
+[h3]Site Info[/h3]
+[list][*][url=[baseurl]/siteinfo]Site Info[/url]
+[*][url=[baseurl]/siteinfo/json]Site Info (JSON format)[/url][/list]
+[h3]Terms of Service[/h3]
+[list][*][url=[baseurl]/help/TermsOfService]Terms of Service for this hub[/url][/list]
+#include doc/SiteTOS.md;
+
diff --git a/doc/en/about/project.bb b/doc/en/about/project.bb
new file mode 100644
index 000000000..fe90b4d36
--- /dev/null
+++ b/doc/en/about/project.bb
@@ -0,0 +1,186 @@
+[h3]$Projectname Governance[/h3]
+Governance relates to the management of a project and particularly how this relates to conflict resolution.
+
+[h4]Community Governance[/h4]
+The project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order:
+
+[ol]
+[*] Lazy Consensus
+
+If a project proposal is made to one of the community governance forums and there are no serious objections in a "reasonable" amount of time from date of proposal (we usually provide 2-3 days for all interested parties to weigh in), no vote needs to be taken and the proposal will be considered approved. Some concerns may be raised at this time, but if these are addressed during discussion and work-arounds provided, it will still be considered approved.
+
+
+[*] Veto
+
+Senior developers with a significant history of project commits may veto any decision. The decision may not proceed until the veto is removed or an alternative proposal is presented.
+
+
+[*] Community Vote
+
+A decision which does not have a clear mandate or clear consensus, but is not vetoed, can be taken to a community vote. At present this is a simple popular vote in one of the applicable community forums. At this time, popular vote decides the outcome. This may change in the future if the community adopts a 'council' governance model. This document will be updated at that time with the updated governance rules.
+[/ol]
+
+Community Voting does not always provide a pleasant outcome and can generate polarised factions in the community (hence the reason why other models are under consideration). If the proposal is 'down voted' there are still several things which can be done and the proposal re-submitted with slightly different parameters (convert to an addon, convert to an optional feature which is disabled by default, etc.). If interest in the feature is high and the vote is "close", it can generate lots of bad feelings amongst the losing voters. On such close votes, it is [b]strongly recommended[/b] that the proposer take steps to address any concerns that were raised and re-submit.
+
+
+
+[h4]Privacy Policy[/h4]
+
+Q: Who can see my content?
+
+A: By default ANYBODY on the internet, UNLESS you restrict it. $Projectname allows you to choose the privacy level you desire. Restricted content will NOT be visible to "spy networks" and advertisers. It will be protected against eavesdropping by outsiders - to the best of our ability. Hub administrators with sufficient skills and patience MAY be able to eavesdrop on some private communications but they must expend effort to do so. Privacy modes exist within $Projectname which are even resistant to eavesdropping by skilled and determined hub administrators.
+
+Q: Can my content be censored?
+
+A: $Projectname (the network) CANNOT censor your content. Server and hub administrators are subject to local laws and MAY remove objectionable content from their site/hub. Anybody MAY become a hub administrator, including you; and therefore publish content which might otherwise be censored. You still MAY be subject to local laws.
+
+
+[h5]Definitions[/h5]
+
+**$Projectname**
+
+Otherwise referred to as "the network", $Projectname is a collection of individual computers/servers (aka **hubs**) which connect together to form a larger cooperative network.
+
+**hub**
+
+An individual computer or server connected to $Projectname. These are provided by a **hub administrator** and may be public or private, paid or free.
+
+**hub administrator**
+
+The system operator of an individual hub.
+
+[h5]Policies[/h5]
+
+**Public Information**
+
+Any information or anything posted by you within $Projectname MAY be public or visible to anybody on the internet. To the extent possible, $Projectname allows you to protect content and restrict who can view it.
+
+Your profile photo, your channel name, and the location (URL or network address) of your channel are visible to anybody on the internet and privacy controls will not affect the display of these items.
+
+You MAY additionally provide other profile information. Any information which you provide in your "default" or **public profile** MAY be transmitted to other hubs in $Projectname and additionally MAY be displayed in the channel directory. You can restrict the viewing of this profile information. It may be restricted only to members of your hub, or only connections (friends), or other limited sets of viewers as you desire. If you wish for your profile to be restricted, you must set the appropriate privacy setting, or simply DO NOT provide additional information.
+
+**Content**
+
+Content you provide (status posts, photos, files, etc.) belongs to you. $Projectname default is to publish content openly and visible to anybody on the internet (PUBLIC). You MAY control this in your channel settings and restrict the default permissions or you MAY restrict the visibility of any single published item separately (PRIVATE). $Projectname developers will ensure that restricted content is ONLY visible to those in the restriction list - to the best of their ability.
+
+Content (especially status posts) that you share with other networks or that you have made visible to anybody on the internet (PUBLIC) cannot easily be taken back once it has been published. It MAY be shared with other networks and made available through RSS/Atom feeds. It may also be syndicated on other $Projectname sites. It MAY appear on other networks and websites and be visible in internet searches. If you do not wish this default behaviour please adjust your channel settings and restrict who can see your content.
+
+**Comments and Forum posts**
+
+Comments to posts that were created by others and posts which are designated as forum posts belong to you as the creator/author, but the distribution of these posts is not under your direct control, and you relinquish SOME rights to these items. These posts/comments MAY be re-distributed to others, and MAY be visible to anybody on the internet. In the case of comments, the creator of the "first message" in the thread (conversation) to which you are replying controls the distribution of all comments and replies to that message. They "own" and therefore have certain rights with regard to the entire conversation (including all comments contained within it). You can still edit or delete the comment, but the conversation owner also has rights to edit, delete, re-distribute, and backup/restore any or all the content from the conversation.
+
+**Private Information**
+
+$Projectname developers will ensure that any content you provide which is designated as PRIVATE will be protected against eavesdropping - to the best of their ability. Private channel content CAN be seen in the database of every involved hub administrator, but private messages are obscured in the database. The latter means that it is very difficult, but NOT impossible for this content to be seen by a hub administrator. Private channel content and private messages are also stripped from email notifications. End to end encryption is provided as an optional feature and this CANNOT be seen, even by a determined administrator.
+
+[h5]Identity Privacy[/h5]
+
+Privacy for your identity is another aspect. Because you have a decentralized identity in $Projectname, your privacy extends beyond your home hub. If you want to have complete control of your privacy and security you should run your own hub on a dedicated server. For many people, this is complicated and may stretch their technical abilities. So let's list a few precautions you can make to assure your privacy as much as possible.
+
+A decentralized identity has a lot of advantages and gives you al lot of interesting features, but you should be aware of the fact that your identity is known by other hubs in $Projectname network. One of those advantages is that other channels can serve you customized content and allow you to see private things (such as private photos which others wish to share with you). Because of this those channels need to know who you are. But we understand that sometimes those other channels know more from you than you might desire. For instance the plug-in Visage that can tell a channel owner the last time you visit their profile. You can easily OPT-OUT of this low level and we think, harmless tracking.
+
+* You can enable [Do Not Track (DNT)](http://donottrack.us/) in your web browser. We respect this new privacy policy proposal. All modern browsers support DNT. You will find it in the privacy settings of your browsers or else you can consult the web browser's manual. This will not affect the functionality of $Projectname. This setting is probably enough for most people.
+
+*You can [disable publication](settings) of your channel in our channel directory. If you want people to find your channel, you should give your channel address directly to them. We think this is a good indication that you prefer extra privacy and automatically enable "Do Not Track" if this is the case.
+
+* You can have a blocked hub. That means that all channels and content on that hub is not public, and not visible to the outside world. This is something only your hub administrator can do. We also respect this and automatically enable "Do Not Track" if it is set.
+
+[h5]Censorship[/h5]
+
+$Projectname is a global network which is inclusive of all religions and cultures. This does not imply that every member of the network feels the same way you do on contentious issues, and some people may be STRONGLY opposed to the content you post. In general, if you wish to post something that you know may nor be universally acceptable, the best approach is to restrict the audience using privacy controls to a small circle of friends.
+
+$Projectname as a network provider is unable to censor content. However, hub administrators MAY censor any content which appears on their hub to comply with local laws or even personal judgement. Their decision is final. If you have issues with any hub administrator, you may move your account and postings to another site which is more in line with your expectations. Please check (periodically) the [Terms of Service](help/TermsOfService) of your hub to learn about any rules or guidelines. If your content consists of material which is illegal or may cause issues, you are STRONGLY encouraged to host your own (become a hub administrator). You may still find that your content is blocked on some hubs, but $Projectname as a network cannot block it from being posted.
+
+$Projectname RECOMMENDS that hub administrators provide a grace period of 1-2 days between warning an account holder of content that needs to be removed and physically removing or disabling the account. This will give the content owner an opportunity to export their channel meta-data and import it to another site. In rare cases the content may be of such a nature to justify the immediate termination of the account. This is a hub decision, not a $Projectname decision.
+
+If you typically and regularly post content of an adult or offensive nature, you are STRONGLY encouraged to mark your account "NSFW" (Not Safe For Work). This will prevent the display of your profile photo in the directory except to viewers that have chosen to disable "safe mode". If your profile photo is found by directory administrators to be adult or offensive, the directory administrator MAY flag your profile photo as NSFW. There is currently no official mechanism to contest or reverse this decision, which is why you SHOULD mark your own account NSFW if it is likely to be inappropriate for general audiences.
+
+[h3]Credits[/h3]
+
+Thanks to all who have helped and contributed to the project and its predecessors over the years.
+It is possible we missed in your name but this is unintentional. We also thank the community and
+its members for providing valuable input and without whom this entire effort would be meaningless.
+
+It is also worth acknowledging the contributions and solutions to problems which arose from
+discussions amongst members and developers of other somewhat related and competing projects;
+even if we have had our occasional disagreements.
+
+[list]
+[li]Mike Macgirvin[/li]
+[li]Fabio Comuni[/li]
+[li]Simon L'nu[/li]
+[li]marijus[/li]
+[li]Tobias Diekershoff[/li]
+[li]fabrixxm[/li]
+[li]tommy tomson[/li]
+[li]Simon[/li]
+[li]zottel[/li]
+[li]Christian Vogeley[/li]
+[li]jeroenpraat[/li]
+[li]Michael Vogel[/li]
+[li]erik[/li]
+[li]Zach Prezkuta[/li]
+[li]Paolo T[/li]
+[li]Michael Meer[/li]
+[li]Michael[/li]
+[li]Abinoam P. Marques Jr[/li]
+[li]Tobias Hößl[/li]
+[li]Alexander Kampmann[/li]
+[li]Olaf Conradi[/li]
+[li]Paolo Tacconi[/li]
+[li]tobiasd[/li]
+[li]Devlon Duthie[/li]
+[li]Zvi ben Yaakov (a.k.a rdc)[/li]
+[li]Alexandre Hannud Abdo[/li]
+[li]Olivier Migeot[/li]
+[li]Chris Case[/li]
+[li]Klaus Weidenbach[/li]
+[li]Michael Johnston[/li]
+[li]olivierm[/li]
+[li]Vasudev Kamath[/li]
+[li]pixelroot[/li]
+[li]Max Weller[/li]
+[li]duthied[/li]
+[li]Martin Schmitt[/li]
+[li]Sebastian Egbers[/li]
+[li]Erkan Yilmaz[/li]
+[li]sasiflo[/li]
+[li]Stefan Parviainen[/li]
+[li]Haakon Meland Eriksen[/li]
+[li]Oliver Hartmann (23n)[/li]
+[li]Erik Lundin[/li]
+[li]habeascodice[/li]
+[li]sirius[/li]
+[li]Charles[/li]
+[li]Tony Baldwin[/li]
+[li]Hauke Zuehl[/li]
+[li]Keith Fernie[/li]
+[li]Anne Walk[/li]
+[li]toclimb[/li]
+[li]Daniel Frank[/li]
+[li]Matthew Exon[/li]
+[li]Michal Supler[/li]
+[li]Tobias Luther[/li]
+[li]U-SOUND\mike[/li]
+[li]mrjive[/li]
+[li]nostupidzone[/li]
+[li]tonnerkiller[/li]
+[li]Antoine G[/li]
+[li]Christian Drechsler[/li]
+[li]Ludovic Grossard[/li]
+[li]RedmatrixCanada[/li]
+[li]Stanislav Lechev [0xAF][/li]
+[li]aweiher[/li]
+[li]bufalo1973[/li]
+[li]dsp1986[/li]
+[li]felixgilles[/li]
+[li]ike[/li]
+[li]maase2[/li]
+[li]mycocham[/li]
+[li]ndurchx[/li]
+[li]pafcu[/li]
+[li]Simó Albert i Beltran[/li]
+[li]Manuel Reva[/li]
+[li]Manuel Jiménez Friaza[/li]
+[li]Gustav Wall aka "neue medienordnung plus"[/li]
+[/list]
diff --git a/doc/en/accounts_profiles_channels_basics.bb b/doc/en/accounts_profiles_channels_basics.bb
new file mode 100644
index 000000000..63b13f036
--- /dev/null
+++ b/doc/en/accounts_profiles_channels_basics.bb
@@ -0,0 +1,19 @@
+[size=large][b]Accounts, Profiles and Channels[/b][/size]
+
+Once you have registered an [i]account[/i] at the matrix you have also created a [i]profile[/i] and a [i]channel[/i].
+
+[b]Account[/b]
+You have [i]one[/i] account. This consists of your email account and your password. With your account you access your profile and your channel.
+[i]Think of your account as the way you authenticate at one $Projectname site. It lets you do things, such as creating profiles and channels with which you can connect to other people.[/i]
+
+[b]Profile[/b]
+You have surely registered with some other internet services, such as forums or online communities. For all of them you provided some information about yourself, such as date of birth, country, age and the likes. [observer=1]If you like you can see your profile here: [baseurl]/profile/[observer.webname] and edit it by clicking on the pencil icon next to your avatar image. [/observer]
+Unlike other services $Projectname offers you the advantage of creating [i]many more profiles[/i]. That way you are able to distinguish between profiles targeted specially at everyone (your public profile), your work mates, your family and your partner.
+[i]Think of your profile as the basic information about yourself you tell other people.[/i]
+
+[b]Channel[/b]
+During the registration you created your first [i]channel[/i]. Yes, besides several profiles you are able to have several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have created one channel. You can use this one for the public, to communicate with people about every day life. But perhaps you are an avid book reader and many people are bored by that. So you open a [i]second channel[/i] just for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of posts, with a new profile (... or new profile[i]s[/i] ...) and completely different contacts. Some connections might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just switch between both of them just like you would in real life switch when talking to people you meet on the street or people you meet specially to talk about books. You can even connect to yourself, or better: to your other channel. :)
+[i]Think of a channel as different spaces dedicated to different topics where you meet with different people.[/i]
+
+#include doc/macros/main_footer.bb;
+
diff --git a/doc/en/acl_dialog_post.html b/doc/en/acl_dialog_post.html
new file mode 100644
index 000000000..80b2c68b6
--- /dev/null
+++ b/doc/en/acl_dialog_post.html
@@ -0,0 +1,16 @@
+<!-- Network and channel posts cannot change their permissions after being sent, this help
+ file is for items of that nature. Files and photos etc should use a different help file. -->
+
+<h2>Post Permissions</h2>
+
+<p>The permissions dialog lets you select which channels and/or privacy groups can see the post. You can also select who is explicitly denied access. For example, say you are planning a surprise party for a friend. You can send an invitation post to everyone in your <b>Friends</b> group <i>except</i> the friend you are surprising. In this case you "Show" the <b>Friends</b> group but "Don't show" that one person.</p>
+
+<dl class="text-info dl-terms-large dl-horizontal">
+<dt style="width: 3em;">Tip!</td>
+<dd style="margin-left: 4em;">The border color of each channel indicates whether that channel &mdash; or one of the groups it's a member of &mdash; will have access to the post. The border color will also indicate when a channel, or group it belongs to, has been explicitly set to "Don't show".</dd>
+</dl>
+
+<h3>Why can't I edit a post's permissions after I saved it?</h3>
+
+<p>You are able to change permissons to your files, photos and the likes, but not to posts after you have saved them. The main reason is: Once you have saved a post it is being distributed either to the public channel and from there to other Hubzilla servers or to those you intended it to go. Just like you cannot reclaim something you gave to another person, you cannot change permissions to Hubzilla posts. We would need to track everywhere your posting goes, keep track of everyone you allowed to see it and then keep track of from whom to delete it.</p>
+<p>If a posting is public this is even harder, as the Hubzilla is a global network and there is no way to follow a post, let alone reclaim it reliably. Other networks that may receive your post have no reliable way to delete or reclaim the post.</p> \ No newline at end of file
diff --git a/doc/en/addons.bb b/doc/en/addons.bb
new file mode 100644
index 000000000..4bfa7a9fd
--- /dev/null
+++ b/doc/en/addons.bb
@@ -0,0 +1,117 @@
+[h3]Plugins/Addons[/h3]
+[list=1]
+[*] abcjsplugin - Create musical scores in your posts
+[*] adultphotoflag - prevents nsfw photos from being displayed in public albums
+[*] authchoose - only send identity assertions to sites of friends
+[*] b2tbtn - provide button to go directly to top of page if you are scrolled a long way down
+[*] bbmath - use complex math expressions in your posts
+[*] bookmarker - replace #^ with bookmark link in posts
+[*] buglink - provide a bug reporting icon in the lower-left corner of every page
+[*] calc - a scientific calculator
+[*] chess - cross domain identity aware interactive chess games
+[*] chords - generate fingering charts and alternatives for every known guitar chord
+[*] custom_home - set a custom page as the hub start page
+[*] diaspora - Diaspora protocol emulator
+[*] dirstats - show some interesting statistics generated by the directory server
+[*] docs - alternate documentation pages
+[*] donate - provides a project donation page
+[*] dreamhost - provide a more reliable service on Dreamhost shared hosting
+[*] dwpost - crosspost to Dreamwidth
+[*] emojione - allow emojis as emoticons
+[*] extcron - use an external cron service to run your hub's scheduled tasks
+[*] firefox - provide a link to install the Firefox Sharing API
+[*] flattrwidget - provides a "Flattr Us" button
+[*] flip - create upside down text
+[*] fortunate - displays random quote (fortune cookie). Requires setting up a fortune server.
+[*] friendica - Friendica (DFRN) protocol. Under development.
+[*] frphotos - import photo albums from Friendica
+[*] gnusoc - GNU-Social (OStatus) protocol. Under development.
+[*] hexit - hexadecimal conversion tool
+[*] hilite - allow language-specific highlighted code blocks in posts
+[*] hubwall - send an admin email to all hub accounts
+[*] ijpost - crosspost to Insanejournal
+[*] irc - connect to IRC chatrooms
+[*] jappixmini - XMPP chat
+[*] js_upload - upload multiple photos to photo albums at once.
+[*] keepout - prevents nearly all use of site when not logged in, more restrictive than 'block public' setting
+[*] ldapauth - login via account on LDAP or Windows Active Directory domain
+[*] libertree - crosspost to Libertree
+[*] likebanner - create a "like us on red#matrix" banner image
+[*] ljpost - crosspost to LiveJournal
+[*] logrot - logfile rotation utility
+[*] mahjongg - Chinese puzzle game
+[*] mailhost - when using multiple channel clones, select one to receive email notifications
+[*] mailtest - interface for testing mail delivery system
+[*] metatag - provide SEO friendly pages
+[*] mayan_places - set location field to a random city in the Mayan world
+[*] morechoice - additional gender/sexual-preference choices for profiles (not safe for work)
+[*] moremoods - Additional mood options
+[*] morepokes - additional poke options (not safe for work)
+[*] msgfooter - provide legal or other text on each outgoing post
+[*] noembed - use noembed.com as an addition to $Projectname native oembed functionality (currently broken)
+[*] nofed - prevent "federation" of channel posts, maintains all interaction on your site
+[*] nsabait - add random terrorism related hashtags to your posts
+[*] nsfw - Highly recommended plugin to collpase posts with inappropriate content
+[*] openclipatar - choose a profile photo from hundreds of royalty free images
+[*] openid - OpenID authentication and OpenID server. Your OpenID URL is [observer.baseurl]/id/[observer.webname]
+[*] opensearch - allow your site to become a browser search provider
+[*] openstreetmap - render locations and maps using OpenStreetMap
+[*] pageheader - display text at the top of every page on the site
+[*] phpmailer - alternate mail delivery system with more configurability
+[*] piwik - open source website analytics
+[*] planets - set location field to a random planet from Star Wars
+[*] pong - classic pong game
+[*] pubcrawl - ActivityPub protocol emulator
+[*] pubsubhubbub - PuSH protocol for optimised delivery to feed subscribers (required by GNU-Social protocol)
+[*] pumpio - crosspost to Pump.io
+[*] qrator - generate QR code images
+[*] rainbowtag - display your tag and category clouds in colours
+[*] randpost - post/reply bot based on and requires fortunate
+[*] redfiles - import file storage from redmatrix
+[*] redphotos - import photo albums from redmatrix
+[*] redred - Crosspost to another Red Matrix or Hubzilla channel
+[*] rendezvous - group location tracking
+[*] rtof - Crosspost to Friendica
+[*] sendzid - add 'zid' auth parmaters to all outbound links, not just in-network links
+[*] skeleton - sample addon/plugin to demonstrate plugin development
+[*] smiley_pack - extend the built-in smilie (emoticon) support
+[*] smileybutton - provides a smiley selector on the post window
+[*] startpage - set a personal preferred page to redirect after logging in.
+[*] statistics - Diaspora statistics generator
+[*] statusnet - GNU-social and StatusNet crosspost [zrl=[baseurl]/help/addons_gnusocial]Posting To Gnu Social[/zrl]
+[*] std_embeds - allow unfiltered embeds for popular providers like youtube, vimeo and soundcloud
+[*] superblock - Highly recommended - completely block an offensive channel from your stream
+[*] testdrive - Turns your hub into a test drive site with accounts that expire after a trail period.
+[*] tictac - 3D tic-tac-toe
+[*] torch - flashlight app
+[*] tour - feature tour for new members
+[*] tripleaes - demo plugin for providing custom encryption algorithms
+[*] twitter - crosspost to Twitter
+[*] twitter_api - Twitter/Statusnet compatible API
+[*] upload_limits - discover what server setting (there are a few) may be causing large photo uploads to fail
+[*] visage - show visitors to your channel
+[*] webmention - process webmentions
+[*] wholikesme - provides a page to display what connections have 'liked' your posts the most
+[*] webRTC - use an external server (mayfirst.org) to negotiate webRTC hookups
+[*] wppost - crosspost to WordPress (or other wordpress XMLRPC service)
+[*] xmpp - XMPP chat based on converse.js
+[/list]
+
+[h3]Addon Repositories[/h3]
+
+We [b]strongly recommend[/b] that authors of addons publish/submit them to the project addon repository. This has several advantages. Project developers can easily fix security flaws and make changes to comply with recent changes in core code. Addons provided in third-party repositories are considered untrusted. If the project core code changes in an incompatible way, there may be no alternative but to physically remove or rename the addon files in order to get your site working again. Often only the plugin/addon author can help you regain control of your website, and project developers are unable to assist you; because by definition your site configuration has been modified in ways that we cannot easily test or verify.
+
+For these reasons we [b]strongly recommend[/b] that you do NOT install addons from third-party repositories.
+
+We also recognise that some developers prefer working on their own and do not wish their code to be mingled with the project repository for a variety of reasons. These developers can ease troubleshooting and debugging by providing a README file in their respective code repository outlining the process for submitting patches and bug fixes. It is also recommended that these projects provide both a 'dev' (development) and 'master' (production) branch which tracks the current project branches of those names. This is because dev and master are often not compatible from the viewpoint of library interfaces. It is also highly recommended that your repository versions are tagged and moved forward within 24 hours of project releases. This is a major inconvenience for everybdy involved, and can present downtime for production sites while this process is being carried out; which is one more reason why we [b]strongly recommend[/b] that addons be submitted to the project addon repository and that you do NOT install such third-party addons.
+
+
+[url=https://framagit.org/hubzilla/addons]https://framagit.org/hubzilla/addons[/url] Main project addon repository
+
+[url=https://github.com/23n/red-addons]https://github.com/23n/red-addons[/url] Oliver's repository (mayan_places and flip)
+
+
+
+#include doc/macros/main_footer.bb;
+
+
diff --git a/doc/en/addons_gnusocial.bb b/doc/en/addons_gnusocial.bb
new file mode 100644
index 000000000..fbb387476
--- /dev/null
+++ b/doc/en/addons_gnusocial.bb
@@ -0,0 +1,65 @@
+[b]How to cross-post to a GNUsocial instance[/b]
+
+Start on the GNUSocial instance where you have your account.
+
+In the GNUSocial instance, go to Settings > Connections. In the right column under "Developers," click the link to "Register an OAuth client application to use with this instance of StatusNet." This link may be found at your instance here:
+
+https://yourgnusocialinstance.org/settings/oauthapps
+
+Next, click the link to Register a new application. That brings up the new application form. Here's what to do on each field.
+
+Icon. I uploaded $Projectname icon located at this link, after saving it to my computer:
+
+https://framagit.org/hubzilla/core/blob/master/images/rm-32.png
+
+Name. Give the application an appropriate name. I called mine hubzilla. You might prefer r2g.
+
+Description. Use this field to describe the purpose of the application. I put something to the effect of use for crossposting from $Projectname to GNUsocial.
+
+
+Source URL. Put the main domain name of the Red site you're using. Don't forget to put the "s" in https://yourhubzillasite.com. If your Red installation is a subdomain, that would probably be called for.
+
+Organization. Since $Projectname is unorganized, I put that. If you use your installation for a group or business, that might be a good option.
+
+Homepage. If your group is using a subdomain, you probably want to put your main domain URI here. Since I'm on a hosted site, I put redmatrix.me.
+
+Callback URL. Leave blank.
+
+Type of application: select "desktop."
+
+Default access: select "Read-write."
+
+All fields except the callback URL must be filled in.
+
+Click on the save button.
+
+Then click on the icon or the name of the application for the information you'll need to insert over on $Projectname.
+
+*****
+
+Now open up a new tab or window and go to your $Projectname account, to Settings > Feature settings. Find the StatusNet Posting Settings.
+
+Insert the strings of numbers given on the GNUsocial site into $Projectname fields for Consumer Key and Consumer Secret.
+
+The Base API Path (remember the trailing /) will be your instance domain, plus the /api/ following. It will probably look like this:
+
+https://yourgnusocialinstance.org/api/
+
+In case of doubt check on your GNUsocial instance site in order to find the domain URLs of the Request token, Access token, and Authorization. It will be the first part of the domains, minus the /oauth/....
+
+StatusNet application name: Insert the name you gave to the application over on the GNUsocial site.
+
+Click Submit.
+
+A button will appear for you to "Sign in to StatusNet." Click it and that will open a tab or window on the GNUsocial site for you to click "Allow." Once clicked and successfully authorized, a security code number will appear. Copy it and go back to $Projectname app you just left and insert it in the field: "Copy the security code from StatusNet here." Click Submit.
+
+If successful, your information from the GNUsocial instance should appear in $Projectname app.
+
+You now have several options to choose, if you desire, and those will need to be confirmed by clicking "Submit" also. The most interesting is "Send public postings to StatusNet by default." This option automatically sends any post of yours made in your $Projectname account to your GNUsocial instance.
+
+If you don't choose this option, you will have an option to send a post to your GNUsocial instance by first opening the post (by clicking in the post text area) and clicking on the lock icon next to the Share button. Select the GNUsocial icon made up of three colored dialog baloons. Close that window, then make your post.
+
+If all goes well, you have just cross-posted your $Projectname post to your account on a GNUsocial instance.
+
+#include doc/macros/addons_footer.bb;
+
diff --git a/doc/en/admin/administrator_guide.md b/doc/en/admin/administrator_guide.md
new file mode 100644
index 000000000..bf4dc7355
--- /dev/null
+++ b/doc/en/admin/administrator_guide.md
@@ -0,0 +1,464 @@
+### Overview
+
+$Projectname is more than a simple web application. It is a
+complex communications system which more closely resembles an email server
+than a web server. For reliability and performance, messages are delivered in
+the background and are queued for later delivery when sites are down. This
+kind of functionality requires a bit more of the host system than the typical
+blog. Not every PHP/MySQL hosting provider will be able to support
+$Projectname. Many will but please review the requirements and confirm these
+with your hosting provider prior to installation.
+
+We've tried very hard to ensure that $Projectname will run on commodity
+hosting platforms such as those used to host Wordpress blogs and Drupal
+websites. It will run on most any Linux VPS system. Windows LAMP platforms
+such as XAMPP and WAMP are not officially supported at this time however
+we welcome patches if you manage to get it working.
+
+### Where to find more help
+If you encounter problems or have issues not addressed in this documentation,
+please let us know via the [Github issue
+tracker](https://framagit.org/hubzilla/core/issues). Please be as clear as you
+can about your operating environment and provide as much detail as possible
+about any error messages you may see, so that we can prevent it from happening
+in the future. Due to the large variety of operating systems and PHP platforms
+in existence we may have only limited ability to debug your PHP installation or
+acquire any missing modules, but we will do our best to solve any general code
+issues.
+
+### Before you begin
+
+#### Choose a domain name or subdomain name for your server
+
+$Projectname can only be installed into the root of a domain or sub-domain, and can
+not be installed using alternate TCP ports.
+
+#### Decide if you will use SSL and obtain an SSL certificate before software installation
+
+You SHOULD use SSL. If you use SSL, you MUST use a "browser-valid" certificate.
+*You MUST NOT use self-signed certificates!*
+
+Please test your certificate prior to installation. A web tool for testing your
+certificate is available at "http://www.digicert.com/help/". When visiting your
+site for the first time, please use the SSL ("https://") URL if SSL is available.
+This will avoid problems later. The installation routine will not allow you to
+use a non browser-valid certificate.
+
+This restriction is incorporated because public posts from you may contain
+references to images on your own hub. Other members viewing their stream on
+other hubs will get warnings if your certificate is not trusted by their web
+browser. This will confuse many people because this is a decentralised network
+and they will get the warning about your hub while viewing their own hub and may
+think their own hub has an issue. These warnings are very technical and scary to
+some folks, many of whom will not know how to proceed except to follow the browser
+advice. This is disruptive to the community. That said, we recognise the issues
+surrounding the current certificate infrastructure and agree there are many
+problems, but that doesn't change the requirement.
+
+Free "browser-valid" certificates are available from providers such as StartSSL
+and LetsEncrypt.
+
+If you do NOT use SSL, there may be a delay of up to a minute for the initial
+install script - while we check the SSL port to see if anything responds there.
+When communicating with new sites, $Projectname always attempts connection on the
+SSL port first, before falling back to a less secure connection. If you do not
+use SSL, your webserver MUST NOT listen on port 443 at all.
+
+If you use LetsEncrypt to provide certificates and create a file under
+.well-known/acme-challenge so that LetsEncrypt can verify your domain ownership,
+please remove or rename the .well-known directory as soon as the certificate is
+generated. $Projectname will provide its own handler for ".well-known" services when
+it is installed, and an existing directory in this location may prevent some of
+these services from working correctly. This should not be a problem with Apache,
+but may be an issue with nginx or other web server platforms.
+
+### Deployment
+There are several ways to deploy a new hub.
+
+* Manual installation on an existing server
+* Automated installation on an existing server using a shell script
+* Automated deployment using an OpenShift virtual private server (VPS)
+
+### Requirements
+* Apache with mod-rewrite enabled and "AllowOverride All" so you can use a
+ local .htaccess file. Some folks have successfully used nginx and lighttpd.
+ Example config scripts are available for these platforms in doc/install.
+ Apache and nginx have the most support.
+
+* PHP 8.1 or later.
+ Note that on some shared hosting environments, the _command line_
+ version of PHP might differ from the _webserver_ version
+
+* PHP *command line* access with register_argc_argv set to true in the
+ php.ini file, and with no hosting provider restrictions on the use of
+ exec() and proc_open().
+
+* curl, gd (with at least jpeg and png support), pdo-mysql (or pdo-postgres), mbstring, zip,
+ and openssl extensions. The imagick extension is not required, but recommended.
+
+* xml extension is required if you want webdav to work.
+
+* some form of email server or email gateway such that PHP mail() works.
+
+* A supported database server. The supported databases are:
+ - Mysql version 8.0.22 or later
+ - MariaDB version 10.4 or later
+ - PostgreSQL version 12 or later
+
+* ability to schedule jobs with cron.
+
+* Installation into a top-level domain or sub-domain (without a
+ directory/path component in the URL) is REQUIRED.
+
+### Manual Installation
+
+#### Unpack the $Projectname files into the root of your web server document area
+If you copy the directory tree to your webserver, make sure that you include the
+hidden files like .htaccess.
+
+If you are able to do so, we recommend using git to clone the source
+repository rather than to use a packaged tar or zip file. This makes the
+software much easier to update. The Linux command to clone the repository
+into a directory "mywebsite" would be:
+
+ git clone https://framagit.org/hubzilla/core.git mywebsite
+
+and then you can pick up the latest changes at any time with:
+
+ git pull
+
+make sure folders ``store/[data]/smarty3`` and ``store`` exist and are
+writable by the webserver:
+
+ mkdir -p "store/[data]/smarty3"
+ chmod -R 777 store
+
+ This permission (777) is very dangerous and if you have sufficient
+ privilege and knowledge you should make these directories writeable
+ only by the webserver and, if different, the user that will run the
+ cron job (see below). In many shared hosting environments this may be
+ difficult without opening a trouble ticket with your provider. The
+ above permissions will allow the software to work, but are not
+ optimal.
+
+The following directories also need to be writable by the webserver in order for certain
+web-based administrative tools to function:
+
+* `addon`
+* `extend`
+* `view/theme`
+* `widget`
+
+#### Official addons
+##### Installation
+Navigate to your website. Then you should clone the addon repository (separately). We'll give this repository a nickname of 'hzaddons'. You can pull in other hubzilla addon repositories by giving them different nicknames:
+
+ cd mywebsite
+ util/add_addon_repo https://framagit.org/hubzilla/addons.git hzaddons
+
+##### Updating
+For keeping the addon tree updated, you should be on your top level website directory and issue an update command for that repository::
+
+ cd mywebsite
+ util/update_addon_repo hzaddons
+
+Create searchable representations of the online documentation. You may do this
+any time that the documentation is updated :
+
+ cd mywebsite
+ util/importdoc
+
+### Automated installation via the .homeinstall shell script
+There is a shell script in (``.homeinstall/hubzilla-setup.sh``) that will install $Projectname and its dependencies on a fresh installation of Debian 9 stable (Stetch). It should work on similar Linux systems but your results may vary.
+
+#### Requirements
+The installation script was originally designed for a small hardware server behind your home router. However, it has been tested on several systems running Debian 9:
+
+* Home-PC (Debian-9.2-amd64) and Rapberry-Pi 3 (Rasbian = Debian 9.3)
+
+ * Internet connection and router at home
+ * Mini-PC / Raspi connected to your router
+ * USB drive for backups
+ * Fresh installation of Debian on your mini-pc
+ * Router with open ports 80 and 443 for your Debian
+
+#### Overview of installation steps
+1. `apt-get install git`
+1. `mkdir -p /var/www/html`
+1. `cd /var/www/html`
+1. `git clone https://framagit.org/hubzilla/core.git .`
+1. `nano .homeinstall/hubzilla-config.txt`
+1. `cd .homeinstall/`
+1. `./hubzilla-setup.sh`
+1. `service apache2 reload`
+1. Open your domain with a browser and step throught the initial configuration of $Projectname.
+
+### Recommended Addons
+
+We recommend the following addons be installed on all public sites:
+
+ nsfw - hide inappropriate posts/comments
+ superblock - block content from offensive channels
+
+### Federation Addons
+
+Several web communities have begun to converge using common protocols. The protocols involved are somewhat limited in their abilities. The GNU-Social protocol for instance offers no privacy modes, and the Diaspora protocol is somewhat restrictive in what kinds of communications are allowed. All comments must be signed in a very unique manner by the original author. The ActivityPub protocol is also being considered and may be supported at a future date. No other existing protocol supports nomadic location as used by this project. This presents some support challenges as some features work with some networks and don't work with others. Nevertheless the federation protocols allow connections to be made to a much larger community of people worldwide. They are provided as addons.
+
+* diaspora - The Diaspora Protocol used by Diaspora and Friendica. You should enable 'Diaspora Statistics' (statistics) first to enable all the available features.
+
+* gnusoc - The GNU-Social Protocol, used by GNU-Social, Mastodon and several other communities. This addon requires you first install the 'pubsubhubbub' service (also an addon).
+
+Each member of your site must choose whether or not to allow these protocols individually as they may conflict with several desirable core features and abilities of this software (such as channel migration and cloning). They do this from their 'Settings -> Feature/Addon Settings' page. The administrator may also set the following:
+
+ util/config system.diaspora_allowed 1
+ util/config system.gnusoc_allowed 1
+
+and enable these protocols automatically for all newly created channels.
+
+### Service Classes
+
+Service classes allow you to set limits on system resources by limiting what individual
+accounts can do, including file storage and top-level post limits. Define custom service
+classes according to your needs in the `.htconfig.php` file. For example, create
+a _standard_ and _premium_ class using the following lines:
+
+ // Service classes
+
+ App::$config['system']['default_service_class']='standard'; // this is the default service class that is attached to every new account
+
+ // configuration for standard service class
+ App::$config['service_class']['standard'] =
+ array('photo_upload_limit'=>2097152, // total photo storage limit per channel (here 2MB)
+ 'total_identities' =>1, // number of channels an account can create
+ 'total_items' =>0, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected
+ 'total_pages' =>100, // number of pages a channel can create
+ 'total_channels' =>100, // number of channels the user can add, other users can still add this channel, even if the limit is reached
+ 'attach_upload_limit' =>2097152, // total attachment storage limit per channel (here 2MB)
+ 'chatters_inroom' =>20);
+
+ // configuration for premium service class
+ App::$config['service_class']['premium'] =
+ array('photo_upload_limit'=>20000000000, // total photo storage limit per channel (here 20GB)
+ 'total_identities' =>20, // number of channels an account can create
+ 'total_items' =>20000, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected
+ 'total_pages' =>400, // number of pages a channel can create
+ 'total_channels' =>2000, // number of channels the user can add, other users can still add this channel, even if the limit is reached
+ 'attach_upload_limit' =>20000000000, // total attachment storage limit per channel (here 20GB)
+ 'chatters_inroom' =>100);
+
+To apply a service class to an existing account, use the command line utility from the
+web root:
+
+`util/service_class`
+list service classes
+
+`util/config system default_service_class firstclass`
+set the default service class to 'firstclass'
+
+`util/service_class firstclass`
+list the services that are part of 'firstclass' service class
+
+`util/service_class firstclass photo_upload_limit 10000000`
+set firstclass total photo disk usage to 10 million bytes
+
+`util/service_class --account=5 firstclass`
+set account id 5 to service class 'firstclass' (with confirmation)
+
+`util/service_class --channel=blogchan firstclass`
+set the account that owns channel 'blogchan' to service class 'firstclass' (with confirmation)
+
+**Service class limit options**
+
+* photo_upload_limit - maximum total bytes for photos
+* total_items - maximum total toplevel posts
+* total_pages - maximum comanche pages
+* total_identities - maximum number of channels owned by account
+* total_channels - maximum number of connections
+* total_feeds - maximum number of rss feed connections
+* attach_upload_limit - maximum file upload storage (bytes)
+* minimum_feedcheck_minutes - lowest setting allowed for polling rss feeds
+* chatrooms - maximum chatrooms
+* chatters_inroom - maximum chatters per room
+* access_tokens - maximum number of Guest Access Tokens per channel
+
+### Theme management
+#### Repo management example
+1. Navigate to your hub web root
+
+ ```
+ root@hub:/root# cd /var/www
+ ```
+2. Add the theme repo and give it a name
+
+ ```
+ root@hub:/var/www# util/add_theme_repo https://github.com/DeadSuperHero/redmatrix-themes.git DeadSuperHero
+ ```
+3. Update the repo by using
+
+ ```
+ root@hub:/var/www# util/update_theme_repo DeadSuperHero
+ ```
+
+### Channel Directory
+
+#### Keywords
+
+There is a "tag cloud" of keywords that can appear on the channel directory page.
+If you wish to hide these keywords, which are drawn from the directory server, you
+can use the *config* tool:
+
+ util/config system disable_directory_keywords 1
+
+If your hub is in the standalone mode because you do not wish to connect to the
+global grid, you may instead ensure the the _directory_server_ system option is
+empty:
+
+ util/config system directory_server ""
+
+### Administration
+
+#### Site Administration
+
+Administration of the website is commonly done through the admin webpage located at /admin on your website. In order to access this page you must have administration rights to the server. Administration rights are granted to the first account to register on your site, **provided** the email address of that account exactly matches the email address you provided as the administrator's email address during setup.
+
+There are several ways that this can fail and leave the system without an administrator account, for instance if the first account that was created provided a different email address than the administrator email address that was supplied during setup.
+
+For security reasons there is no web page or interface on the system which will give you administrator access. If you need to correct a situation where a system has no administrator account it **must** be done by editing the account table in the database. There is no other way. To do this, you will need to locate the entry in the account table which belongs to the desired administrator, and set 'account_roles' for that entry to 4096. You will then be able to access the admin page from your system's profile menu or directly via /admin .
+
+A hub can have multiple admins and there is no limit to how administrators you can have. Repeat the above process for every account you wish to provide with administration rights.
+
+### Troubleshooting
+
+#### Log files
+
+The system logfile is an extremely useful resource for tracking down
+things that go wrong. This can be enabled in the admin/log
+configuration page. A loglevel setting of `LOGGER_DEBUG` is preferred
+for stable production sites. Most things that go wrong with
+communications or storage are listed here. A setting of LOGGER_DATA
+provides *much* more detail, but may fill your disk. In either
+case we recommend the use of logrotate on your operating system to
+cycle logs and discard older entries.
+
+At the bottom of your .htconfig.php file are several lines (commented
+out) which enable PHP error logging. This reports issues with code
+syntax and executing the code and is the first place you should look
+for issues which result in a "white screen" or blank page. This is
+typically the result of code/syntax problems. Database errors are
+reported to the system logfile, but we've found it useful to have a
+file in your top-level directory called dbfail.out which *only*
+collects database related issues. If the file exists and is writable,
+database errors will be logged to it as well as to the system logfile.
+
+In the case of "500" errors, the issues may often be logged in your
+webserver logs, often /var/log/apache2/error.log or something
+similar. Consult your operating system documentation.
+
+There are three different log facilities.
+
+**The first is the database failure log**. This is only used if you
+ create a file called specifically `dbfail.out` in the root folder of
+ your website and make it write-able by the web server. If we have
+ any database failed queries, they are all reported here. They
+ generally indicate typos in our queries, but also occur if the
+ database server disconnects or tables get corrupted. On rare
+ occasions we'll see race conditions in here where two processes
+ tried to create an xchan or cache entry with the same ID. Any other
+ errors (especially persistent errors) should be investigated.
+
+**The second is the PHP error log**. This is created by the language
+ processor and only reports issues in the language environment. Again
+ these can be syntax errors or programming errors, but these
+ generally are fatal and result in a "white screen of death";
+ e.g. PHP terminates. You should probably look at this file if
+ something goes wrong that doesn't result in a white screen of death,
+ but it isn't uncommon for this file to be empty for days on end.
+
+ There are some lines at the bottom of the supplied `.htconfig.php`
+ file; which if uncommented will enable a PHP error log (*extremely*
+ useful for finding the source of white screen failures). This isn't
+ done by default due to potential issues with logfile ownership and
+ write permissions and the fact that there is no logfile rotation by
+ default.
+
+**The third is the "application log"**. This is used by $Projectname
+ to report what is going on in the program and usually reports any
+ difficulties or unexpected data we received. It also occasionally
+ reports "heartbeat" status messages to indicate that we reached a
+ certain point in a script. **This** is the most important log file
+ to us, as we create it ourself for the sole purpose of reporting the
+ status of background tasks and anything that seems weird or out of
+ place. It may not be fatal, but maybe just unexpected. If you're
+ performing a task and there's a problem, let us know what is in this
+ file when the problem occurred. (Please don't send me 100M dumps
+ you'll only piss me off). Just a few relevant lines so I can rule
+ out a few hundred thousand lines of code and concentrate on where
+ the problem starts showing up.
+
+These are your site logs, not mine. We report serious issues at any
+log level. I highly recommend `DEBUG` log level for most sites - which
+provides a bit of additional info and doesn't create huge
+logfiles. When there's a problem which defies all attempts to track,
+you might wish to use `DATA` log level for a short period of time to
+capture all the detail of what structures we were dealing with at the
+time. This log level will use a lot of space so is recommended only
+for brief periods or for developer test sites.
+
+I recommend configuring logrotate for both the php log and the
+application log. I usually have a look at dbfail.out every week or
+two, fix any issues reported and then starting over with a fresh
+file. Likewise with the PHP logfile. I refer to it once in a while to
+see if there's something that needs fixing.
+
+If something goes wrong, and it's not a fatal error, I look at the
+application logfile. Often I will
+
+```
+tail -f logfile.out
+```
+
+While repeating an operation that has problems. Often I'll insert
+extra logging statements in the code if there isn't any hint what's
+going wrong. Even something as simple as "got here" or printing out
+the value of a variable that might be suspect. You can do this too -
+in fact I encourage you to do so. Once you've found what you need to
+find, you can
+
+```
+git checkout file.php
+```
+
+To immediately clear out all the extra logging stuff you added. Use
+the information from this log and any detail you can provide from your
+investigation of the problem to file your bug report - unless your
+analysis points to the source of the problem. In that case, just fix
+it.
+
+##### Rotating log files
+
+1. Enable the **logrot** addon in the official [hubzilla-addons](https://framagit.org/hubzilla/addons) repo
+1. Create a directory in your web root called `log` with webserver write permissions
+1. Go to the **logrot** admin settings and enter this folder name as well as the max size and number of retained log files.
+
+#### Reporting issues
+
+When reporting issues, please try to provide as much detail as may be
+necessary for developers to reproduce the issue and provide the
+complete text of all error messages.
+
+We encourage you to try to the best of your abilities to use these
+logs combined with the source code in your possession to troubleshoot
+issues and find their cause. The community is often able to help, but
+only you have access to your site logfiles and it is considered a
+security risk to share them.
+
+If a code issue has been uncovered, please report it on the project
+bugtracker (https://framagit.org/hubzilla/core/issues). Again provide
+as much detail as possible to avoid us going back and forth asking
+questions about your configuration or how to duplicate the problem, so
+that we can get right to the problem and figure out what to do about
+it. You are also welcome to offer your own solutions and submit
+patches. In fact we encourage this as we are all volunteers and have
+little spare time available. The more people that help, the easier the
+workload for everybody. It's OK if your solution isn't perfect. Every
+little bit helps and perhaps we can improve on it.
diff --git a/doc/en/admin/hub_snapshots.md b/doc/en/admin/hub_snapshots.md
new file mode 100644
index 000000000..ab0948aa8
--- /dev/null
+++ b/doc/en/admin/hub_snapshots.md
@@ -0,0 +1,127 @@
+### Hub Snapshot Tools
+
+Hubzilla developers frequently need to switch between branches that might have
+incompatible database schemas or content. The following two scripts create and
+restore complete snapshots of a Hubzilla instance, including both the hub web
+root and the entire database state. Each script requires a config file called
+`hub-snapshot.conf` residing in the same folder and containing the specific
+directories and database details of your hub.
+
+### Config
+
+The format of the config file is very strict. There must be no spaces between the
+variable name and the value. Replace only the content inside the quotes with your
+configuration. Save this file as `hub-snapshot.conf` alongside the scripts.
+
+ # Location of hub root. Typically this is the location of the Hubzilla repo clone.
+ HUBROOT="/var/www/"
+ # MySQL database name
+ DBNAME="hubzilla"
+ # MySQL database user
+ DBUSER="hubzilla"
+ # MySQL database password
+ DBPWD="akeufajeuwfb"
+ # The target snapshot folder where the git repo will be initialized
+ SNAPSHOTROOT="/root/snapshots/hubzilla/"
+
+### Snapshot
+
+Example usage:
+
+ sh hub-snapshot.sh my-hub.conf "Commit message for the snapshot"
+
+**hub-snapshot.sh**:
+
+ #!/bin/bash
+
+ if ! [ -f "$1" ]; then
+ echo "$1 is not a valid file. Aborting..."
+ exit 1
+ fi
+ source "$1"
+ #echo "$DBNAME"
+ #echo "$DBUSER"
+ #echo "$DBPWD"
+ #echo "$HUBROOT"
+ #echo "$SNAPSHOTROOT"
+ MESSAGE="snapshot: $2"
+
+ if [ "$DBPWD" == "" -o "$SNAPSHOTROOT" == "" -o "$DBNAME" == "" -o "$DBUSER" == "" -o "$HUBROOT" == "" ]; then
+ echo "Required variable is not set. Aborting..."
+ exit 1
+ fi
+
+ if [ ! -d "$SNAPSHOTROOT"/db/ ]; then
+ mkdir -p "$SNAPSHOTROOT"/db/
+ fi
+ if [ ! -d "$SNAPSHOTROOT"/www/ ]; then
+ mkdir -p "$SNAPSHOTROOT"/www/
+ fi
+
+ if [ ! -d "$SNAPSHOTROOT"/www/ ] || [ ! -d "$SNAPSHOTROOT"/db/ ]; then
+ echo "Error creating snapshot directories. Aborting..."
+ exit 1
+ fi
+
+ echo "Export database..."
+ mysqldump -u "$DBUSER" -p"$DBPWD" "$DBNAME" > "$SNAPSHOTROOT"/db/"$DBNAME".sql
+ echo "Copy hub root files..."
+ rsync -va --delete --exclude=.git* "$HUBROOT"/ "$SNAPSHOTROOT"/www/
+
+ cd "$SNAPSHOTROOT"
+
+ if [ ! -d ".git" ]; then
+ git init
+ fi
+ if [ ! -d ".git" ]; then
+ echo "Cannot initialize git repo. Aborting..."
+ exit 1
+ fi
+
+ git add -A
+ echo "Commit hub snapshot..."
+ git commit -a -m "$MESSAGE"
+
+ exit 0
+
+### Restore
+
+ #!/bin/bash
+ # Restore hub to a previous state. Input hub config and commit hash
+
+ if ! [ -f "$1" ]; then
+ echo "$1 is not a valid file. Aborting..."
+ exit 1
+ fi
+ source "$1"
+ COMMIT=$2
+
+ if [ "$DBPWD" == "" -o "$SNAPSHOTROOT" == "" -o "$DBNAME" == "" -o "$DBUSER" == "" -o "$HUBROOT" == "" ]; then
+ echo "Required variable is not set. Aborting..."
+ exit 1
+ fi
+ RESTOREDIR="$(mktemp -d)/"
+
+ if [ ! -d "$RESTOREDIR" ]; then
+ echo "Cannot create restore directory. Aborting..."
+ exit 1
+ fi
+ echo "Cloning the snapshot repo..."
+ git clone "$SNAPSHOTROOT" "$RESTOREDIR"
+ cd "$RESTOREDIR"
+ echo "Checkout requested snapshot..."
+ git checkout "$COMMIT"
+ echo "Restore hub root files..."
+ rsync -a --delete --exclude=.git* "$RESTOREDIR"/www/ "$HUBROOT"/
+ echo "Restore hub database..."
+ mysql -u "$DBUSER" -p"$DBPWD" "$DBNAME" < "$RESTOREDIR"/db/"$DBNAME".sql
+
+ chown -R www-data:www-data "$HUBROOT"/{store,extend,addon,.htlog,.htconfig.php}
+
+ echo "Restored hub to snapshot $COMMIT"
+ echo "Removing temporary files..."
+
+ rm -rf "$RESTOREDIR"
+
+ exit 0
+
diff --git a/doc/en/admin/zarlog_msgs.md b/doc/en/admin/zarlog_msgs.md
new file mode 100644
index 000000000..0fe16a1e2
--- /dev/null
+++ b/doc/en/admin/zarlog_msgs.md
@@ -0,0 +1,112 @@
+~~~
+L regate ZAR1131E dId2 mistaken
+L ZAR1132E Identity unknown
+ ZAR1133A Sorry for any inconvience. Thank you for your response.
+L ZAR1134S email verfication denied {did2}
+L ZAR1135E not awaited url parameter received
+
+L regate ZAR1230S Unexpected registration verification request for
+L ZAR1231E dId2 mistaken
+L ZAR1232E Identity unknown
+L ZAR1234W Request not inside time frame
+L ZAR1235E Token verification failed
+ ZAR1236I Verify successfull
+L ZAR1236E Verify failed
+L ZAR1237D unexpected
+ (reason may be caused by new account flags implemented still not known)
+ ZAR1238I Email resent
+ ZAR1238E Resent failed
+L ZAR1239I Account successfull created
+L ZAR1239E Account creation error
+
+ register ZAR0130E Registration on this hub is disabled.
+ ZAR0131I Registration on this hub is by approval only.
+ Register at another affiliated hub in case when prefered
+ ZAR0132I Registration on this hub is by invitation only.
+ Register at another affiliated hub
+ ZAR0133I If the registation was already submitted with your data once ago,
+ enter your identity (like email) here and submit
+ ZAR0134I I have an invite code
+ ZAR0135I This site requires verification. After completing this form,
+ please check the notice or your email for further instructions.
+ ZAR0136I Your email address (or leave blank to register without email)
+
+L register ZAR0230S Unexpected registration request
+ ZAR0231E Email address mistake
+ ZAR0231E Passwords do not match.
+ ZAR0231E Please indicate acceptance of the Terms of Service. Registration failed.
+ ZAR0232E Invitations are not available
+L ZAR0233E Registration on this hub is by invitation only
+L ZAR0234S Invitation code failed
+L ZAR0235S Invitation email failed
+ ZAR0236E Invitation not in time or too late
+ ZAR0237I Invitation code succesfully applied
+L ZAR0238E Email address already in use
+L ZAR0239D Error creating dId A
+ ZAR0239I Your didital id is {did2} and your pin for is {pin}
+ Keep these infos and your entered password safe
+ Valid from ... nd expire ...
+L ZAR0239S Exceeding same ip register request of
+
+ ui:admin:site
+ ZAR0810C Register text
+ Will be displayed prominently on the registration page.
+ ZAR0820C register_policy
+ Does this site allow new member registration?
+ ZAR0830C Registration office on duty
+ The weekdays and hours the register office is open for registrations
+ ZAR0831I Testmode duties
+ (interactive)
+ ZAR0840C Account registrations max per day
+ How many registration requests the site accepts during one day. Unlimited if zero or no value.
+ ZAR0850C Account registrations from same ip
+ How many pending registration requests the site accepts from a same ip address.
+ ZAR0860C Account registration delay
+ How long a registration request has to wait before validation can perform
+ ZAR0862C Account registration expiration
+ How long a registration to confirm remains valid. Not expire if zero or no value
+ ZAR0870C Auto channel create
+ Auto create a channel when register a new account. When On, the register form will show
+ additional fields for the channel-name and the nickname.
+ ZAR0880C Invitation only
+ Only allow new member registrations with an invitation code.
+ Above register policy must be set to Yes.
+ ZAR0881C Invitation also
+ Also allow new member registrations with an invitation code.
+ Above register policy must be set to Yes.
+ ZAR0890C Verify Email Addresses
+ Check to verify email addresses used in account registration (recommended).
+
+ invite ZAI0100E All users invitation limit exceeded
+ ZAI0101E Permission denied.
+ ZAI0102E Invite App (Not Installed)
+ ZAI0103E Invites not proposed by configuration. Contact the site admin
+ ZAI0104E Invites by users not enabled
+ ZAI0105W You have no more invitations available
+ ZAI0106I Invitations I am using
+ ZAI0107I Invitations we are using
+ ZAI0109E Not on xchan
+ ZAI0110I § Note, the email(s) sent will be recorded in the system logs
+ (see ZAI0208I @ L)
+ ZAI0111I Enter email addresses, one per line
+ ZAI0112I Your message
+ Here you may enter personal notes to the recipient(s)
+ ZAI0113I Invite template
+ ZAI0114I Note, the invitation code is valid up to ...
+
+ invite ZAI0201E Permission denied.
+ ZAI0202E Invite App (Not Installed)
+ ZAI0203E Not a valid email address
+ ZAI0204E Not a real email address
+ ZAI0205E Not allowed email address
+ ZAI0206E mail address already in use
+ ZAI0207I Note, the invitation code is valid up to
+ ZAI0208E Message delivery failed.
+ ZAI0208I Message delivery success.
+L ZAI0208I to {email} Message delivery success. ({account#}, {channel#}, from:{email}})
+ ZAI0209I Accepted email address
+ ZAI0210E Too many recipients for one invitation (max n)
+ ZAI0211E No recipients for this invitation
+ ZAI0212I n mail(s) sent, n mail error(s)
+ ZAI0213E Register is closed
+~~~
diff --git a/doc/en/admins.bb b/doc/en/admins.bb
new file mode 100644
index 000000000..6c78ce999
--- /dev/null
+++ b/doc/en/admins.bb
@@ -0,0 +1,15 @@
+[h2]Documentation for Hub Administrators[/h2]
+[h3]Deploying your hub[/h3]
+[zrl=[baseurl]/help/install]Install[/zrl]
+[zrl=[baseurl]/help/red2pi]Installing $Projectname on the Raspberry Pi[/zrl]
+[zrl=[baseurl]/help/Hubzilla_on_OpenShift]$Projectname on OpenShift[/zrl]
+[h3]Taking care of your hub[/h3]
+[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl]
+[zrl=[baseurl]/help/theme_management]Theme Management[/zrl]
+[zrl=[baseurl]/help/hidden_configs]Tweaking $Projectname's Hidden Configurations[/zrl]
+[zrl=[baseurl]/help/service_classes]Service Classes[/zrl]
+[zrl=[baseurl]/help/directories]Working with and configuring Directories[/zrl]
+[h3]Frequently asked questions[/h3]
+[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/api/api_albums.md b/doc/en/api/api_albums.md
new file mode 100644
index 000000000..230daae3c
--- /dev/null
+++ b/doc/en/api/api_albums.md
@@ -0,0 +1,66 @@
+API albums
+==========
+
+Description: list photo albums
+
+GET /api/z/1.0/albums
+
+
+Output:
+
+ text - textual name
+
+ total - number of photos in this album
+
+ url - web URL
+
+ urlencode - textual name, urlencoded
+
+ bin2hex - textual name using bin2hex (which is used in the web URL link)
+
+
+Example:
+
+
+ {
+
+ "success": true,
+ "albums": [
+ {
+ "text": "/",
+ "total": "2",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/",
+ "urlencode": "",
+ "bin2hex": ""
+ },
+ {
+ "text": "2016-01",
+ "total": "6",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3031",
+ "urlencode": "2016-01",
+ "bin2hex": "323031362d3031"
+ },
+ {
+ "text": "2016-02",
+ "total": "7",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3032",
+ "urlencode": "2016-02",
+ "bin2hex": "323031362d3032"
+ },
+ {
+ "text": "Cover Photos",
+ "total": "5",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/436f7665722050686f746f73",
+ "urlencode": "Cover+Photos",
+ "bin2hex": "436f7665722050686f746f73"
+ },
+ {
+ "text": "Profile Photos",
+ "total": "26",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/50726f66696c652050686f746f73",
+ "urlencode": "Profile+Photos",
+ "bin2hex": "50726f66696c652050686f746f73"
+ }
+ ]
+
+ }
diff --git a/doc/en/api/api_filedata.md b/doc/en/api/api_filedata.md
new file mode 100644
index 000000000..1d46a495c
--- /dev/null
+++ b/doc/en/api/api_filedata.md
@@ -0,0 +1,66 @@
+API filedata
+=============
+
+Provides the ability to download a file from cloud storage in chunks
+
+GET /api/z/1.0/filedata
+
+
+Required:
+
+ - file_id
+ attach.hash of desired file ('begins with' match)
+
+
+Optional:
+
+ - start
+ starting byte of returned data in file (counting from 0)
+
+ - length
+ length (prior to base64 encoding) of chunk to download
+
+
+Returns:
+
+ attach (DB) structure with base64 encoded 'content' comprised of the desired chunk
+
+
+
+Example:
+
+ https://xyz.macgirvin.com/api/z/1.0/filedata?f=&file_id=9f5217770fd&start=0&length=48
+
+Returns:
+
+ {
+
+ "attach": {
+ "id": "107",
+ "aid": "1",
+ "uid": "2",
+ "hash": "9f5217770fd55d563bd77f84d534d8e119a187514bbd391714626cd9c0e60207",
+ "creator": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "filename": "pcxtopbm.c",
+ "filetype": "application/octet-stream",
+ "filesize": "3934",
+ "revision": "0",
+ "folder": "",
+ "flags": "0",
+ "is_dir": "0",
+ "is_photo": "0",
+ "os_storage": "1",
+ "os_path": "",
+ "display_path": "",
+ "content": "LyogcGN4dG9wYm0uYyAtIGNvbnZlcnQgUEMgcGFpbnRicnVzaCAoLnBjeCkgZmls",
+ "created": "2016-07-24 23:13:01",
+ "edited": "2016-07-24 23:13:01",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "start": 0,
+ "length": 48
+ }
+
+ } \ No newline at end of file
diff --git a/doc/en/api/api_files.md b/doc/en/api/api_files.md
new file mode 100644
index 000000000..c2a10fce5
--- /dev/null
+++ b/doc/en/api/api_files.md
@@ -0,0 +1,103 @@
+API files
+=========
+
+List file storage (attach DB)
+
+GET /api/z/1.0/files
+
+
+Options:
+
+ - hash
+ return only entries matching hash (exactly)
+
+ - filename
+ return only entries matching filename (substring)
+
+ - filetype
+ return only entries matching filetype/mimetype (substring)
+
+ - start
+ start at record (default 0)
+
+ - records
+ number of records to return or 0 for unlimited
+
+
+
+Example:
+
+curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/files -d filetype=multipart/mixed
+
+
+Returns:
+
+ {
+
+ "success": true,
+ "results": [
+ {
+ "id": "1",
+ "aid": "1",
+ "uid": "2",
+ "hash": "44ee8b2a1a7f36dea07b93b7747a2383a1bc0fdd08339e8928bfcbe45f65d939",
+ "filename": "Profile Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-02 21:51:17",
+ "edited": "2016-01-02 21:51:17",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "12",
+ "aid": "1",
+ "uid": "2",
+ "hash": "71883f1fc64af33889229cbc79c5a056deeec5fc277d765f182f19073e1b2998",
+ "filename": "Cover Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-15 00:24:33",
+ "edited": "2016-01-15 00:24:33",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "16",
+ "aid": "1",
+ "uid": "2",
+ "hash": "f48f7ec3278499d1dd86b72c3207beaaf4717b07df5cc9b373f14d7aad2e1bcd",
+ "filename": "2016-01",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-22 03:24:55",
+ "edited": "2016-01-22 03:26:57",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ }
+ ]
+ }
diff --git a/doc/en/api/api_functions.bb b/doc/en/api/api_functions.bb
new file mode 100644
index 000000000..fe7cb11ba
--- /dev/null
+++ b/doc/en/api/api_functions.bb
@@ -0,0 +1,133 @@
+[b]Red Twitter API[/b]
+
+The &quot;basic&quot; Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support.
+
+Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to &quot;dumb-down&quot; the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled.
+
+A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'.
+
+Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &amp;channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected.
+
+Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel.
+
+Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of &quot;friendships&quot; - it only recognises permissions to do stuff (or not do stuff as the case may be).
+
+Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated)
+
+Twitter API compatible functions:
+
+ api/account/verify_credentials T,S,F,R
+ api/statuses/update T,S,F,R
+ api/users/show T,S,F,R
+ api/statuses/home_timeline T,S,F,R
+ api/statuses/friends_timeline T,S,F,R
+ api/statuses/public_timeline T,S,F,R
+ api/statuses/show T,S,F,R
+ api/statuses/retweet T,S,F,R
+ api/statuses/destroy T,S,F,(R)
+ api/statuses/mentions T,S,F,(R)
+ api/statuses/replies T,S,F,(R)
+ api/statuses/user_timeline T,S,F,(R)
+ api/favorites T,S,F,R
+ api/account/rate_limit_status T,S,F,R
+ api/help/test T,S,F,R
+ api/statuses/friends T,S,F,R
+ api/statuses/followers T,S,F,R
+ api/friends/ids T,S,F,R
+ api/followers/ids T,S,F,R
+ api/direct_messages/new T,S,F,R
+ api/direct_messages/conversation T,S,F,R
+ api/direct_messages/all T,S,F,R
+ api/direct_messages/sent T,S,F,R
+ api/direct_messages T,S,F,R
+ api/oauth/request_token T,S,F,R
+ api/oauth/access_token T,S,F,R
+ api/favorites T,S,R
+ api/favorites/create T,S,R
+ api/favorites/destroy T,S,R
+
+Twitter API functions supported by StatusNet but not currently by Friendica or Red
+
+ api/statuses/retweets_of_me T,S
+ api/friendships/create T,S
+ api/friendships/destroy T,S
+ api/friendships/exists T,S
+ api/friendships/show T,S
+ api/account/update_location T,S
+ api/account/update_profile_background_image T,S
+ api/account/update_profile_image T,S
+ api/blocks/create T,S
+ api/blocks/destroy T,S
+
+Twitter API functions not currently supported by StatusNet
+
+ api/statuses/retweeted_to_me T
+ api/statuses/retweeted_by_me T
+ api/direct_messages/destroy T
+ api/account/end_session T,(R)
+ api/account/update_delivery_device T
+ api/notifications/follow T
+ api/notifications/leave T
+ api/blocks/exists T
+ api/blocks/blocking T
+ api/lists T
+
+Statusnet compatible extensions to the Twitter API supported in both Friendica and Red
+
+ api/statusnet/version S,F,R
+ api/statusnet/config S,F,R
+
+Friendica API extensions to the Twitter API supported in both Friendica and Red
+
+ api/statuses/mediap F,R
+
+Red specific API extensions to the Twitter API not supported in Friendica
+
+ api/account/logout R
+ api/export/basic R,J
+ api/friendica/config R
+ api/red/config R
+ api/friendica/version R
+
+ api/red/version R
+
+ api/red/channel/export/basic R,J
+ api/red/channel/stream R,J (currently post only)
+ api/red/albums R,J
+ api/red/photos R,J (option album=xxxx)
+
+Red proposed API extensions to the Twitter API
+
+ api/statuses/edit (R),J
+ api/statuses/permissions (R),J
+ api/statuses/permissions/update (R),J
+ api/statuses/ids (R),J # search for existing message_id before importing a foreign post
+ api/files/show (R),J
+ api/files/destroy (R),J
+ api/files/update (R),J
+ api/files/permissions (R),J
+ api/files/permissions/update (R),J
+ api/pages/show (R),J
+ api/pages/destroy (R),J
+ api/pages/update (R),J
+ api/pages/permissions (R),J
+ api/pages/permissions/update (R),J
+ api/events/show (R),J
+ api/events/update (R),J
+ api/events/permissions (R),J
+ api/events/permissions/update (R),J
+ api/events/destroy (R),J
+ api/photos/show (R),J
+ api/photos/update (R),J
+ api/photos/permissions (R),J
+ api/photos/permissions/update (R),J
+ api/albums/destroy (R),J
+ api/albums/show (R),J
+ api/albums/update (R),J
+ api/albums/permissions (R),J
+ api/albums/permissions/update (R),J
+ api/albums/destroy (R),J
+ api/friends/permissions (R),J
+
+#include doc/macros/main_footer.bb;
+
diff --git a/doc/en/api/api_group_members.md b/doc/en/api/api_group_members.md
new file mode 100644
index 000000000..497e0aac6
--- /dev/null
+++ b/doc/en/api/api_group_members.md
@@ -0,0 +1,133 @@
+API group_members
+=================
+
+GET /api/z/1.0/group_members
+
+
+
+Required:
+
+ group_id or group_name
+
+
+Returns:
+
+ group_member+abook+xchan (DB join) for each member of the privacy group
+
+
+ [
+
+ {
+ "id": "1",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_id": "2",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "0",
+ "abook_closeness": "0",
+ "abook_created": "2016-01-02 21:16:26",
+ "abook_updated": "2016-01-02 21:16:26",
+ "abook_connected": "0000-00-00 00:00:00",
+ "abook_dob": "0000-00-00 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "1",
+ "abook_feed": "0",
+ "abook_profile": "",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "xchan_guid": "lql-1VnxtiO4-WF0h72wLX1Fu8szzHDOXgQaTbELwXW77k8AKFfh-hYr70vqMrc3SSvWN-Flrc5HFhRTWB7ICw",
+ "xchan_guid_sig": "PafvEL0VpKfxATxlCqDjfOeSIMdmpr3iU7X-Sysa1h5LzDpjSXsjO37tYZL-accb1M5itLlfnW5epkTa5I4flsW21zSY1A2jCuBQUTLLGV7rNyyBy7lgqJUFvAMRx0TfXzP9lcaPqlM9T1tA6jfWOsOmkdzwofGeXBnsjGfjsO2xdGYe6vwjOU0DSavukvzDMnOayB9DekpvDnaNBTxeGLM45Skzr7ZEMcNF7TeXMbnvpfLaALYEKeQs9bGH-UgAG8fBWgzVAzeBfx_XSR1rdixjyiZGP0kq0h35SlmMPcEjliodOBFwMXqpXFB7Ibp4F6o6te2p2ErViJccQVG8VNKB6SbKNXY6bhP5zVcVsJ-vR-p4xXoYJJvzTN7yTDsGAXHOLF4ZrXbo5yi5gFAlIrTLAF2EdWQwxSGyLRWKxG8PrDkzEzX6cJJ0VRcLh5z6OI5QqQNdeghPZbshMFMJSc_ApCPi9_hI4ZfctCIOi3T6bdgTNKryLm5fhy_eqjwLAZTGP-aUBgLZpb1mf2UojBn6Ey9cCyq-0T2RWyk-FcIcbV4qJ-p_8oODqw13Qs5FYkjLr1bGBq82SuolkYrXEwQClxnrfKa4KYc2_eHAXPL01iS9zVnI1ySOCNJshB97Odpooc4wk7Nb2Fo-Q6THU9zuu0uK_-JbK7IIl6go2qA",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA18JB76lyP4zzL/y7BCej\neJnfZIWZNtM3MZvI1zEVMWmmwOS+u/yH8oPwyaDk4Y/tnj8GzMPj1lCGVRcd8EJa\nNrCMd50HODA5EsJtxpsOzRcILYjOcTtIAG1K4LtKqELi9ICAaFp0fNfa+Jf0eCek\nvPusx2/ORhy+o23hFoSMhL86o2gmaiRnmnA3Vz4ZMG92ieJEDMXt9IA1EkIqS4y5\nBPZfVPLD1pv8iivj+dtN1XjwplgjUbtxmU0/Ej808nHppscRIqx/XJ0XZU90oNGw\n/wYoK2EzJlPbRsAkwNqoFrAYlr5HPpn4BJ2ebFYQgWBUraD7HwS5atsQEaxGfO21\nlUP0+lDg9t3CXvudDj0UG1jiEKbVIGA+4aG0GN2DSC5AyRq/GRxqyay5W2vQbAZH\nyvxPGrZFO24I65g3pjhpjEsLqZ4ilTLQoLMs0drCIcRm5RxMUo4s/LMg16lT4cEk\n1qRtk2X0Sb1AMQQ2uRXiVtWz77QHMONEYkf6OW4SHbwcv5umvlv69NYEGfCcbgq0\nAV7U4/BWztUz/SWj4r194CG43I9I8dmaEx9CFA/XMePIAXQUuABfe1QMOR6IxLpq\nTHG1peZgHQKeGz4aSGrhQkZNNoOVNaZoIfcvopxcHDTZLigseEIaPPha4WFYoKPi\nUPbZ5o8gTLc750uzrnb2jwcCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/profile/l/2",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/profile/m/2",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/profile/s/2",
+ "xchan_addr": "teller@xyz.macgirvin.com",
+ "xchan_url": "https://xyz.macgirvin.com/channel/teller",
+ "xchan_connurl": "https://xyz.macgirvin.com/poco/teller",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Teller",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-10-19 01:26:50",
+ "xchan_name_date": "2016-01-02 21:16:26",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ },
+ {
+ "id": "12",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_id": "24",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "218555",
+ "abook_closeness": "80",
+ "abook_created": "2016-01-27 00:48:43",
+ "abook_updated": "2016-12-04 17:16:58",
+ "abook_connected": "2016-12-04 17:16:58",
+ "abook_dob": "0001-01-01 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "0",
+ "abook_feed": "0",
+ "abook_profile": "debb5236efb1626cfbad33ccb49892801e5f844aa04bf81f580cfa7d13204819",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "xchan_guid": "d5EMLlt1tHHZ0dANoA7B5Wq9UgXoWcFS9-gXOkL_AAejcPApoQRyxfHTuu8DoTbUaO-bYmX5HPuWuK9PHyqNmA",
+ "xchan_guid_sig": "CVWEMRPtzI1YcHfnnWHTuv3H964OAmSElgUfxMoX6RdQdxNpqb_POirpVuyP8s3W17mVCfO5V9IAjkg5iKcqCk6YcvOD_egmMy-AnM9TC1kKndQHw55CunD82Q8K_xBNSXkSROizcNkKh9DVLjJPFjW1AqtI4njkZ3EMgrWqnbFRM1qPToUoCY9zM3tEMHoAD9YX1zP90wl40LzfN-dtcNWpSBbiz9owou62uzLbN7mrCwKOMlXLjwwGswRnxIsEnb3O-FXOs8hs0mArKe9snq1-BKeD16LyzxgwlpVLElzIJZGEZGtMdIJgeRzKuBvPjsOIpQ1yAkuOpFJ3nGCM-IPOIIjAmyVl5zD3xPVcxxpZlJRn5fG1Y-gnqTgsrEQCA7M6XPWQdrdHU4akZfyUyFJDhv3uM-jon9VzrYTBw68R0WA-1Z8WafEHA4qh5OWAj85lUarwhr7iTiEckH51ypPCPs6VbT6Pw7yMaxfjFOcipashQagx0tfOlDhE5dQANOXKASFtH1J9-CZY2MQdLPQ6u54d5whuHKMGaJ0V68pnmZ2rOn7g344Ah2WCJrm17jj60QsRMorqRFj7GMdPIA1XB8Wrk88MuYOe3Dhyuu6ZWKI7YTWJS690ZVkKUqAiNHqj0W86DtaiPUc_mmGR0fHl4Gksnko3WmCFv9q2X2E",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoj2xCJktBA8Ww7Hp+ZNL\nrNuQpo8UB/bfvRkIy+yua3xpF1TuXcnAH61kyRz8vXgOu/l2CyxQbIoaGslCV5Sy\n8JKeNXe+IilUdSSEjMIwCPfSPsYnMHsSnHWmPmclvJwEtQUKOZmW5mMuVBvXy7D2\njomFwc69AYphdyys6eQ7Dcn6+FRBiQbyMprZ5lxyVW+O4DuXVNa3ej2ebx0gCJZ4\ntTIlBoKwEey91dY+FyKVFjdwfNczpmL7LgmZXqcVx+MG3mYgibwdVMiXVj5X06cs\nV9hJ5Xi+Aklsv/UWJtjw9FVt7y9TLptnhh4Ra6T/MDmnBBIAkOR7P/X8cRv078MT\nl0IMsP0RJcDEtTLtwHFVtDs6p52KDFqclKWbqmxmxqV3OTPVYtArRGIzgnJi/5ur\nHRr5G6Cif7QY3UowsIOf78Qvy28LwSbdymgBAWwPPKIviXWxGO+9kMWdmPSUQrWy\nK0+7YA9P9fBUFfn9Hc+p8SJQmQ6OAqLwrDGiPSOlGaNrbEqwqLGgIpXwK+lEFcFJ\n3SPOjJRWdR2whlMxvpwX+39+H7dWN3vSa3Al4/Sq7qW8yW2rYwf+eGyp4Z0lRR+8\nJxFMCwZkSw5g14YdlikAPojv5V1c6KuA5ieg8G1hwyONV7A4JHPyEdPt0W0TZi6C\nCOVkPaC3xGrguETZpJfVpwUCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-4",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-5",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-6",
+ "xchan_addr": "cloner@xyz.macgirvin.com",
+ "xchan_url": "http://abc.macgirvin.com/channel/cloner",
+ "xchan_connurl": "http://abc.macgirvin.com/poco/cloner",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Karen",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-03-31 19:59:20",
+ "xchan_name_date": "2016-01-26 23:23:42",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ }
+
+ ] \ No newline at end of file
diff --git a/doc/en/api/api_item_update.md b/doc/en/api/api_item_update.md
new file mode 100644
index 000000000..cf1a28044
--- /dev/null
+++ b/doc/en/api/api_item_update.md
@@ -0,0 +1,225 @@
+API item/update
+===============
+
+
+Usage: POST /api/z/1.0/item/update
+
+Description: item/update posts an item (typically a conversation item or post, but can be any item) using form input.
+
+
+Required:
+
+- body
+
+ text/bbcode contents by default.
+
+
+Optional:
+
+- $_FILES['media']
+
+ uploaded media file to include with post
+
+- title
+
+ title of post/item
+
+- contact_allow
+
+ array of xchan.xchan_hash allowed to view this item
+
+- group_allow
+
+ array of group.hash allowed to view this item
+
+- contact_deny
+
+ array of xchan.xchan_hash not allowed to view this item
+
+- group_deny
+
+ array of group.hash not allowed to view this item
+
+- coord
+
+ geographic coordinates
+
+- location
+
+ freefrom location
+
+- expire
+
+ datetime this post will expire or be removed
+
+- mimetype
+
+ mimetype if not text/bbcode
+
+- parent
+
+ item.id of parent to this post (makes it a comment)
+
+- parent_mid
+
+ alternate form of parent using message_id
+
+- remote_xchan
+
+ xchan.xchan_hash of this message author if not the channel owner
+
+- consensus
+
+ boolean set to true if this is a consensus or voting item (default false)
+
+- nocomment
+
+ boolean set to true if comments are to be disabled (default false)
+
+- origin
+
+ do not use this without reading the code
+
+- namespace
+
+ persistent identity for a remote network or service
+
+- remote_id
+
+ message_id of this resource on a remote network or service
+
+- message_id
+
+ message_id of this item (leave unset to generate one)
+
+- created
+
+ datetime of message creation
+
+- post_id
+
+ existing item.id if this is an edit operation
+
+- app
+
+ application or network name to display with item
+
+- categories
+
+ comma separated categories for this item
+
+- webpage
+
+ item.page_type if not 0
+
+- pagetitle
+
+ for webpage and design elements, the 'page name'
+
+- layout_mid
+
+ item.mid of layout for this design element
+
+- plink
+
+ permalink for this item if different than the default
+
+- verb
+
+ activitystream verb for this item/activity
+
+- obj_type
+
+ activitystream object type for this item/activity
+
+
+
+Example:
+
+curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/item/update -d body="hello world"
+
+
+Returns:
+
+
+ {
+
+ "success": true,
+ "item_id": "2245",
+ "item": {
+ "id": "2245",
+ "mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "aid": "1",
+ "uid": "2",
+ "parent": "2245",
+ "parent_mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "thr_parent": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "created": "2016-12-03 20:00:12",
+ "edited": "2016-12-03 20:00:12",
+ "expires": "0001-01-01 00:00:00",
+ "commented": "2016-12-03 20:00:12",
+ "received": "2016-12-03 20:00:12",
+ "changed": "2016-12-03 20:00:12",
+ "comments_closed": "0001-01-01 00:00:00",
+ "owner_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "author_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "source_xchan": "",
+ "mimetype": "text/bbcode",
+ "title": "",
+ "body": "hello world",
+ "html": "",
+ "app": "",
+ "lang": "",
+ "revision": "0",
+ "verb": "http://activitystrea.ms/schema/1.0/post",
+ "obj_type": "http://activitystrea.ms/schema/1.0/note",
+ "obj": "",
+ "tgt_type": "",
+ "target": "",
+ "layout_mid": "",
+ "postopts": "",
+ "route": "",
+ "llink": "https://xyz.macgirvin.com/display/14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "plink": "https://xyz.macgirvin.com/channel/mychannel/?f=&mid=14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "resource_id": "",
+ "resource_type": "",
+ "attach": "",
+ "sig": "sa4TOQNfHtV13HDZ1tuQGWNBpZp-nWhT2GMrZEmelXxa_IvEepD2SEsCTWOBqM8OKPJLfNy8_i-ORXjrOIIgAa_aT8cw5vka7Q0C8L9eEb_LegwQ_BtH0CXO5uT30e_8uowkwzh6kmlVg1ntD8QqrGgD5jTET_fMQOIw4gQUBh40GDG9RB4QnPp_MKsgemGrADnRk2vHO7-bR32yQ0JI-8G-eyeqGaaJmIwkHoi0vXsfjZtU7ijSLuKEBWboNjKEDU89-vQ1c5Kh1r0pmjiDk-a5JzZTYShpuhVA-vQgEcADA7wkf4lJZCYNwu3FRwHTvhSMdF0nmyv3aPFglQDky38-SAXZyQSvd7qlABHGCVVDmYrYaiq7Dh4rRENbAUf-UJFHPCVB7NRg34R8HIqmOKq1Su99bIWaoI2zuAQEVma9wLqMoFsluFhxX58KeVtlCZlro7tZ6z619-dthS_fwt0cL_2dZ3QwjG1P36Q4Y4KrCTpntn9ot5osh-HjVQ01h1I9yNCj6XPgYJ8Im3KT_G4hmMDFM7H9RUrYLl2o9XYyiS2nRrf4aJHa0UweBlAY4zcQG34bw2AMGCY53mwsSArf4Hs3rKu5GrGphuwYX0lHa7XEKMglwBWPWHI49q7-oNWr7aWwn1FnfaMfl4cQppCMtKESMNRKm_nb9Dsh5e0",
+ "diaspora_meta": "",
+ "location": "",
+ "coord": "",
+ "public_policy": "",
+ "comment_policy": "contacts",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "item_restrict": "0",
+ "item_flags": "0",
+ "item_private": "0",
+ "item_origin": "1",
+ "item_unseen": "0",
+ "item_starred": "0",
+ "item_uplink": "0",
+ "item_consensus": "0",
+ "item_wall": "1",
+ "item_thread_top": "1",
+ "item_notshown": "0",
+ "item_nsfw": "0",
+ "item_relay": "0",
+ "item_mentionsme": "0",
+ "item_nocomment": "0",
+ "item_obscured": "0",
+ "item_verified": "1",
+ "item_retained": "0",
+ "item_rss": "0",
+ "item_deleted": "0",
+ "item_type": "0",
+ "item_hidden": "0",
+ "item_unpublished": "0",
+ "item_delayed": "0",
+ "item_pending_remove": "0",
+ "item_blocked": "0"
+ }
+
+ } \ No newline at end of file
diff --git a/doc/en/api/api_posting.bb b/doc/en/api/api_posting.bb
new file mode 100644
index 000000000..c708ad143
--- /dev/null
+++ b/doc/en/api/api_posting.bb
@@ -0,0 +1,24 @@
+[b][size=xx-large]Posting to the Matrix via the API[/size][/b]
+
+The API allows you to post to the red# by HTTP POST request. Below you see an example using the command line tool cURL:
+
+[code]curl -ssl -u [color=blue]$E-Mail[/color]:[color=blue]$Password[/color] -d "[color=blue]$Parameters[/color]" [url][observer=1][observer.baseurl][/observer][observer=0]example.com[/observer]/api/statuses/update
+[/url][/code]
+[table][tr][td]$E-Mail:[/td][td]The E-Mail Address you use to login, or the channel nickname (without the hostname)[/td][/tr]
+[tr][td]$Password:[/td][td]The Password you use to login[/td][/tr]
+[tr][td]$Parameters:[/td][td]That's the interesting part, here you insert the content you want to send using the following parameters:[/td][/tr][/table]
+
+[ul]
+[*]title: the title of the posting
+[*]channel: the channel you want to post to (do not use this parameter with HTTP Basic auth)
+[*]category: a comma-seperated list of categories for the posting
+[*]status: the content of the posting, formatted with BBCode
+ OR
+[*]htmlstatus:the content of the posting, formatted in HTML.
+[/ul]
+
+To post to a specific channel, replace the email address with the channel nickname. If you supply the channel parameter, it has to match the "email", but is superfluous anyway.
+
+Instead of calling [observer=1][observer.baseurl][/observer][observer=0]example.com[/observer]/api/statuses/update which returns a json (you could also add .json on the end to clarify) output, you can use [observer.baseurl]/api/statuses/update.xml to get an xml formatted return.
+
+Instead of Basic HTTP Authentification you could also use oAuth.
diff --git a/doc/en/api/api_xchan.md b/doc/en/api/api_xchan.md
new file mode 100644
index 000000000..d2b15e04c
--- /dev/null
+++ b/doc/en/api/api_xchan.md
@@ -0,0 +1,44 @@
+API xchan
+=========
+
+An xchan is a global location independent channel and is the primary record for a network
+identity. It may refer to channels on other websites, networks, or services.
+
+GET /api/z/1.0/xchan
+
+Required: one of [ address, hash, guid ] as GET parameters
+
+Returns a portable xchan structure
+
+Example: https://xyz.macgirvin.com/api/z/1.0/xchan?f=&address=mike@macgirvin.com
+
+Returns:
+
+ {
+ "hash": "jr54M_y2l5NgHX5wBvP0KqWcAHuW23p1ld-6Vn63_pGTZklrI36LF8vUHMSKJMD8xzzkz7s2xxCx4-BOLNPaVA",
+ "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg",
+ "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4",
+ "pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "photo_mimetype": "image/jpeg",
+ "photo_l": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-4",
+ "photo_m": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-5",
+ "photo_s": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-6",
+ "address": "mike@macgirvin.com",
+ "url": "https://macgirvin.com/channel/mike",
+ "connurl": "https://macgirvin.com/poco/mike",
+ "follow": "https://macgirvin.com/follow?f=&url=%s",
+ "connpage": "https://macgirvin.com/connect/mike",
+ "name": "Mike Macgirvin",
+ "network": "zot",
+ "instance_url": "",
+ "flags": "0",
+ "photo_date": "2012-12-06 05:06:11",
+ "name_date": "2012-12-06 04:59:13",
+ "hidden": "1",
+ "orphan": "0",
+ "censored": "0",
+ "selfcensored": "0",
+ "system": "0",
+ "pubforum": "0",
+ "deleted": "0"
+ } \ No newline at end of file
diff --git a/doc/en/api/group.md b/doc/en/api/group.md
new file mode 100644
index 000000000..8829ff416
--- /dev/null
+++ b/doc/en/api/group.md
@@ -0,0 +1,41 @@
+API group
+=========
+
+GET /api/z/1.0/group
+
+
+Description: list privacy groups
+
+
+Returns: DB tables of all privacy groups.
+
+To use with API group_members, provide either 'group_id' from the id element returned in this call, or 'group_name' from the gname returned in this call.
+
+
+ [
+
+ {
+ "id": "1",
+ "hash": "966c946394f3e2627bbb8a55026b5725e582407098415c02f85232de3f3fde76Friends",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Friends"
+ },
+ {
+ "id": "2",
+ "hash": "852ebc17f8c3ed4866f2162e384ded0f9b9d1048f93822c0c84196745f6eec66Family",
+ "uid": "2",
+ "visible": "1",
+ "deleted": "0",
+ "gname": "Family"
+ },
+ {
+ "id": "3",
+ "hash": "cc3cb5a7f9818effd7c7c80a58b09a189b62efa698a74319117babe33ee30ab9Co-workers",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Co-workers"
+ }
+ ] \ No newline at end of file
diff --git a/doc/en/api/statuses_update.bb b/doc/en/api/statuses_update.bb
new file mode 100644
index 000000000..acad440de
--- /dev/null
+++ b/doc/en/api/statuses_update.bb
@@ -0,0 +1,23 @@
+[h2]statuses/update[/h2]
+Parameters
+
+ title: Title of the status
+ status: Status in text [or bbcode] format
+ htmlstatus: Status in HTML format
+ in_reply_to_status_id
+ lat: latitude
+ long: longitude
+ media: image data
+ source: Application name
+ group_allow
+ contact_allow
+ group_deny
+ contact_deny
+
+
+Example
+
+[code]
+curl -u theUsername:thePassword http://mywebsite/api/statuses/update.xml -d status='Hello world'
+[/code]
+
diff --git a/doc/en/bugs.bb b/doc/en/bugs.bb
new file mode 100644
index 000000000..3bf2a0e29
--- /dev/null
+++ b/doc/en/bugs.bb
@@ -0,0 +1,32 @@
+[h2]Bugs, Issues, and things that go bump in the night...[/h2]
+[h3]Something went wrong! Who is in charge of fixing it?[/h3]
+
+[b]$Projectname Community Server[/b]
+
+$Projectname Community Server is open source software which is maintained by "the community" - essentially unpaid volunteers. Nobody is in charge of fixing bugs. We work together to keep the software and network running smoothly and error free. You are a member of this community, so we also require your help to provide quality software. There are no mythical "developers" who magically fix everything. It's up to all of us to pitch in and help.
+
+The first thing you need to do is talk to your hub administrator - the person who runs and manages your site. They are in the unique position of having access to the internal software and database and [b]logfiles[/b] and will need to be involved in fixing your problem. Other people "on the net" can't really help with this. The first thing the hub administrator needs to do is look at their logs and/or try to reproduce the problem. So try to be as helpful and courteous as possible in helping them look into the problem.
+
+To find your hub administrator (if you don't know who they are) please look at [url=[baseurl]/siteinfo]this page[/url]. If they have not provided any contact info on that page or provided an "Impressum" there, see [url=[baseurl]/siteinfo.json]this site info summary[/url] under the heading "admin:".
+
+It is highly recommended that bug reports be filed by hub administrators so that they can include the relevant logfile and database information relevant to the issue and be available to try workarounds and followup tests. Without this level of cooperation it may not be possible to fix the problem.
+
+[h3]I'm a hub administrator; what do I do?[/h3]
+
+The software instructions which provide this web service are open source and are available for your inspection. We encourage everybody to read it and see how everything works and verify that we aren't doing anything evil or negligent with your personal communications. If an error message was reported, often one can do a search on the source files for that error message and find out what triggered it. With this information and the site logfiles it may be possible to figure out the sequence of events leading to the error. There could also be other sites involved, and the problem may not even be on your site but elsewhere in the network. Try to pin down the communication endpoints (hubs or sites) involved in the problem and contact the administrator of that site or those sites. Please try and provide an event time of when things went wrong so it can be found in the logs. Work with the other administrator(s) to try and find the cause of the problem. Logfiles are your friend. When something happens in the software that we didn't expect, it is nearly always logged.
+
+[h3]The white screen of death[/h3]
+
+If you get a blank white screen when doing something, this is almost always a code or syntax error. There are instructions in the site .htconfig.php file which will allow the site administrator to enabling syntax logging. We recommend all sites use this. With syntax logging enabled repeat the sequence which led to the error and it should log the offending line of code. Hopefully you will be able to fix the problem with this information. When you do, please submit the fix "upstream" so that we can share the fix with the rest of the project members and other communities. This is a key benefit of using open source software - we share with each other and everybody benefits.
+
+[h3]I'm stumped. I can't figure out what is wrong.[/h3]
+
+At this point it might be worthwhile discussing the issue on one of the online forums. There may be several of these and some may be more suited to your spoken language. At this time, the 'Hubzilla Support' channel (support@zotadel.net) is the recommended forum for discussing bugs.
+
+If community members with software engineering training/expertise can't help you right away, understand that they are volunteers and may have a lot of other work and demands on their time. At this point you need to file a bug report. You will need an account on framagit.org to do this. So register, and then visit https://framagit.org/hubzilla/core/issues . Create an issue here and provide all the same information that you provided online. Don't leave out anything.
+
+Then you wait. If it's a high profile issue, it may get fixed quickly. But nobody is in charge of fixing bugs. If it lingers without resolution, please spend some more time investigating the problem. Ask about anything you don't understand related to the behaviour. You will learn more about how the software works and quite possibly figure out why it isn't working now. Ultimately it is somebody in the community who is going to fix this and you are a member of the community; and this is how the open source process works.
+
+
+Other people working to fix the problem may need to find out more, so do your homework and document what is happening and everything you've tried. Don't say "I did xyz and it didn't work." That doesn't tell us anything. Tell us precisely what steps you took and what you expected the result to be, and precisely what happened as a result. What page/URL were you looking at or what form were you filling in? If there were any error messages, don't say "there was an error message". Tell us exactly what the message said. Also tell us what hub you are using, what software version you're running and any other details that may be unique about your site configuration. It is understood that you might wish to keep some information and your connections private, however if you aren't willing to share the information other people need to reproduce/fix the problem, it may not get fixed.
+
diff --git a/doc/en/campaign.bb b/doc/en/campaign.bb
new file mode 100644
index 000000000..dddc614f9
--- /dev/null
+++ b/doc/en/campaign.bb
@@ -0,0 +1,237 @@
+[b]Initial Indiegg pitch[/b]
+
+[b][color= grey][size=20]What have we done, and what we hope to achieve[/size][/color][/b]
+
+[b][color= grey][size=18]Single-click sign on, nomadic identity, censorship-resistance, privacy, self-hosting[/size][/color][/b]
+
+We started $Projectname project by asking ourselves a few questions:
+
+- Imagine if it was possible to just access the content of different web sites, without the need to enter usernames and passwords for every site. Such a feature would permit Single-Click user identification: the ability to access sites simply by clicking on links to remote sites.
+Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
+
+We liked this idea and went ahead with coding it immediately. Today, single-click sign is in alpha state. It needs more love, which means a solid three months of full-time development efforts.
+
+- Think of your Facebook, Twitter, WordPress, or any other website where you currently have an account. Now imagine being able to clone your account, to make an exact duplicate of it (with all of your friends, posts and settings), then export your cloned account into another server that is part of this communication network. After you're done, both of your accounts are synced from the time they were cloned. It doesn't matter where you log in (at your original location, or where you imported your clone). You see the same content, the same friends, posts, and account settings.
+At that point, it is more appropriate to call your account an identity that is nomadic (it is not tied to one home, unless you choose to do so!).
+It's 2013, our online presence no longer has to be tied to a single server, domain name or IP address. We should be able to clone and import our identities to other servers. In such a network, it should only matter who you are, not where you are.
+
+We're very intrigued by the possibilities nomadic identities open up for freedom, censorship-resistance, and identity resilience. Consider the following scenarios:
+
+ -- Should a repressive government or corporation decide to delete your account, your cloned identity lives on, because it is located on another server, across the world, which is part of the same communication network. You can't be silenced!
+
+ -- What if there is a server meltdown, and your identity goes off line. No problem, you log into your clone and all is good.
+
+ -- Your server administrator can no longer afford to keep paying to support a free service (a labor love and principle, which all of us have participating in as system administrators of Friendica sites!). She notifies you that you must clone your account before the shutoff date. Rather than loose all your friends, and start from scratch by creating a new identity somewhere, you clone and move to another server.
+We feel this is especially helpful for the free web, where administrators of FOSS community sites are often faced with difficult financial decisions. Since many of them rely on donations, sometimes servers have to be taken offline, when costs become prohibitive for the brave DIY souls running those server. Nomadic identities should relieve some of the pressures associated with such situations.
+
+At the same time, we are also thinking of solutions that would make it possible for people running Red hubs to be financially sustainable. To that end, we're starting to implement service classes in our code, which would allow administrators to structure paid levels of service, if they choose to do so.
+
+Today, nomadic identity is currently in alpha state. It also needs more love, which means a solid three months of full-time development efforts.
+
+- Imagine a social network that is censorship-resistant, and privacy-respecting by design. It is not controlled by one mega-corporation, and where users cannot be easily censored by oppressive governments. So, in addition to nomadic identities, we are talking about decentralization, open source, freely software, that can run on any hardware that supports a database and a modern web browser. And we mean &quot;any hardware&quot;, from a self-hosted $35 Raspberry Pi, to the very latest Intel Xeon and AMD Bulldozer-powered server behemoths.
+
+We've realized that privacy requires full control over content. We should be able to delete, backup and download all of our content, as well as associated account/identity information. To this end, we have already implemented the initial version of account export and backup.
+
+Concerned about pages and pages of posts from months and years past? The solution should be simple: visit your settings page, specify that all content older than 7 days, with the exception of starred posts, should be automatically deleted. Done, the clutter is gone! (Consider also the privacy and anti-mass surveillance implications of this feature. PRISM disclosures have hinted that three-letter spying agencies around the world are recording all internet traffic and storing it for a few days at a time. We feel that automatic post expiration becomes a rather useful feature in this context, and implementing it is one of our near future priorities.)
+
+[b][color= grey][size=18]The Affinity Slider and Access Control Lists[/size][/color][/b]
+
+- What if the permissions and access control lists that help secure modern operating systems were extended into a communication network that lived on the internet? This means somebody could log into this network from their home site, and with the simple click of a few buttons dynamically sort who can have access to their online content on a very fine level: from restricting others from seeing your latest blog post, to sharing your bookmarks with the world.
+
+We've coded the initial version of such a new feature. It is called the &quot;Affinity Slider&quot;, and in our very-alpha user interface it looks like this.
+[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img]
+
+{INSERT SCREENSHOT OF A MATRIX PAGE}
+
+Think of it as an easy way to filter content that you see, based on the degree of &quot;closeness&quot; to you. Move the slider to Friends, and only content coming from contacts you've tagged as friends is displayed on your home page. Uncluttering thousands of contacts, friends, RSS feeds, and other content should be a basic feature of modern communication on the web, but not at the expense of ease of use.
+
+In addition to the Affinity Slider, we also have the ACL (Access Control List). Say you want to share something with only 5 of your contacts (a blog, two friends from college, and two forums). You click on the padlock, choose the recipients, and that's it. Only those identities will recieve their posts. Furthermore, the post will be encrypted via PKI (pulic key encryption) to help maintain privacy. In the age of PRISM, we don't know all the details on what's safe out there, but we still think that privacy by design should be automatically present, invisible to the user, and easy to use.
+Attaching permissions to any data that lives on this network, potentially solves a great many headaches, while achieving simplicity in communication.
+
+Think of it this way: the internet is nothing, but a bunch of permissions and a folder of data. You, the user controls the permissions and thus the data that is relevant to you.
+
+[b][color= grey][size=20]The Matrix is Born![/size][/color][/b]
+
+After asking and striving to answer a number of such questions, we realized that we were imagining a general purpose communication network with a number of unique, and potentially game-changing, features. We called it $Projectname and started thinking of it as an over-lay on top of the internet as it exists today; an operating system re-invented as a communication network, with its own permissions, access control lists, protocol, connectors to others services, and open-ended possibilities via its API. The sum of the matrix is greater than it's parts. We're not building website, but a way for websites to link together and grow into something that is unique and ever-changing, with autonomy and privacy.
+
+It's a lot of work, for anyone. So far, we've got a team of a handful of volunteers, code geeks, brave early adopters, system administrators and other good people, willing to give the project a shot. We're motivated by our commitment to a free web, where privacy is built-in, and corporations don't have a stranglehold on our daily communication.
+
+We need your help to finish it and release it to the world!
+
+[b][color= grey][size=20]What have we written so far[/size][/color][/b]
+
+As of the today, $Projectname is in developer preview (alpha) state. It is not ready for everyday use, but some of the initial set of core features are implemented (again, in alpha state). These include:
+
+- Zot, the protocol powering the matrix
+- Single-signon logins.
+- Nomadic identities
+- Basic content manipulation: creation, deletion, rudimentary handling of photos, and media files
+- A bare-bones outline of the API and user documentation.
+
+
+[b][color= grey][size=20]Our TO-DO List[/size][/color][/b]
+
+However, in addition to finishing and polishing the above, there are a number of features that have to implemented to make $Projectname ready for daily use. If we meet our fundraising goal, we hope to dive into the following road map, by order of priority:
+
+- A professionally designed user interface (UI), interface that is adaptive to any user level, from end users who want to use the Matrix as a social network, to tinkerers who will put together a customized blog using Comanche, to hackers who will develop and extend the matrix using a built-in code editor, that hooks to the API and the git.
+
+- Comanche, our new markup language, similar to BBCode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. You can read more about it on our github wiki: https://github.com/friendica/red/wiki/Comanche
+
+- A unique help system that lives in the matrix, but is not based on the principles of a search engine. We have some interesting ideas about decentralizing help documentation, without going down the road of distributed search engines. Here's a hint: We shouldn't be searching at all, we should just be filtering what's already there in new, and cunning ways.
+
+- An appropriate logo, along with professionally done documentation system, both for our API, as well as users.
+
+- WordPress-like single button software upgrades
+
+- A built-in development environment, using an integrated web-based code editor such as Ace9
+
+[b][color= grey][size=20]What will the money be used for[/size][/color][/b]
+
+If we raise our targeted amount of funds, we plan to use it as follows:
+
+1) Fund 6 months {OR WHATEVER} of full time work for our current core developers, Mike, Thomas, and Tobias {ANYONE ELSE?]
+
+2) Pay a professional web developer to design an kick ass reference theme, along with a project logo.
+
+3) {WHAT ELSE?}
+
+[b][color= grey][size=20]Deadlines[/size][/color][/b]
+
+[b]March, 2014: $Projectname Beta with the following features[/b]
+
+- {LIST FEATURES}
+
+[b][color= grey][size=20]Who We Are[/size][/color][/b]
+
+Mike: {FILL IN BIO, reference Friendica, etc.}
+
+Thomas: {bio blurb}
+
+Tobias: {bio blurb}
+
+Arto: {documentation, etc.}
+
+{WHO ELSE? WE NEED A TEAM, AT LEAST 3-4 PEOPLE}
+
+[b][color= grey][size=20]What Do I Get as a Supporter?[/size][/color][/b]
+
+Our ability to reach 1.0 stable release depends on your generosity and support. We appreciate your help, regardless of the amount! Here's what we're thinking as far as different contribution levels go:
+
+[b]$1: {CATCHY TAGLINE}[/b]
+
+We'll list your name on our initial supporters list, a Hall of Fame of the matrix!
+
+[b]$5:[/b]
+
+[b]$10: [/b]
+
+[b]$16: [/b]
+
+You get one of your $Projectname t-shirts, as well as our undying gratitude.
+
+[b]$32: [/b]
+
+[b]$64 [/b]
+
+[b]128 [/b]
+
+[b]$256: [/b]
+
+[b]$512: [/b]
+
+[b]$1024 [/b]
+
+[b]$2048[/b]
+
+Each contributor at this level gets their own $Projectname virtual private server, installed, hosted and supported by us for a period of 1 year.
+
+[b][color= grey][size=20]Why are we so excited about $Projectname?[/size][/color][/b]
+
+{SOMETHING ABOUT THE POTENTIAL IMPACT OF RED, ITS INNOVATIONS, ETC&gt;
+
+[b][color= grey][size=20]Other Ways to Help[/size][/color][/b]
+
+We're a handful of volunteers, and we understand that not everyone can contribute by donating money. There are many other ways you can in getting the Matrix to version 1.0!
+
+First, you can checkout our source code on github: https://framagit.org/hubzilla/core/
+
+Maybe you can dive in and help us out with some development.
+
+Second, you can install the current developer preview on a server and start compiling bug reports.
+
+Third, register at one of the public alpha Red hubs, and get a feel for what Red is trying to do!
+
+Perhaps you're good at writing and documenting stuff. Grab an account at one of the public alphas and give us a hand.
+
+[b][color= grey][size=20]Frequently Asked Questions[/size][/color][/b]
+
+[b]1. Is Red a social network?[/b]
+
+$Projectname is not a social network. We're thinking of it as a general purpose communication network, with sharing, and public/private communications built into the matrix.
+
+[b]2. What is the difference between Red and Friendica?[/b]
+
+What's the difference between a passport, and a postcard?
+
+Friendica is really, really good at sending postcards. It can do all sorts of things with postcards. It can send them to your friends. It can send them to people you don't know. It can put them in an envelope and send them privately. It can run them through a photocopier and plaster them all over the internet. It can even take postcards in one language and convert them to many others so your friends who speak a different language can read them.
+
+What Friendica can't do, is wave a postcard at somebody and expect them to believe that holding this postcard prove you are who you say you are. Sure, if you've been sending somebody postcards, they might accept that it is you in the picture, but somebody who has never heard of you will not accept ownership of a postcard as proof of identity.
+
+$Projectname offers a passport.
+
+You can still use it to send postcards. At the same time, when you wave your passport at somebody, they do accept it as proof of identity. No longer do you need to register at every single site you use. You already have an account - it's just not necessarily at our site - so we'll ask to see your passport instead.
+
+Once you've proven your identity, a Red hub lets you use our services, as though you'd registered with directly, and we'd verified your credentials as would have happened in the olden days. These resources can, of course, be anything at all.
+
+[b]2. Why did you choose PHP, instead of Ruby or Python?[/b]
+
+The reference implementation is in PHP. We chose PHP, because it is available everywhere, and is easily configurable. We understand the debates between proponents and opponents of PHP, Ruby and Python. Nothing prevents implementations of Zot and the matrix in those languages. In fact, people on the matrix have already started developing a version of Red in Python [SOURCE?], and there is talk about future implementations in C (aiming for blazing native performance) and Java. It's free and open source, so we feel it's only a matter of time, once Red is initially completed.
+
+[b]4. Other than PHP, what other technology does Red use?[/b]
+
+We use MySQL as our database (this include any forks such as, MariaDB or Percona), and any modern webserver (Apache, nginx, etc.).
+
+[b]5. How is the Affinity Slider different from Mozilla's Persona?[/b]
+{COMPLETE}
+
+[b]6. Does $Projectname use encryption? Details please![/b]
+
+Yes, we do our best to use free and open source encryption libraries to help achieve privacy from general, mass surveillance.
+
+Communication between web browsers and Red hubs is encrypted using SSL certificates.
+
+Private communication on the matrix is protected by AES symmetric encryption, which is itself protected by RSA PKI (public key encryption). By default, we use AES-256-CBC, and our RSA keys are set to 4096-bits.
+
+For more info on our initial implementation of encrypted communication, check out our source code at Github: https://github.com/friendica/red/blob/master/include/crypto.php
+
+[b]7. What do you mean by decentralization? [/b]
+
+
+[b]8. Can I build my own website with in $Projectname?[/b]
+
+Yes. The short explanation: We've got this spiffy idea we're calling &quot;Comanche&quot;, which will allow non-programmers to build complete custom websites, and any such website will be able to connect to any other website or channel in the matrix. The goal of Comanche is to hide the technical complexities of communicating in the matrix, while encouraging people to use their creativity and put together their own unique presence on the matrix.
+
+The longer explanation: Comanche is a markup language, similar to bbcode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Description Language file (&quot;.pdl&quot;, pronounced &quot;puddle&quot;) to create these pages. Bbcode is not a requirement; an XML PDL file could also be used. The tag delimiters would be different. Usage is the same.
+
+Additional information is available on our Github project wiki: https://github.com/friendica/red/wiki/Comanche
+
+Comanche is another one of our priorities for the next six months.
+
+[b]9. Where can I see some technical description of Zot?[/b]
+
+Our github wiki contains a number of high-level and technical descriptions of Zot, Comanche, and Red in general: https://github.com/friendica/red/wiki
+
+[b]10. What happens if you raise more than {TARGETED NUMBER}?[/b]
+
+Raising more than our initial goal of funds, will speed up our development efforts. More developers will be able to take time off from other jobs, and concentrate efforts on finishing Red.
+
+[b]11 Can I make a contribution via Bitcoin?[/b]
+
+{YES/NO}
+
+[b]12. I have additional Questions[/]
+
+Awesome. We'd be more than happy to chat. You can find us {HERE}
+
+#include doc/macros/main_footer.bb;
+
diff --git a/doc/en/checking_account_quota_usage.bb b/doc/en/checking_account_quota_usage.bb
new file mode 100644
index 000000000..7612d03d8
--- /dev/null
+++ b/doc/en/checking_account_quota_usage.bb
@@ -0,0 +1,20 @@
+[b]Checking your account quota usage (service limits usage)[/b]
+
+Your hub might implement service class limits, assigning limits to the total size of file, photo, channels, top-level posts, etc., that can be created by an account holder for a specific service level.
+
+Here's how you can quickly check how much of your assigned quota you're currently using:
+
+[b]Check file storage quota levels[/b]
+Visit the following URL in your browser:
+[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer]
+[observer=0]example.com/filestorage/username[/observer]
+
+[b]Check uploaded photos storage quota levels[/b]
+[observer=1][observer.baseurl]/photos/[observer.webname][/observer]
+[observer=0]example.com/photos/username[/observer]
+
+Example:
+[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer]
+[observer=0]example.com/filestorage/username[/observer]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/comanche.bb b/doc/en/comanche.bb
new file mode 100644
index 000000000..faf7e695e
--- /dev/null
+++ b/doc/en/comanche.bb
@@ -0,0 +1,261 @@
+[b]Comanche Page Description Language[/b]
+
+Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages.
+
+Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose.
+
+[b]Page Templates[/b]
+Currently there are five layout templates, unless your site provides additional layouts.
+
+[code]
+ [b]default[/b]
+ The default template defines a &quot;nav&quot; region across the top, &quot;aside&quot; as a fixed width sidebar,
+ &quot;content&quot; for the main content region, and &quot;footer&quot; for a page footer.
+
+
+ [b]full[/b]
+ The full template defines the same as the default template with the exception that there is no &quot;aside&quot; region.
+
+
+ [b]choklet[/b]
+ The choklet template provides a number of fluid layout styles which can be specified by flavour:
+
+ (default flavour) - a two column layout similar to the "default" template, but more fluid
+ bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays
+ three - three column layout (adds a "right_aside" region to the default template)
+ edgestwo - two column layout with fixed side margins
+ edgesthree - three column layout with fixed side margins
+ full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar
+
+ [b]redable[/b] (sic)
+ A template for reading longer texts full screen (so without navigation bar). Three columns: aside, content and right_aside.
+ For maximum readability it is advised to only use the middle content column.
+
+ [b]zen[/b]
+ Gives you the freedom to do everything yourself. Just a blank page with a content region.
+
+[/code]
+
+To choose a layout template, use the 'template' tag.
+
+[code]
+ [template]full[/template]
+
+[/code]
+
+To choose the "choklet" template with the "three" flavour:
+
+[code]
+ [template=three]choklet[/template]
+
+[/code]
+
+The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions.
+
+Three &quot;macros&quot; have been defined for your use.
+[code]
+ $htmlhead - replaced with the site head content.
+ $nav - replaced with the site navigation bar content.
+ $content - replaced with the main page content.
+
+[/code]
+
+By default, $nav is placed in the &quot;nav&quot; page region and $content is placed in the &quot;content&quot; region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions.
+
+
+To select a theme for your page, use the 'theme' tag.
+[code]
+ [theme]suckerberg[/theme]
+
+[/code]
+This will select the theme named &quot;suckerberg&quot;. By default your channel's preferred theme will be used.
+
+[code]
+ [theme=passion]suckerberg[/theme]
+
+[/code]
+This will select the theme named &quot;suckerberg&quot; and select the &quot;passion&quot; schema (theme variant). Alternatively it may be possible to use a condensed theme notation for this.
+
+[code]
+ [theme]suckerberg:passion[/theme]
+
+[/code]
+
+The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier.
+
+[b]Regions[/b]
+Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.
+
+[code]
+ [region=htmlhead]....content goes here....[/region]
+ [region=aside]....content goes here....[/region]
+ [region=nav]....content goes here....[/region]
+ [region=content]....content goes here....[/region]
+
+[/code]
+
+[b]CSS and Javascript[/b]
+We have the possibility to include javascript and css libraries in the htmlhead region. At present we make use of jquery (js), bootstrap (css/js) and foundation (css/js).
+This will overwrite the selected themes htmlhead.
+
+[code]
+ [region=htmlhead]
+ [css]bootstrap[/css]
+ [js]jquery[/js]
+ [js]bootstrap[/js]
+ [/region]
+
+[/code]
+
+[b]Menus and Blocks[/b]
+Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created.
+
+[code]
+ [menu]mymenu[/menu]
+
+[/code]
+This places the menu called &quot;mymenu&quot; at this location on the page, which must be inside a region.
+
+[code]
+ [menu=horizontal]mymenu[/menu]
+
+[/code]
+This places the menu called &quot;mymenu&quot; at this location on the page, which must be inside a region. Additionally it applies the "horizontal" class to the menu. "horizontal" is defined in the redbasic theme. It may or may not be available in other themes.
+
+[code]
+ [menu][var=wrap]none[/var]mymenu[/menu]
+
+[/code]
+The variable [var=wrap]none[/var] in a block removes the wrapping div element from the menu.
+
+[code]
+ [block]contributors[/block]
+[/code]
+This places a block named &quot;contributors&quot; in this region.
+
+[code]
+ [block=someclass]contributors[/block]
+
+[/code]
+This places a block named &quot;contributors&quot; in this region. Additionally it applies the &quot;someclass&quot; class to the block. This replaces the default block classes &quot;bblock widget&quot;.
+
+[code]
+ [block][var=wrap]none[/var]contributors[/block]
+
+[/code]
+The variable [var=wrap]none[/var] in a block removes the wrapping div element from the block.
+
+[b]Widgets[/b]
+Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides
+
+[code]
+ profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments
+ tagcloud - provides a tag cloud of categories
+ count - maximum number of category tags to list
+
+[/code]
+
+Widgets and arguments are specified with the 'widget' and 'var' tags.
+[code]
+ [widget=recent_visitors][var=count]24[/var][/widget]
+
+[/code]
+
+This loads the &quot;recent_visitors&quot; widget and supplies it with the argument &quot;count&quot; set to &quot;24&quot;.
+
+[b]Comments[/b]
+The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page.
+
+[code]
+ [comment]This is a comment[/comment]
+
+[/code]
+
+[b]Conditional Execution[/b]
+You can use an 'if' construct to make decisions. These are currently based on system configuration variable or the current observer.
+
+[code]
+ [if $config.system.foo]
+ ... the configuration variable system.foo evaluates to 'true'.
+ [else]
+ ... the configuration variable system.foo evaluates to 'false'.
+ [/if]
+
+ [if $observer]
+ ... this content will only be show to authenticated viewers
+ [/if]
+
+[/code]
+
+ The 'else' clause is optional.
+
+ Several tests are supported besides boolean evaluation.
+
+[code]
+ [if $config.system.foo == bar]
+ ... the configuration variable system.foo is equal to the string 'bar'
+ [/if]
+ [if $config.system.foo != bar]
+ ... the configuration variable system.foo is not equal to the string 'bar'
+ [/if]
+ [if $config.system.foo {} bar ]
+ ... the configuration variable system.foo is a simple array containing a value 'bar'
+ [/if]
+ [if $config.system.foo {*} bar]
+ ... the configuration variable system.foo is a simple array containing a key named 'bar'
+ [/if]
+[/code]
+
+[b]Complex Example[/b]
+[code]
+ [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment]
+
+ [template]3-column-with-header[/template]
+
+ [comment]Use the &quot;darknight&quot; theme[/comment]
+
+ [theme]darkknight[/theme]
+
+ [comment]Use the existing site navigation menu[/comment]
+
+ [region=nav]$nav[/region]
+
+ [region=side]
+
+ [comment]Use my chosen menu and a couple of widgets[/comment]
+
+ [menu]myfavouritemenu[/menu]
+
+ [widget=recent_visitors]
+ [var=count]24[/var]
+ [var=names_only]1[/var]
+ [/widget]
+
+ [widget=tagcloud][/widget]
+ [block]donate[/block]
+
+ [/region]
+
+
+
+ [region=middle]
+
+ [comment]Show the normal page content[/comment]
+
+ $content
+
+ [/region]
+
+
+
+ [region=right]
+
+ [comment]Show my condensed channel &quot;wall&quot; feed and allow interaction if the observer is allowed to interact[/comment]
+
+ [widget]channel[/widget]
+
+ [/region]
+
+[/code]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/context/de/admin/logs/help.html b/doc/en/context/de/admin/logs/help.html
new file mode 100644
index 000000000..1441d9075
--- /dev/null
+++ b/doc/en/context/de/admin/logs/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf dieser Seite können die Einstellungen zur Protokollierung angepasst und vorhandene Protokolle angezeigt werden.</dd>
+ <dt>Protokoll Einstellungen</dt>
+ <dd>Bei aktivierter Debugging-Option werden System-Log Informationen an die Datei in der <b>Protokolldatei</b> im EIngabefeld hinzugefügt. Der Pfad ist relativ zum Hub-Wurzelverzeichnis. Daauf achten, dass diese Datei vom Webserver geschrieben werden kann.</dd>
+ <dt>Protokollstufe</dt>
+ <dd>Die Protokollstufe bestimmt, wie viele Informationen an die Protokolldatei angefügt werden. Warnung: Eine hohe Protokollstufe kann sehr schnell die Größe der Protokolldatei anwachsen lassen, vor allem, wenn der Hub viele Mitglieder hat.</dd>
+</dl>
diff --git a/doc/en/context/de/admin/queue/help.html b/doc/en/context/de/admin/queue/help.html
new file mode 100644
index 000000000..e59fdcaee
--- /dev/null
+++ b/doc/en/context/de/admin/queue/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Die Warteschlangenstatistik zeigt, wie viele Nachrichten zur Auslieferung an andere Hubs noch in der Warteschlange stehen. Die Priorität steht in Beziehung mit der Anzahl fehlgeschlagener Auslieferungsversuche.</dd>
+</dl>
diff --git a/doc/en/context/de/admin/security/help.html b/doc/en/context/de/admin/security/help.html
new file mode 100644
index 000000000..6465e8f0e
--- /dev/null
+++ b/doc/en/context/de/admin/security/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf dieser Seite können verschiedene Sicherheitseinstellungen vorgenommen werden. Um geänderte Einstellungen zu speichern, muss der Knopf "Bestätigen" gedrückt werden.</dd>
+</dl>
diff --git a/doc/en/context/de/appman/help.html b/doc/en/context/de/appman/help.html
new file mode 100644
index 000000000..888ee6206
--- /dev/null
+++ b/doc/en/context/de/appman/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Ändere die individuellen Eigenschaften der ausgewählten App. Kategorien erlauben dir das Einsortieren der Apps um sie in der Liste leichter zu finden. Kundenspezifische Apps, die du oder dein Administrator erstellt haben, können weitere Felder enthalten wie "Preis der App" oder "Ort (URL), um die App zu kaufen". Dies gilt nicht für Hubzilla Core Apps.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/de/channel/help.html b/doc/en/context/de/channel/help.html
new file mode 100644
index 000000000..fbfcac3c1
--- /dev/null
+++ b/doc/en/context/de/channel/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf dieser Seite wird der eigene aktuelle Kanal angezeigt. Dies entspricht ungefähr den Profilseiten in anderen sozialen Netzwerken. Im Kanal veröffentliche Beiträge werden gemäß den Anzeige-Berechtigungen des Betrachters angezeigt.</dd>
+ <dt>Beitrag anlegen</dt>
+ <dd>Falls der Betrachter/Besucher die Berechtigung zum Anlegen von Beiträgen besitzt, wird im oberen Bereich der Beitragseditor angezeigt.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Kanal-Inhalte-Tabs</a></dt>
+ <dd>Die Tabs für unterschiedliche Kanal-Inhalte zeigen die unterschiedlichen veröffentlichten Inhalte des Kanals an. The <b>Über</b> Tab verweist auf das Profil des Kanals. Der <b>Fotos</b> Tab verweist auf die Foto-Gallerien des Kanals. Der <b>Dateien</b> Tab verweist auf allgemeine vom Kanal veröffentlichte und geteilte Dateien.</dd>
+</dl>
diff --git a/doc/en/context/de/chat/help.html b/doc/en/context/de/chat/help.html
new file mode 100644
index 000000000..ba355365f
--- /dev/null
+++ b/doc/en/context/de/chat/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Chaträume können angelegt und für die Echtzeit-Kommunikation verwendet werden. Die Zugriffskontrolle verwendet dabei das Hubzilla-Berechtigungssystem.</dd>
+ <dt>Chatraum anlegen</dt>
+ <dd>Über den Knopf "Neu anlegen" wird ein neuer Chatraum eröffnet. Hierfür einen Namen und angeben, wie lange Nachrichten aufbewahrt werden sollen.</dd>
+ <dt>Chatten</dt>
+ <dd>Die Nachricht in der der Nachrichtenbox eingeben und "Bestätigen" drücken. Über den Menüknopf neben "Bestätigen" kann ein Anwesenheitsstatus gesetzt werden. Andere Teilnehmer am Chatraum werden im Seitenpanel unter "Chatmitglieder" angezeigt.</dd>
+</dl>
diff --git a/doc/en/context/de/cloud/help.html b/doc/en/context/de/cloud/help.html
new file mode 100644
index 000000000..e72ad1743
--- /dev/null
+++ b/doc/en/context/de/cloud/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Diese Seite zeigt die veröffentlichten und geteilten Dateien des Kanals an. Welche Dateien ein Besucher sehen kann, wird über die individuellen Dateiberechtigungen bestimmt, die vom Kanal-Besitzer bestimmt werden. Wurde die Berechtigung zum Anlegen/Hochladen von Dateien vergeben, werden die entsprechenden Steuerungsknöpfe angezeigt.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Kanal-Inhalte-Tabs</a></dt>
+ <dd>Die Tabs für unterschiedliche Kanal-Inhalte zeigen die unterschiedlichen veröffentlichten Inhalte des Kanals an. The <b>Über</b> Tab verweist auf das Profil des Kanals. Der <b>Fotos</b> Tab verweist auf die Foto-Gallerien des Kanals. Der <b>Dateien</b> Tab verweist auf allgemeine vom Kanal veröffentlichte und geteilte Dateien.</dd>
+</dl>
diff --git a/doc/en/context/de/connections/help.html b/doc/en/context/de/connections/help.html
new file mode 100644
index 000000000..61789ea38
--- /dev/null
+++ b/doc/en/context/de/connections/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf dieser Seite werden die Verbindungen des Kanals angezeigt. Diese Liste kann <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Click to highlight element...">sortiert und gefilter werden über den Menüknopf neben dem Suchknopf</a>.</dd>
+ <dt>Verbindungsdetails</dt>
+ <dd>Jeder Eintrag in der Liste zeigt die Details einer Verbindung. Ein durchsichtiges (ausgegrautes) Avatar-Bild zeigt archivierte Verbindungen an (diese konnten min. 30 Tage nicht erreicht werden).</dd>
+ <dt>Verbindungsstatus</dt>
+ <dd>Eine Verbindung kann sich in verschiedenen Stati befinden: <ul><li>Archiviert</li><li>Ignoriert</li><li>Blockiert</li><li>Versteckt</li></ul></dd>
+</dl>
diff --git a/doc/en/context/de/connections/ifpending/help.html b/doc/en/context/de/connections/ifpending/help.html
new file mode 100644
index 000000000..3e55b34c3
--- /dev/null
+++ b/doc/en/context/de/connections/ifpending/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf dieser Seite werden Verbindungswünsche von anderen Kanälen an diesen Kanal angezeigt. Diese Liste kann <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Click to highlight element...">sortiert und gefilter werden über den Menüknopf neben dem Suchknopf</a>.</dd>
+ <dt>Verbindungsdetails</dt>
+ <dd>Jeder Eintrag in der Liste zeigt die Details einer Verbindung. Ein durchsichtiges (ausgegrautes) Avatar-Bild zeigt archivierte Verbindungen an (diese konnten min. 30 Tage nicht erreicht werden).</dd>
+ <dt>Verbindungsstatus</dt>
+ <dd>Eine Verbindung kann sich in verschiedenen Stati befinden: <ul><li>Archiviert</li><li>Ignoriert</li><li>Blockiert</li><li>Versteckt</li></ul></dd>
+</dl>
diff --git a/doc/en/context/de/events/help.html b/doc/en/context/de/events/help.html
new file mode 100644
index 000000000..b0dc95b3e
--- /dev/null
+++ b/doc/en/context/de/events/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf dieser Seite wird ein Kalender mit eigenen und von anderen verbundenen Kanälen geteilte Ereignisse angezeigt.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#title", 0); return false;' title="Click to highlight element...">Kalenderanzeige</a></dt>
+ <dd>Die Monats-, Wochen- und Tagesansicht des Kalenders kann im Panel ausgewählt werden.</dd>
+ <dt>Export/Import</dt>
+ <dd>Kalendereinträge können Eim Standard-Format iCalendar (.ics) exportiert oder importiert werden.</dd>
+</dl>
diff --git a/doc/en/context/de/mail/help.html b/doc/en/context/de/mail/help.html
new file mode 100644
index 000000000..b89135d8c
--- /dev/null
+++ b/doc/en/context/de/mail/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Die Privaten Nachrichten sind nur für den Kanal-Besitzer und den Empfänger sichtbar.</dd>
+ <dt>Konversationen</dt>
+ <dd>Über <b>Konversationen</b> kann eine vollständige fortlaufene Ansicht einer Konversation angezeigt werden. Verfügbare Konversationen werden unter dem Punkt Konversationen im Panel angezeigt.</dd>
+ <dt>Eingang/Ausgang</dt>
+ <dd>Einzelne versandte Nachrichten kännen über den Punkt <b>Ausgang</b> und empfangene Nachrichten über <b>Eingang</b> gefiltert dargestellt werden.</dd>
+ <dt>Neue Nachricht</dt>
+ <dd>Über <b>Neue Nachricht</b> kann eine neue Nachricht erstellt werden.</dd>
+ <dt>Sonstiges</dt>
+ <dd>Über das Menü einzelner Nachrichten können besondere Funktionen ausgelöst werden: Zustellungsbericht kann abgerufen werden, Nachrichten (die noch nicht angesehen wurden!) können widerrufen und gelöscht werden.</dd>
+</dl>
diff --git a/doc/en/context/de/network/help.html b/doc/en/context/de/network/help.html
new file mode 100644
index 000000000..6590f597d
--- /dev/null
+++ b/doc/en/context/de/network/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf der Netzwerkseite wird der Strom von Beiträgen und Konversationen angezeigt. Typischerweise wird nach kürzlich aktualisierten Beiträgen sortiert. Diese Seite kann sehr weitgehend angepasst werden.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#profile-jot-wrapper", 0); return false;' title="Click to highlight element...">Beitrag anlegen</a></dt>
+ <dd>Im oberen Bereich der Seite wird eine Textbox "Teilen" angezeigt. Nach Klick in diese Box wird der Beitragseditor angezeigt. Der Beitragseditor kann angepasst werden; in den Basiseinstellungen stehen Felder für Inhalt und einem optionalen Titel bereit. Knöpfe unterhalb des Inhaltes erleichtern die Eingabe von Formatierungen, Links, Bildern und anderen Daten im Beitrag. Über die Knöpfe im rechten Bereich kann eine Vorschau aktiviert, Berechtigungen gesetzt und der Beitrag abgesendet werden.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 1); return false;' title="Click to highlight element...">Gruppen</a></dt>
+ <dd>Die erstellten Gruppen werden im Panel angezeigt. Über die Gruppen kann nach Beiträgen von Gruppenmitgliedern gefiltert werden.</dd>
+ <dt><a href='#' onclick='$("#dbtn-acl").click(); return false;' title="Click to highlight element...">Beitragsberechtigungen</a></dt>
+ <dd>Die Zugriffskontrollliste (Access Control List; ACL) steuert, wer den Beitrag sehen darf. Nach Klick auf das Schloß neben dem Knopf "Teilen" öffnet sich ein Dialog, in dem Kanäle oder Gruppen ausgewählt werdenkönnen, die diesen Beitrag sehen dürfen. s kann auch gezielt verboten werden, dass ein Kanal oder eine Gruppe den Artikel sehen darf (nützlich beispielsweise für die Planung einer Überraschungsparty in einer Gruppe, in der der Überraschte Mitglied ist).</dd>
+</dl>
diff --git a/doc/en/context/de/photos/help.html b/doc/en/context/de/photos/help.html
new file mode 100644
index 000000000..437d2c369
--- /dev/null
+++ b/doc/en/context/de/photos/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Diese Seite zeigt die veröffentlichten und geteilten Fotos des Kanals an. Welche Fotos ein Besucher sehen kann, wird über die individuellen Berechtigungen bestimmt, die vom Kanal-Besitzer bestimmt werden. Wurde die Berechtigung zum Anlegen/Hochladen von Bildern vergeben, werden die entsprechenden Steuerungsknöpfe angezeigt.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Kanal-Inhalte-Tabs</a></dt>
+ <dd>Die Tabs für unterschiedliche Kanal-Inhalte zeigen die unterschiedlichen veröffentlichten Inhalte des Kanals an. The <b>Über</b> Tab verweist auf das Profil des Kanals. Der <b>Fotos</b> Tab verweist auf die Foto-Gallerien des Kanals. Der <b>Dateien</b> Tab verweist auf allgemeine vom Kanal veröffentlichte und geteilte Dateien.</dd>
+</dl>
diff --git a/doc/en/context/de/profile/help.html b/doc/en/context/de/profile/help.html
new file mode 100644
index 000000000..ece33457d
--- /dev/null
+++ b/doc/en/context/de/profile/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Dies ist die Profilseite eines Kanals. Hier werden typischerweise Informationen angezeigt, die den Kanal beschreiben. Wenn der Kanal beispielsweise eine Person in einem sozialen Netzwerk repräsentiert, könnten Kontaktinformationen und andere persönliche Details hier veröffentlicht werden. Kanäle können mehrere Profile besitzen, die abhängig vom Betrachter/Besucher angezeigt werden.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Kanal-Inhalte-Tabs</a></dt>
+ <dd>Die Tabs für unterschiedliche Kanal-Inhalte zeigen die unterschiedlichen veröffentlichten Inhalte des Kanals an. The <b>Über</b> Tab verweist auf das Profil des Kanals. Der <b>Fotos</b> Tab verweist auf die Foto-Gallerien des Kanals. Der <b>Dateien</b> Tab verweist auf allgemeine vom Kanal veröffentlichte und geteilte Dateien.</dd>
+</dl>
diff --git a/doc/en/context/de/register/help.html b/doc/en/context/de/register/help.html
new file mode 100644
index 000000000..9ee062ee8
--- /dev/null
+++ b/doc/en/context/de/register/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Auf dieser Seite können sich Besucher registrieren, um mit einer Anmeldungskennung Zugang zum Portal zu erhalten. Angemeldeten Benutzern sehen nicht nur die öffentlichen Inhalte, sondern können selber Inhalte veröffentlichen und Soziale Netzwerk Kommunikationen durchführen, und sehr viel mehr.</dd>
+ <dt>Arten der Registrierung</dt>
+ <dd>Eine Registrierung ist mit einer eMail Adresse möglich, oder auch anonym (dann das eMail Feld nicht ausfüllen). Vielleicht haben Sie auch einen Einladungscode erhalten, der dann mit der eMail Adresse angegeben werden kann. Der Link oberhalb des Feldes eMail ermöglich die Eingabe des Einladungscodes.</dd>
+ <dt>Ablauf der Registrierung</dt>
+ <dd>Für Anmeldungen nach einer erfolgreichen Registrierung ist ein eigenes Kennwort festzulegen. Es ist sicherheitshalber zweimal mit identischen Werten einzugeben, weil es nicht angezeigt wird. Das Kennwort ist geheim zu halten und nur für den eigenen Gebrauch bestimmt. Anonym registrierte Benutzer erhalten eine automatisch zugewiesene Kennung, und sollten das eigene Kennwort nicht vergessen, weil es im Gegensatz zur eMail Registrierung zunächst keine Rücksetzfunktion gibt. Je nach Konfiguration der Hub-Instanz kann eine Bestätigungsfunktion erforderlich sein. Benutzer der eMail Registrierung erhalten eine entsprechende Nachricht. Bei anonymen Registrierungen wird ein weiterer Dialog angezeigt, der die Zugangskennung und eine Pin zeigt. Jene Dialogseite sollte unbedingt sicher und langfristig aufbewahrt werden (z.B. durch Ausdruck, Screenshot, Foto), weil die Daten zu einem späten Zeitpunkt noch einmal zu bestätigen sind.</dd>
+ <dt>Die Digitale Identität</dt>
+ <dd>Je nach Konfiguration der Hub-Instanz kann bereits bei der Registrierung (alternativ auch bei der ersten Anmeldung) ein anzeigbarer Name und ein Spitzname ("nickname") eingegeben werden. Der Nickname hat eine sehr weitreichende Bedeutung und läßt sich nachträglich nicht mehr ändern. Es handelt sich dabei um eine eindeutige Digitale Identität (DID), die mit allen eigenen Aktivitäten verknüft ist, sein wird, und bleibt. Diese DID eignet sich nicht nur zur Anmeldung in dieser Hub-Instanz, sondern auch in allen verbundenen Instanzen des Federalen Netzwerkes. Im Sprachgebrauch der Federalen Netze ist diese digitale Identität ein "Kanal". Das ist vergleichbar etwa mit einer Rufnummer im Telefonnetz. Die DID hat das Format kanal@instanz.tld = nickname@instanz.tld und ist, wie gesagt, nachträglich nicht mehr änderbar. Obwohl sich das Format wie eine eMail Adresse darstellt, handelt es sich nicht um eine solche.</dd>
+ <dt>Bevor die Registrierung begonnen wird ...</dt>
+ <dd>sollte (oben rechts im Hamburger Menü <span class="fa fa-fw fa-bars"> </span>) die bevorzugte Sprache (Englisch, Spanisch, Deutsch z.B.) gewählt werden. Die aktuelle Sprache wird in den Folgeschritten und auch bei und nach der Anmeldung verwendet. Das läßt sich aber jederzeit und je nach Bedarf ändern. Auch sei darauf hingewiesen, dass diese Hub-Instanz nicht die einzige ist. Eine Übersicht über andere Hub-Instanzen ist <a href="./pubsites"> hier </a> zu finden.</dd>
+</dl>
diff --git a/doc/en/context/de/settings/account/help.html b/doc/en/context/de/settings/account/help.html
new file mode 100644
index 000000000..03fc0cc14
--- /dev/null
+++ b/doc/en/context/de/settings/account/help.html
@@ -0,0 +1,19 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>
+ Wenn du dich registriert und dir damit einen <i>Zugang</i> zum Grid verschafft hast, hast du ein <i>Profil</i> und einen <i>Kanal</i> erzeugt.
+ </dd>
+ <dt>Zugang</dt>
+ <dd>
+ Du hast <i>einen</i> Zugang, der sich aus deiner Emailadresse mit deinem Passwort zusammen setzt. Damit greifst du auf dein Profil und deinen Kanal zu.
+ <i>Du authetifizierst dich also einmal auf einem Hub von Hubzilla, und es erlaubt dir beliebig Profile und Kanäle anzulegen und dich mit anderen Leuten zu verbinden.</i>
+ </dd>
+ <dt>Profil</dt>
+ <dd>
+ Du bist sicherlich bei anderen Services im Internet registriert, wie irgendwelchen Foren oder anderen Online Communities. Überall hinterläßt du Informationen über dich wie deinen Geburtstag, dein Alter, dein Land und Ähnliches. Im Gegensatz zu anderen Services erlaubt dir Hubzilla das Anlegen <i>vieler verschiedener Profile</i>. So kannst du ein öffentliches Profil anlegen, das zur allgemeinen Verwendung gedacht ist, ein Profil für deine Arbeitskollegen, deine Familie oder deinen Lebenspartner. <i>Deine Profile sind die grundlegende Information, die du anderen Leuten je nach Beziehung zur Verfügung stellen willst</i>.
+ </dd>
+ <dt>Kanal</dt>
+ <dd>
+ Während der Registrierung hast du deinen ersten <i>Kanal</i> erzeugt. In der Tat, neben verschiedenen Profilen kannst du auch verschiedene Kanäle haben. Das könnte etwas verwirrend sein am Anfang, aber lass uns die Dinge besser verstehen. Du hast also bereits einen Kanal erstellt, den du zum Beispiel für die breite Öffentlichkeit und für den Alltag verwenden kannst. Aber vielleicht bist du ein Bücherwurm, und viele deiner Leser langweilt das. Also eröffnest Du einen <i>zweiten Kanal</i> für Bücherfreunde, in dem ihr euch ungezwungen über Bücher austauschen könnt. Offensichtlich ergibt sich daraus ein neuer Stream von Beiträgen, womöglich mit einem neuen Profil oder neuen Profilen und komplett eigenen Verbindungen oder Kontakten. Einige finden sich in beiden Kanälen, aber die meisten werden wohl nur in einem der Kanäle mitlesen. Du wechselst zwischen den Kanälen wie im richtigen Leben je nachdem, ob du dich auf der Straße mit Leuten triffst oder mit Bücherfreunden sprichst. Im Prinzip können sich deine Kanäle auch untereinander verbinden, du also mit dir selbst sprechen, wenn du das möchtest. <i>Deine Kanäle sind also wie Räume für unterschiedliche Themen, in denen du auf verschiedene Leute triffst</i>.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/de/settings/channel/help.html b/doc/en/context/de/settings/channel/help.html
new file mode 100644
index 000000000..98a388f77
--- /dev/null
+++ b/doc/en/context/de/settings/channel/help.html
@@ -0,0 +1,19 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>
+ Wenn du dich registriert und dir damit einen <i>Zugang</i> zum Grid verschafft hast, hast du ein <i>Profil</i> und einen <i>Kanal</i> erzeugt.
+ </dd>
+ <dt>Zugang</dt>
+ <dd>
+ Du hast <i>einen</i> Zugang, der sich aus deiner Emailadresse mit deinem Passwort zusammensetzt. Damit greifst du auf dein Profil und deinen Kanal zu.
+ <i>Du authetifizierst dich also einmal auf einem Hub von Hubzilla, und es erlaubt dir beliebig Profile und Kanäle anzulegen und dich mit anderen Leuten zu verbinden.</i>
+ </dd>
+ <dt>Profil</dt>
+ <dd>
+ Du bist sicherlich bei anderen Services im Internet registriert, wie irgendwelchen Foren oder anderen Online Communities. Überall hinterläßt du Informationen über dich wie deinen Geburtstag, dein Alter, dein Land und Ähnliches. Im Gegensatz zu anderen Services erlaubt dir Hubzilla das Anlegen <i>vieler verschiedener Profile</i>. So kannst du ein öffentliches Profil anlegen, das zur allgemeinen Verwendung gedacht ist, ein Profil für deine Arbeitskollegen, deine Familie oder deinen Lebenspartner. <i>Deine Profile sind die grundlegende Information, die du anderen Leuten je nach Beziehung zur Verfügung stellen willst</i>.
+ </dd>
+ <dt>Kanal</dt>
+ <dd>
+ Während der Registrierung hast du deinen ersten <i>Kanal</i> erzeugt. In der Tat, neben verschiedenen Profilen kannst du auch verschiedene Kanäle haben. Das könnte etwas verwirrend sein am Anfang, aber lass uns die Dinge besser verstehen. Du hast also bereits einen Kanal erstellt, den du zum Beispiel für die breite Öffentlichkeit und für den Alltag verwenden kannst. Aber vielleicht bist du ein Bücherwurm und viele deiner Leser langweilt das. Also eröffnest Du einen <i>zweiten Kanal</i> für Bücherfreunde, in dem ihr euch ungezwungen über Bücher austauschen könnt. Offensichtlich ergibt sich daraus ein neuer Stream von Beiträgen, womöglich mit einem neuen Profil oder neuen Profilen und komplett eigenen Verbindungen oder Kontakten. Einige finden sich in beiden Kanälen, aber die meisten werden wohl nur in einem der Kanäle mitlesen. Du wechselst zwischen den Kanälen wie im richtigen Leben je nachdem, ob du dich auf der Straße mit Leuten triffst oder mit Bücherfreunden sprichst. Im Prinzip können sich deine Kanäle auch untereinander verbinden, du also mit dir selbst sprechen, wenn du das möchtest. <i>Deine Kanäle sind also wie Räume für unterschiedliche Themen, in denen du auf verschiedene Leute triffst</i>.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/de/settings/features/help.html b/doc/en/context/de/settings/features/help.html
new file mode 100644
index 000000000..a019d2d60
--- /dev/null
+++ b/doc/en/context/de/settings/features/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Diese Seite ermöglicht dir viele zusätzliche Funktionen von Hubzilla einzustellen.</dd>
+ <dt><a href='#' onclick='$("#general-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#general-settings-title", 0)}), 1000); return false;' title="Klicken um das Element anzuzeigen...">Allgemeine Funktionen</a></dt>
+ <dd>Die Einstellungen für allgemeine Funktionen beinhalten Optionen, die relevant sind für deinen Kanal, zum Beispiel bei Webseiten oder Wikis.</dd>
+ <dt><a href='#' onclick='$("#composition-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#composition-settings-title", 0)}), 1000); return false;' title="Klicken um das Element anzuzeigen...">Funktionen für die Beitragserstellung</a></dt>
+ <dd>Diese Funktionen bieten weitere Optionen und Möglichkeiten für die Erstellung neuer Beiträge.</dd>
+ <dt><a href='#' onclick='$("#net_module-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#net_module-settings-title", 0)}), 1000); return false;' title="Klicken um das Element anzuzeigen...">Filterung von Streams</a></dt>
+ <dd>Diese Einstellungen verändern Funktionen, die mit der Filterung und der Ansichtskontrolle enkommender Beiträge verbunden sind.</dd>
+ <dt><a href='#' onclick='$("#tools-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#tools-settings-title", 0)}), 1000); return false;' title="Klicken um das Element anzuzeigen...">Werkzeuge für Beiträge und Kommentare</a></dt>
+ <dd>Hier findest du zusätzliche Werkzeuge um Beiträge zu kategorisieren, und erweiterte Methoden der Kommentierung wie Emojis und Community Tagging.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/de/settings/tokens/help.html b/doc/en/context/de/settings/tokens/help.html
new file mode 100644
index 000000000..4a7776109
--- /dev/null
+++ b/doc/en/context/de/settings/tokens/help.html
@@ -0,0 +1,20 @@
+<dl class="dl-horizontal">
+ <dt><a href="/help/member/member_guide#Guest_Access_Tokens">Gastzugangs-Token</a></dt>
+ <dd>
+ Hubzilla verwendet befristete "Wegwerf"-Logins oder "Zot Access Tokens", um das Teilen privater Informationen mit Nichtmitgliedern oder Mitgliedern im Fediverse zu ermöglichen, deren Knoten nur eingeschränkte Möglichkeiten zur Identifizierung bieten. Diese Token können zur Authentifizierung an einem Hub für den Zweck verwendet werden privilegierte oder zugangskontrollierte Ressourcen (Dateien, Fotos, Beiträge, Webseiten, Chaträume, usw.) zugänglich zu machen.
+ </dd>
+ <dt>Einen Token erzeugen</dt>
+ <dd>
+ Das Formular zur Erzeugung von Token benötigt drei Parameter: einen lesbaren Zugangsnamen, ein Passwort oder Zugangs-Token, und optional ein Verfallsdatum. Ein verfallenes Token kann nicht länger verwendet werden und wird von der Liste befristeter Zugänge entfernt. <i>Hinweis</i> Das Passwort-Feld zeigt das Token oder Passwort im Klartext.
+ </dd>
+ <dt>Einen Token teilen</dt>
+ <dd>
+ Wir geben keine Mechanismen für das Teilen der Zugangs-Token vor, jede Kommunikationsmethode ist recht. Alle Token, die du erzeugt hast, werden zu den Listen für die Zugangskontrolle hinzugefügt und können von überall verwendet werden, wo anhand dieser Listen authentifiziert werden kann.
+
+ <b>Ein Beispiel:</b> Ein Besucher trifft auf deine Seite. Er hat ein von dir zur Verfügung gestelltes Zugangs-Token für eines Deiner Fotoalben, das nur von Dir und eben diesem befristeten Zugangsnamen betrachtet werden darf. Der Besucher erhält zunächst keinen Zugang.
+
+ Nun wählt er "Login" aus der Navigation und erhält die Loginseite angezeigt, in die er seine Zugangsdaten eingibt. Ab sofort erhält er Zugang zum Fotoalbum.
+
+ Alternativ kannst du einen Link mit deinem Besucher teilen, dessen URL um den Parameter "&zat=abc123" erweitert ist, wobei "abc123" das Zugangs-Token oder das Passwort für den befristeten Login ist. Mit dieser Erweiterung ist kein Login erforderlich, der Besucher erhält sofort den Zugang.
+ </dd>
+</dl>
diff --git a/doc/en/context/de/wiki/help.html b/doc/en/context/de/wiki/help.html
new file mode 100644
index 000000000..e203ee221
--- /dev/null
+++ b/doc/en/context/de/wiki/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>Allgemein</dt>
+ <dd>Jedes Wiki ist eine Sammlung aus mit Markdown formatierten Seiten.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#wiki_list", 1); return false;' title="Click to highlight element...">Wiki Liste</a></dt>
+ <dd>Wikis die dem eigenen Kanal gehören und <i>mit der Berechtigung zum Anschauen</i>, sind in der Seitenleiste gelistet.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element...">Seiten Versionen</a></dt>
+ <dd>Jede Änderung einer Seite wird gespeichert, um eine schnelle Berichtigung zu ermöglichen. Klick auf das <b>Versionsgeschichte</b> Tab um den Verlauf der Seitenbearbeitung zu sehen, einschließlich Datum und Autor. Der Zurück-Knopf lädt die ausgewählte Änderung, aber ohne die Seite automatisch zu spreichern.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#wiki_page_list", 1); return false;' title="Click to highlight element...">Seiten</a></dt>
+ <dd>Die Seiten des Wikis werden in <b>Wiki Seiten</b> gelistet. Vor dem Speichern einer Seite über das <b>Seiten</b> Dropdown Menu, hast Du die Möglichkeit eine <a href="#" onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Click to highlight element...">Zusammenfassung der Änderungen</a> einzutragen. Dieser Text wird anschließend unter <a href="#" onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element..."><b>Seiten Versionen</b></a> in der Versionsgeschichte angezeigt.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/admin/addons/assets/addon_repo_gui_1.png b/doc/en/context/en/admin/addons/assets/addon_repo_gui_1.png
new file mode 100644
index 000000000..37139b345
--- /dev/null
+++ b/doc/en/context/en/admin/addons/assets/addon_repo_gui_1.png
Binary files differ
diff --git a/doc/en/context/en/admin/addons/help.html b/doc/en/context/en/admin/addons/help.html
new file mode 100644
index 000000000..bfb5e416a
--- /dev/null
+++ b/doc/en/context/en/admin/addons/help.html
@@ -0,0 +1,14 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page manages which addons (also known as <i>plugins</i>) are installed.</dd>
+ <dt>Manage Repos</dt>
+ <dd>If your webserver has the necessary write permissions, you will see a button labeled <b>Manage Repos</b>,
+ which opens a control panel for managing what plugin <i>repositories</i> are installed. These repos are
+ stored in <span style="font-family: monospace;">extend/addon/[repo name]/</span>. The official Hubzilla
+ addon repo can be added by entering the repo URL
+ <span style="font-family: monospace;">https://framagit.org/hubzilla/addons.git</span>
+ and choosing a name for the repo such as <b>official</b>. You should see this repo in the list similar
+ to the following:
+ <br>
+ <img class="img-responsive" src="doc/context/en/admin/addons/assets/addon_repo_gui_1.png"></dd>
+</dl>
diff --git a/doc/en/context/en/admin/logs/help.html b/doc/en/context/en/admin/logs/help.html
new file mode 100644
index 000000000..708ec9bde
--- /dev/null
+++ b/doc/en/context/en/admin/logs/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page allows you to adjust log settings and to view and existing log.</dd>
+ <dt>Log Settings</dt>
+ <dd>When you enable the Debugging option, system log information will begin appending to the file specified in the "Log File" box (path is relative to the hub root, for example /var/www). Note that this file must be writable by the web server.</dd>
+ <dt>Log Level</dt>
+ <dd>The log level option allows you to set how much information is appended to the log file. Warning: Increasing this level can quickly inflate the size of the log file to >100MB, especially on hubs with more than a few members.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/admin/queue/help.html b/doc/en/context/en/admin/queue/help.html
new file mode 100644
index 000000000..28885a154
--- /dev/null
+++ b/doc/en/context/en/admin/queue/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>The queue statistics display how many posts are in the queue for delivery to other hubs. The priority is related to how many times the delivery has been unsuccessfully attempted.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/admin/security/help.html b/doc/en/context/en/admin/security/help.html
new file mode 100644
index 000000000..bfe81b132
--- /dev/null
+++ b/doc/en/context/en/admin/security/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page contains various administrator settings related to security. To save any changes you make to these settings, you must press the Submit button.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/appman/help.html b/doc/en/context/en/appman/help.html
new file mode 100644
index 000000000..27cb03624
--- /dev/null
+++ b/doc/en/context/en/appman/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Edit individual properties of the app you selected. Categories allow you to sort your apps to help you find them in the list more easily. Support for custom apps you or your administrator may choose to create includes fields such as "Price of app" and "Location for purchase" that are not applicable to core Hubzilla apps.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/cards/help.html b/doc/en/context/en/cards/help.html
new file mode 100644
index 000000000..9dbed3f97
--- /dev/null
+++ b/doc/en/context/en/cards/help.html
@@ -0,0 +1,20 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Cards represent a persistent area for collaboration that is separate from the social stream. They are somewhat more lightweight than webpages and wikis for quick organisation of information and have the advantage of allowing collaboration and commentary. They are well suited for helping to organise complex tasks where there are frequent updates and feedback.
+ </dd>
+ <dt>Add Card</dt>
+ <dd>
+ Creating a new card is very similar to composing a new post.<br><br>
+ <ul>
+ <li>
+ <b>Page link name</b>: The page link name is the name of the card for the static URL
+ </li>
+ <li>
+ <b>Title</b>: The title is displayed at the top of the card
+ </li>
+ <li>
+ <b>Categories</b>: If you have the <a href="/settings/features">Post Categories feature</a> enabled for your channel, then you can add categories to the card. These categories populate the <b>Categories</b> list on the left panel and allow filtering your collection of cards.
+ </li>
+ </ul>
+ </dd>
+</dl>
diff --git a/doc/en/context/en/channel/help.html b/doc/en/context/en/channel/help.html
new file mode 100644
index 000000000..0c5b99754
--- /dev/null
+++ b/doc/en/context/en/channel/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This is the home page of a channel. It is similar to someone's profile "wall" in a social network context. Posts created by the channel are displayed according to the observer's viewing permissions.</dd>
+ <dt>Create a Post</dt>
+ <dd>If you have permission to create posts on the channel page, then you will see the post editor at the top.</dd>
+</dl>
diff --git a/doc/en/context/en/chat/help.html b/doc/en/context/en/chat/help.html
new file mode 100644
index 000000000..cc71686d8
--- /dev/null
+++ b/doc/en/context/en/chat/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Create and use chat rooms to communicate in real-time, using the standard Hubzilla permissions system for chat room access control.</dd>
+ <dt>Create new chat room</dt>
+ <dd>Use the "Create New" button to create a new chat room. Enter a name and how long messages should be retained.</dd>
+ <dt>Chatting</dt>
+ <dd>Enter your message in the message box and press Submit. You can set a status by selecting the chat room menu button beside the Submit button. Other people "in the room" are visible in the side panel in the "Chat Members" panel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/cloud/help.html b/doc/en/context/en/cloud/help.html
new file mode 100644
index 000000000..a8f193223
--- /dev/null
+++ b/doc/en/context/en/cloud/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page displays a channel's "cloud" files. The files visible to the observer depend on the individual file permissions set by the channel owner. If you have permission to create/upload files you will see control buttons above the file list.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/connections/help.html b/doc/en/context/en/connections/help.html
new file mode 100644
index 000000000..0f95fde63
--- /dev/null
+++ b/doc/en/context/en/connections/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page displays a list of all this channel's connections. The list can be <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Click to highlight element...">sorted and filtered using the menu button beside the search button</a>. </dd>
+ <dt>Connection Details</dt>
+ <dd>Each list entry shows the details of a specific connection. A translucent avatar image indicates an archived connection.</dd>
+ <dt>Connection Status</dt>
+ <dd>A connection can be in different states: <ul><li>Archived</li><li>Ignored</li><li>Blocked</li><li>Hidden</li></ul></dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/connections/ifpending/help.html b/doc/en/context/en/connections/ifpending/help.html
new file mode 100644
index 000000000..0f95fde63
--- /dev/null
+++ b/doc/en/context/en/connections/ifpending/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page displays a list of all this channel's connections. The list can be <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Click to highlight element...">sorted and filtered using the menu button beside the search button</a>. </dd>
+ <dt>Connection Details</dt>
+ <dd>Each list entry shows the details of a specific connection. A translucent avatar image indicates an archived connection.</dd>
+ <dt>Connection Status</dt>
+ <dd>A connection can be in different states: <ul><li>Archived</li><li>Ignored</li><li>Blocked</li><li>Hidden</li></ul></dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/connedit/help.html b/doc/en/context/en/connedit/help.html
new file mode 100644
index 000000000..9eb62ecc7
--- /dev/null
+++ b/doc/en/context/en/connedit/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page allows you to change or edit any individual settings for a particular connection or delete a connection completely. You may have arrived at this page after creating or approving a new connection. If so, you are not required to do anything. Your connection has already been established. You <strong>may</strong> wish to add them to a group or adjust special permissions, and this page is presented so that you may do this while the opportunity is fresh.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Click to highlight element...">Connection Tools</a></dt>
+ <dd>The <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Click to highlight element...">Connection Tools</a> menu access several settings. View Profile, View Recent Activity, Refresh Permissions, set or reset flags (Block, Ignore, Archive, Hide) and Delete the connection.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 0); return false;' title="Click to highlight element...">Privacy Groups</a></dt>
+ <dd>Each connection may be assigned to one or more Privacy Groups for grouping collections of friends with access to specific posts, media and other content. You may add them to an existing privacy group here, or create a new privacy group. When you add them to an existing group the action is immediate and you are not required to submit a form. </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#perms-tool", 0); return false;' title="Click to highlight element...">Individual Permissions</a></dt>
+ <dd>Granting of permissions is usually automatic and require no action on your part. However you may wish to adjust specific permsisions for this connection which are different than for others.</dd>
+ <dt>Feature Specific Settings</dt>
+ <dd>A number of individual settings are controlled through additional features which may or may not be activated on your hub or for your channel. Several optional features have settings for each connection, and those may be set on this page through additional form tabs which may be present.</dd>
+</dl>
diff --git a/doc/en/context/en/events/help.html b/doc/en/context/en/events/help.html
new file mode 100644
index 000000000..8c0b1d4ab
--- /dev/null
+++ b/doc/en/context/en/events/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page displays a calendar of events both owned by you and shared with you from other channels.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#title", 0); return false;' title="Click to highlight element...">Calendar View</a></dt>
+ <dd>The calendar can be displayed in month, week, or day mode using the options in the side panel.</dd>
+ <dt>Export/Import</dt>
+ <dd>Export or import calendar events using standard iCalendar format (.ics) files.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/mail/help.html b/doc/en/context/en/mail/help.html
new file mode 100644
index 000000000..a2361a135
--- /dev/null
+++ b/doc/en/context/en/mail/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>The messages displayed in private mail are visible only to you and the single recipient. </dd>
+ <dt>Combined View</dt>
+ <dd>Complete conversations can be viewed in a continuous thread by selecting <b>Combined View</b>. Available conversations are displayed beneath the menu in the side panel.</dd>
+ <dt>Inbox/Outbox</dt>
+ <dd>Individual sent messages are viewed by selecting <b>Outbox</b>, and incoming messages are viewed using the <b>Inbox</b> filter.</dd>
+ <dt>New Message</dt>
+ <dd>Individual messages have delivery reports that can be viewed using the drop-down menu. Messages can also be recalled from the same menu, which can prevent the recipient from viewing the message <i>if they have not already read it</i>.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/network/help.html b/doc/en/context/en/network/help.html
new file mode 100644
index 000000000..53e993b69
--- /dev/null
+++ b/doc/en/context/en/network/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>The network page displays a stream of posts and conversations, typically ordered by the most recently updated. This page is highly customizable.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#profile-jot-wrapper", 0); return false;' title="Click to highlight element...">Create a Post</a></dt>
+ <dd>At the top of the page there is a text box that says "Share". Clicking this box opens a new post editor. The post editor is customizable, but the basic editor provides fields for a post body and an optional post <b>Title</b>. Buttons below the text area to the left provide shortcuts to text formatting and inserting links, images, and other data into the post. The buttons to the right provide a post preview, the post permissions setting, and a <b>Submit</b> button to send the post.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 1); return false;' title="Click to highlight element...">Privacy Groups</a></dt>
+ <dd>The privacy groups you have created are displayed in the side panel. Selecting them filters posts to those created by channels in the chosen group.</dd>
+ <dt><a href='#' onclick='$("#dbtn-acl").click(); return false;' title="Click to highlight element...">Post Permissions</a></dt>
+ <dd>The access control list (ACL) is what you use to set who can see your new post. Pressing the ACL button beside the Submit button will display a dialog in which you can select what channels and/or privacy groups can see the post. You can also select who is explicitly denied access. For example, say you are planning a surprise party for a friend. You can send an invitation post to everyone in your <b>Friends</b> group <i>except</i> the friend you are surprising. In this case you "show" the <b>Friends</b> group but "don't show" that one person.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/photos/help.html b/doc/en/context/en/photos/help.html
new file mode 100644
index 000000000..78b442bb4
--- /dev/null
+++ b/doc/en/context/en/photos/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page displays a channel's photo albums. The images visible to the observer depend on the individual image permissions.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/profile/help.html b/doc/en/context/en/profile/help.html
new file mode 100644
index 000000000..563e0df99
--- /dev/null
+++ b/doc/en/context/en/profile/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This is the profile page of a channel. It typically displays information describing the channel. If the channel represents a person in a social network, for example, then the profile might provide contact information and other personal details about the person. Channels can have multiple profiles, where the displayed profile depends on the observer.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/profiles/help.html b/doc/en/context/en/profiles/help.html
new file mode 100644
index 000000000..41f00fe64
--- /dev/null
+++ b/doc/en/context/en/profiles/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>.
+ </dd>
+ <dt>Account</dt>
+ <dd>
+ You have <i>one</i> account. This consists of your email account and your password. With your account you access your
+ profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you
+ do things, such as creating profiles and channels with which you can connect to other people.</i>
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ You have surely registered with some other internet services, such as forums or online communities. For all of them
+ you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other
+ services Hubzilla offers you the advantage of creating
+ <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone
+ (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic
+ information about yourself you tell other people.</i>
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have
+ several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have
+ created one channel. You can use this one for the public, to communicate with people about every day life. But
+ perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just
+ for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of
+ posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections
+ might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just
+ switch between both of them just like you would in real life switch when talking to people you meet on the street
+ or people you meet specially to talk about books. You can even connect to yourself, or better: to your other
+ channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different
+ people.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/register/help.html b/doc/en/context/en/register/help.html
new file mode 100644
index 000000000..9e94ab762
--- /dev/null
+++ b/doc/en/context/en/register/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>On this page visitors can register to get access to the portal with a login ID. Logged in users not only see the public content, but can publish content themselves and perform social network communications, and much more.</dd>
+ <dt>Modes of registration</dt>
+ <dd>Registration is possible with an eMail address, or anonymously (then do not fill in the eMail field). You may also have received an invitation code, which can then be entered with the eMail address. The link above the eMail field allows you to enter the invitation code.</dd>
+ <dt>Registration procedure</dt>
+ <dd>For logins after a successful registration, a separate password must be set. To be on the safe side, enter it twice with identical values, because it will not be displayed. The password is to be kept secret and is only intended for the user's own use. Anonymously registered users receive an automatically assigned ID, and should not forget their own password because, unlike eMail registration, there is initially no reset function. Depending on the configuration of the hub instance, a confirmation function may be required. Users of the eMail registration will receive a corresponding message. For anonymous registrations, another dialog will be displayed showing the access ID and a pin. This dialog page should be stored securely and for a long time (e.g. by printout, screenshot, photo), because the data must be confirmed again at a later point in time.</dd>
+ <dt>The Digital Identity</dt>
+ <dd>Depending on the configuration of the hub instance, a displayable name and a nickname can already be entered during registration (alternatively also during the first login). The nickname has a very extensive meaning and cannot be changed later. It is a unique Digital Identity (DID) that is, will be, and remains linked to all of one's activities. This DID is not only suitable for logging into this hub instance, but also into all connected instances of the federal network. In federal network parlance, this digital identity is a "channel". This is comparable to a telephone number in the telephone network. The DID has the format channel@instance.tld = nickname@instance.tld and, as mentioned, cannot be changed afterwards. Although the format looks like an eMail address, it is not.</dd>
+ <dt>Before starting the registration ...</dt>
+ <dd>... the preferred language (English, Spanish, German, for example) should be selected (top right in the hamburger menu <span class="fa fa-fw fa-bars"> </span>). The current language is used in the subsequent steps and also during and after login. However, this can be changed at any time and as needed. It should also be noted that this Hub instance is not the only one. An overview of other Hub instances can be found <a href="./pubsites"> here </a>.</dd>
+</dl>
diff --git a/doc/en/context/en/settings/account/help.html b/doc/en/context/en/settings/account/help.html
new file mode 100644
index 000000000..41f00fe64
--- /dev/null
+++ b/doc/en/context/en/settings/account/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>.
+ </dd>
+ <dt>Account</dt>
+ <dd>
+ You have <i>one</i> account. This consists of your email account and your password. With your account you access your
+ profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you
+ do things, such as creating profiles and channels with which you can connect to other people.</i>
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ You have surely registered with some other internet services, such as forums or online communities. For all of them
+ you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other
+ services Hubzilla offers you the advantage of creating
+ <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone
+ (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic
+ information about yourself you tell other people.</i>
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have
+ several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have
+ created one channel. You can use this one for the public, to communicate with people about every day life. But
+ perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just
+ for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of
+ posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections
+ might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just
+ switch between both of them just like you would in real life switch when talking to people you meet on the street
+ or people you meet specially to talk about books. You can even connect to yourself, or better: to your other
+ channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different
+ people.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/settings/channel/help.html b/doc/en/context/en/settings/channel/help.html
new file mode 100644
index 000000000..41f00fe64
--- /dev/null
+++ b/doc/en/context/en/settings/channel/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>.
+ </dd>
+ <dt>Account</dt>
+ <dd>
+ You have <i>one</i> account. This consists of your email account and your password. With your account you access your
+ profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you
+ do things, such as creating profiles and channels with which you can connect to other people.</i>
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ You have surely registered with some other internet services, such as forums or online communities. For all of them
+ you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other
+ services Hubzilla offers you the advantage of creating
+ <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone
+ (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic
+ information about yourself you tell other people.</i>
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have
+ several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have
+ created one channel. You can use this one for the public, to communicate with people about every day life. But
+ perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just
+ for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of
+ posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections
+ might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just
+ switch between both of them just like you would in real life switch when talking to people you meet on the street
+ or people you meet specially to talk about books. You can even connect to yourself, or better: to your other
+ channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different
+ people.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/settings/features/help.html b/doc/en/context/en/settings/features/help.html
new file mode 100644
index 000000000..86e4f5dae
--- /dev/null
+++ b/doc/en/context/en/settings/features/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>This page allows you to configure settings for the many additional features of Hubzilla.</dd>
+ <dt><a href='#' onclick='$("#general-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#general-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">General Features</a></dt>
+ <dd>General feature settings include options relevant to your channel, such as webpage and wiki hosting.</dd>
+ <dt><a href='#' onclick='$("#composition-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#composition-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">Post Composition Features</a></dt>
+ <dd>The post composition features provide extra options and capabilities when composing new posts.</dd>
+ <dt><a href='#' onclick='$("#net_module-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#net_module-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">Network and Stream Filtering</a></dt>
+ <dd>These settings modify features associated with filtering and controlling your view of incoming posts.</dd>
+ <dt><a href='#' onclick='$("#tools-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#tools-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">Post/Comment Tools</a></dt>
+ <dd>These provide additional tools for categorizing posts and allowing additional commenting methods such as emoji or community tagging.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/settings/tokens/help.html b/doc/en/context/en/settings/tokens/help.html
new file mode 100644
index 000000000..6d7e6b98d
--- /dev/null
+++ b/doc/en/context/en/settings/tokens/help.html
@@ -0,0 +1,23 @@
+<dl class="dl-horizontal">
+ <dt><a href="/help/member/member_guide#Guest_Access_Tokens">Guest Access Tokens</a></dt>
+ <dd>
+ In order to facilitate sharing of private resources with non-members or members of federation nodes with limited identification discovery, Hubzilla should provide members with a mechanism to create and manage temporary ("throwaway") logins, aka "Zot Access Tokens". These tokens/credentials may be used to authenticate to a hubzilla site for the sole purpose of accessing privileged or access controlled resources (files, photos, posts, webpages, chatrooms, etc.).
+ </dd>
+ <dt>Create a token</dt>
+ <dd>
+ The form to create/edit accepts three parameters, a human readable name, a password or access token, and an
+ optional expiration. Once expired, the access token is no longer valid, may no longer be used, and will be
+ automatically purged from the list of temporary accounts. The password field in the create/edit forms
+ displays the text of the access token and not an obscured password.
+ </dd>
+ <dt>Share a token</dt>
+ <dd>
+ We do not specify mechanisms for sharing these tokens with others. Any communication method may be used. Any tokens you have created are added to the Access Control List selector and may be used anywhere that Access Control Lists are provided.
+
+ <b>Example</b>: A visitor arrives at your site. She has an access token you have provided, and attempts to visit one of your photo albums (which is restricted to be viewed only by yourself and one temporary identity). Permission is denied.
+
+ The visitor now selects "Login" from the menu navigation bar. This presents a login page. She enters the name and password you have provided her, and she can now view the restricted photo album.
+
+ Alternatively, you may share a link to a protected file by adding a parameter "&zat=abc123" to the URL, where the string "abc123" is the access token or password for the temporary login. No further negotiation is required, and the file is presented.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/webpages/help.html b/doc/en/context/en/webpages/help.html
new file mode 100644
index 000000000..a4817e4bf
--- /dev/null
+++ b/doc/en/context/en/webpages/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>You can create modular, identity-aware websites composed of shareable elements. </dd>
+ <dt>Pages</dt>
+ <dd>This page lists your "pages", which are assigned URLs where people can visit your site. The structure of pages are typically described by an associated <b>layout</b>, and their content is constructed from a collection of <b>blocks</b>.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1); return false;' title="Click to highlight element...">Website portation tools</a></dt>
+ <dd>The website portation tools allows you import/export multiple webpage elements (pages, layouts, blocks). You can <b>import</b> either from an uploaded zip file or from an existing cloud files folder. You can <b>export</b> to either a zip file containing a select group of webpage elements in a form compatible with the import tool, or you can export directly to a cloud files folder. <a target="_blank" href="help/webpages">Read more...</a></dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/en/wiki/help.html b/doc/en/context/en/wiki/help.html
new file mode 100644
index 000000000..5dee85375
--- /dev/null
+++ b/doc/en/context/en/wiki/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Each wiki is a collection of pages, composed as Markdown-formatted text files.</dd>
+ <dt>Wiki List</dt>
+ <dd>Wikis owned by the channel <i>that you have permission to view</i> are listed in the side panel.</dd>
+ <dt>Page History</dt>
+ <dd>Every revision of a page is saved to allow quick reversion. Click the <b>History</b> tab to view a history of page revisions, including the date and author of each. The revert button will load the selected revision but will not automatically save the page.</dd>
+ <dt>Pages</dt>
+ <dd>The list of pages in the wiki are listed in the <b>Wiki Pages</b> panel. Prior to saving page edits using the <b>Page</b> control dropdown menu, you may <a href='#' onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Click to highlight element...">enter a custom message</a> to be displayed in the <a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element..."><b>Page History</b></a> viewer along with the revision.</dd>
+</dl>
diff --git a/doc/en/context/es b/doc/en/context/es
new file mode 120000
index 000000000..c8ba7666b
--- /dev/null
+++ b/doc/en/context/es
@@ -0,0 +1 @@
+es-es \ No newline at end of file
diff --git a/doc/en/context/es-es/admin/addons/assets/addon_repo_gui_1.png b/doc/en/context/es-es/admin/addons/assets/addon_repo_gui_1.png
new file mode 100644
index 000000000..37139b345
--- /dev/null
+++ b/doc/en/context/es-es/admin/addons/assets/addon_repo_gui_1.png
Binary files differ
diff --git a/doc/en/context/es-es/admin/addons/help.html b/doc/en/context/es-es/admin/addons/help.html
new file mode 100644
index 000000000..49a047f5e
--- /dev/null
+++ b/doc/en/context/es-es/admin/addons/help.html
@@ -0,0 +1,14 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página gestiona qué addons (también llamados <i>plugins</i> o <i>complementos</i>) están instalados.</dd>
+ <dt>Gestión de los repositorios</dt>
+ <dd>Si su servidor web tiene los permisos de escritura necesarios, verá un botón etiquetado como <b>Gestión de repositorios</b>,
+ que abre un panel de control para administrar qué <i>repositorios</i> de addons están instalados. Estos repositorios están
+ almacenados en <span style="font-family: monospace;">extend/addon/[nombre del repositorio]/</span>. El repositorio de addons oficial de Hubzilla
+ se puede añadir escribiendo la URL del repositorio
+ <span style="font-family: monospace;">https://framagit.org/hubzilla/addons.git</span>
+ y eligiendo un nombre para el repositorio como <b>oficial</b>. Debería ver este repositorio en una lista parecida
+ a esta:
+ <br>
+ <img class="img-responsive" src="doc/context/es-es/admin/addons/assets/addon_repo_gui_1.png"></dd>
+</dl>
diff --git a/doc/en/context/es-es/admin/logs/help.html b/doc/en/context/es-es/admin/logs/help.html
new file mode 100644
index 000000000..3a2ec413d
--- /dev/null
+++ b/doc/en/context/es-es/admin/logs/help.html
@@ -0,0 +1,9 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página le permite ajustar los parámetros de los informes del sistema (logs) y para ver uno existente.</dd>
+ <dt>Ajustes de los informes (logs)</dt>
+ <dd>Cuando se habilita la opción de depuración, el sistema de información comenzará a añadir los informes (logs) en el archivo especificado en el cuadro "Fichero de informes"
+ (la ruta es relativa al directorio raíz del servidor, por ejemplo, /var /www). Tenga en cuenta que este archivo tiene que ser modificable por el servidor web.</dd>
+ <dt>Nivel de depuración</dt>
+ <dd>La opción de nivel de depuración le permite establecer la cantidad de información que se anexa al fichero de informes (logs). Advertencia: El aumento de este nivel puede aumentar rápidamente el tamaño de este fichero hasta en más de 100 MB, especialmente en los hubs con más que unos pocos miembros.</dd>
+ </dl>
diff --git a/doc/en/context/es-es/admin/queue/help.html b/doc/en/context/es-es/admin/queue/help.html
new file mode 100644
index 000000000..de9e6cdbb
--- /dev/null
+++ b/doc/en/context/es-es/admin/queue/help.html
@@ -0,0 +1,4 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Las estadísticas de la cola muestran cuántos mensajes están en la cola para su entrega a otros hubs. La prioridad está relacionada con la cantidad de veces que la entrega se ha intentado, sin éxito.</dd>
+ </dl>
diff --git a/doc/en/context/es-es/admin/security/help.html b/doc/en/context/es-es/admin/security/help.html
new file mode 100644
index 000000000..229a91561
--- /dev/null
+++ b/doc/en/context/es-es/admin/security/help.html
@@ -0,0 +1,4 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página contiene varios ajustes para el administrador relacionados con la seguridad. Para guardar los cambios que realice en estos ajustes, debe pulsar el botón "Enviar".</dd>
+ </dl>
diff --git a/doc/en/context/es-es/appman/help.html b/doc/en/context/es-es/appman/help.html
new file mode 100644
index 000000000..1b799a52b
--- /dev/null
+++ b/doc/en/context/es-es/appman/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Editar las propiedades individuales de la aplicación seleccionada. Las categorías le permiten ordenar sus aplicaciones para ayudarle a encontrarlas más fácilmente en la lista. El soporte para aplicaciones personalizadas que usted o su administrador puedan elegir para crear incluye campos como "Precio de la aplicación" y "Ubicación para la compra" que no son aplicables a las aplicaciones principales de Hubzilla.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/articles/help.html b/doc/en/context/es-es/articles/help.html
new file mode 100644
index 000000000..0bf176fdd
--- /dev/null
+++ b/doc/en/context/es-es/articles/help.html
@@ -0,0 +1,20 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>El artículo es un tipo de documento de una naturaleza un poco especial, a mitad de camino entre las fichas de organización de trabajo ("cards") y las entradas normales, pero que está separado del stream social. Son muy adecuados para ayudar a escribir y organizar textos, con un formateo básico, pero completo, sobre cualquier tema, especialmente sobre documentación seriada, de forma más amplia que un wiki pero menos que un página web. Al no formar parte del stream social, para acceder a él hace falta conocer su dirección: <b>[URL del sitio]/articles/[nombre del usuario, sin dominio]</b>. Ahí estarán disponibles los distintas artículos que escriba, por orden de publicación.</dd>
+ <dt>Crear un artículo</dt>
+ <dd>
+ Crear un artículo nuevo es muy parecido a componer un nuevo post.<br><br>
+ <ul>
+ <li>
+ <b>Nombre del enlace de la página</b>: Este nombre es el del nombre del artículo para una URL estática
+ </li>
+ <li>
+ <b>Título</b>: El título se muestra en la parte de arriba del artículo
+ </li>
+ <li>
+ <b>Temas o Categorías</b>: Si tiene activada la opción <a href="/settings/features">Temas de las entradas</a> en su canal, entonces puede añadirlos al artículo. Estas categorías o temas se despliegan en la lista <b>Temas</b> en el panel de la izquierda y permiten filtrar su colección de artículos.
+ </li>
+ <li> <b>Sumario</b>: Es el espacio, entre las etiquetas predefinidas [summary][/summary], reservado para redactar un resumen del artículo, que aparecerá en su encabezado. El espacio disponible a continuación del sumario, en la ventana de composición, es el adecuado para la redacción del artículo en sí.
+ </ul>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/cards/help.html b/doc/en/context/es-es/cards/help.html
new file mode 100644
index 000000000..34889cd25
--- /dev/null
+++ b/doc/en/context/es-es/cards/help.html
@@ -0,0 +1,19 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Las fichas representan un área persistente para la colaboración que está separada del stream social. Son algo más ligeras que las páginas web y los wikis para una rápida organización de la información y tienen la ventaja de permitir la colaboración y los comentarios. Son muy adecuados para ayudar a organizar tareas complejas en las que hay actualizaciones y retroalimentación frecuentes.</dd>
+ <dt>Añadir una ficha</dt>
+ <dd>
+ Crear una ficha nueva es muy parecido a componer un nuevo post.<br><br>
+ <ul>
+ <li>
+ <b>Nombre del enlace de la página</b>: Este nombre es el de la ficha para una URL estática
+ </li>
+ <li>
+ <b>Título</b>: El título se muestra en la parte de arriba de la ficha
+ </li>
+ <li>
+ <b>Categorías</b>: Si tiene activada la opción <a href="/settings/features">Temas de las entradas</a> en su canal, entonces puede añadirlas a la ficha. Estas categorías o temas se despliegan en la lista <b>Temas</b> en el panel de la izquierda y permiten filtrar su colección de fichas.
+ </li>
+ </ul>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/channel/help.html b/doc/en/context/es-es/channel/help.html
new file mode 100644
index 000000000..682125e27
--- /dev/null
+++ b/doc/en/context/es-es/channel/help.html
@@ -0,0 +1,8 @@
+<dt>General</dt>
+<dd>Esta es la página principal de un canal. Es similar al "muro" del perfil de una persona en un contexto de red social. Las entradas creadas por el canal se muestran de acuerdo con los permisos de visualización
+del observador.</dd>
+<dt>Crear una entrada</dt>
+<dd>Si tiene permiso para crear entradas en la página del canal, a continuación, podrá ver el editor de entradas en la parte superior.</dd>
+<dt><a href="#" onclick="contextualHelpFocus(&quot;#tabs-collapse-1&quot;, 0); return false;">Pestañas de los contenidos del canal</a></dt>
+<dd>Las pestañas de los contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña "<b>Mi perfil</b>" enlaza con el perfil del canal. La pestaña "<b>Fotos</b>" enlaza con las galerías
+de fotos. La pestaña "<b>Ficheros</b>" enlaza con los ficheros de cualquier tipo compartidos por el canal.</dd> \ No newline at end of file
diff --git a/doc/en/context/es-es/chat/help.html b/doc/en/context/es-es/chat/help.html
new file mode 100644
index 000000000..94df6a1d2
--- /dev/null
+++ b/doc/en/context/es-es/chat/help.html
@@ -0,0 +1,8 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Creación y uso de salas de chat para comunicarse en tiempo real, utilizando el sistema de permisos estándar de Hubzilla para el control de acceso a la sala de chat.</dd>
+ <dt>Crear una nueva sala de chat</dt>
+ <dd>Utilice el botón "Crear" para crear una nueva sala de chat. Introduzca un nombre y cuánto tiempo se deben conservar los mensajes.</dd>
+ <dt>Chatear</dt>
+ <dd>Introduzca su mensaje en el cuadro de mensaje y pulse "Enviar". Se puede establecer un estado seleccionando el botón de menú sala de chat junto al botón "Enviar". Si hay otras personas en la sala, serán visibles en el panel lateral, en "Miembros del chat".</dd>
+ </dl>
diff --git a/doc/en/context/es-es/cloud/help.html b/doc/en/context/es-es/cloud/help.html
new file mode 100644
index 000000000..af891da17
--- /dev/null
+++ b/doc/en/context/es-es/cloud/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página muestra los archivos "cloud" de un canal. Los archivos visibles para el observador dependen de los permisos de fichero individuales establecidos por el propietario del canal. Si tiene permiso para crear o cargar archivos verá botones de control encima de la lista de ficheros. </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Pulsar en el elemento resaltado...">Pestañas de contenidos del canal</a></dt>
+ <dd>Las pestañas de contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña <b>Mi canal</b> enlaza con el perfil del canal. La pestaña <b>Fotos</b> enlaza con las galerías de fotos del canal. La pestaña <b>Ficheros</b> enlaza con los ficheros compartidos publicados por el canal.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/connections/help.html b/doc/en/context/es-es/connections/help.html
new file mode 100644
index 000000000..a0aa9cf32
--- /dev/null
+++ b/doc/en/context/es-es/connections/help.html
@@ -0,0 +1,15 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página muestra una lista de todas las conexiones de este canal. La lista se puede <a href="#" onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar sobre el elemento resaltado...">ordenar y filtrar usando el botón de menú al lado del botón de búsqueda</a>.</dd>
+ <dt>Detalles de la conexión</dt>
+ <dd>Cada entrada de la lista muestra los detalles de una conexión específica. Una imagen de avatar translúcida indica una conexión archivada.</dd>
+ <dt>Estado de la conexión</dt>
+ <dd>Una conexión puede estar en diferentes estados:
+ <ul>
+ <li>Archivada</li>
+ <li>Ignorada</li>
+ <li>Bloqueada</li>
+ <li>Oculta</li>
+ </ul>
+ </dd>
+ </dl>
diff --git a/doc/en/context/es-es/connections/ifpending/help.html b/doc/en/context/es-es/connections/ifpending/help.html
new file mode 100644
index 000000000..84e547851
--- /dev/null
+++ b/doc/en/context/es-es/connections/ifpending/help.html
@@ -0,0 +1,15 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página muestra una lista de todas las conexiones de este canal. La lista se puede&nbsp;<a href="#" onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar sobre el elemento resaltado...">ordenar y filtrar usando el botón de menú al lado del botón de búsqueda</a>. </dd>
+ <dt>Detalles de la conexión</dt>
+ <dd>Cada entrada de la lista muestra los detalles de una conexión específica. Una imagen de avatar translúcida indica una conexión archivada.</dd>
+ <dt>Estado de la conexión</dt>
+ <dd>Una conexión puede estar en diferentes estados:
+ <ul>
+ <li>Archivada</li>
+ <li>Ignorada</li>
+ <li>Bloqueada</li>
+ <li>Oculta</li>
+ </ul>
+ </dd>
+ </dl>
diff --git a/doc/en/context/es-es/connedit/help.html b/doc/en/context/es-es/connedit/help.html
new file mode 100644
index 000000000..e8c92ca28
--- /dev/null
+++ b/doc/en/context/es-es/connedit/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página le permite cambiar o modificar cualquier ajuste individual para una conexión en concreto o eliminar una conexión completamente. Ha podido llegar a esta página tras crear o aprobar una conexión nueva. Si es así, no tiene por qué hacer nada. Su conexión ya se ha establecido. <strong>Es posible</strong> que desee añadirla a un grupo o ajustar para ella permisos especiales; si es así, esta página se presenta de modo que usted pueda hacerlo mientras todo el proceso es aún reciente.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar para resaltar el elemento...">Conexiones</a></dt>
+ <dd>El menú <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar para resaltar el elemento...">Conexiones</a> le da acceso a varios ajustes: "Ver el perfil", "Ver la actividad reciente", "Recargar los permisos", añadir o quitar estados ("flags") ("Bloquear", "Ignorar", "Archivar", "Ocultar") y eliminar la conexión.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 0); return false;' title="Pulsar para resaltar el elemento...">Grupos de canales</a></dt>
+ <dd>Todas las conexiones se pueden incluir en uno o varios grupos de canales para formar conjuntos de amigos con acceso a publicaciones concretas, ficheros multimedia y otros tipos de contenido. Puede añadirla aquí a un grupo de canales ya existente o crear un grupo nuevo. Cuando añade la conexión a un grupo que ya existe, el efecto es inmediato y no será requerido para confirmarlo.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#perms-tool", 0); return false;' title="Pulsar para resaltar el elemento...">Permisos individuales</a></dt>
+ <dd>La concesión de permisos es, generalmente, automática y no requiere ninguna acción por su parte. Sin embargo, puede, si lo desea, ajustar permisos especiales, diferentes de los permisos concedidos a otros, para una conexión concreta.</dd>
+ <dt>Ajustes de funcionalidades concretas</dt>
+ <dd>Una serie de ajustes individuales se controlan mediante funcionalidades adicionales que pueden, o no, estar activadas en un hub o para su canal en concreto. Varias funcionalidades adicionales tienen ajustes para cada conexión, Estas funcionalidades se pueden configurar en esta página, de forma adicional, mediante pestañas que pueden estar presentes.</dd>
+</dl>
diff --git a/doc/en/context/es-es/events/help.html b/doc/en/context/es-es/events/help.html
new file mode 100644
index 000000000..b0ac1f9ea
--- /dev/null
+++ b/doc/en/context/es-es/events/help.html
@@ -0,0 +1,8 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página muestra un calendario de eventos tanto de su propiedad como compartido con usted desde otros canales.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#title", 0); return false;' title="Pulsar en el elemento resaltado...">Vistas del calendario</a></dt>
+ <dd>El calendario se puede mostrar en modo mensual, semanal o diario usando las opciones del panel lateral.</dd>
+ <dt>Exportar/Importar</dt>
+ <dd>Exportar o importar eventos del calendario usando el formato estándar de los ficheros de iCalendar (.ics).</dd>
+ </dl>
diff --git a/doc/en/context/es-es/mail/help.html b/doc/en/context/es-es/mail/help.html
new file mode 100644
index 000000000..794af38a9
--- /dev/null
+++ b/doc/en/context/es-es/mail/help.html
@@ -0,0 +1,10 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Los mensajes que aparecen en el correo privado son visibles sólo para usted y un único destinatario.</dd>
+ <dt>Vista combinada</dt>
+ <dd>Las conversaciones completas se pueden ver en un hilo continuo seleccionando "<b>Vista combinada</b>". Las conversaciones disponibles se muestran debajo del menú en el panel lateral.</dd>
+ <dt>Bandeja de entrada/Bandeja de salida</dt>
+ <dd>Los mensajes individuales enviados son visibles seleccionando la <b>Bandeja de salida</b> y los mensajes recibidos se pueden ver usando el filtro de la <b>Bandeja de entrada.</b></dd>
+ <dt>Mensaje nuevo</dt>
+ <dd>Los mensajes individuales tienen informes de entrega que se pueden ver usando el menú desplegable. Los mensajes también se pueden revocar desde el mismo menú, lo que puede evitar que el destinatario vea el mensaje, <i>si aún no lo ha leído</i>.</dd>
+ </dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/network/help.html b/doc/en/context/es-es/network/help.html
new file mode 100644
index 000000000..082f52a49
--- /dev/null
+++ b/doc/en/context/es-es/network/help.html
@@ -0,0 +1,12 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>La página de "Mi red" muestra un flujo de entradas y conversaciones, normalmente ordenadas según la actualización más reciente. Esta página es altamente personalizable.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#profile-jot-wrapper", 0); return false;' title="Pulsar sobre el elemento resaltado...">Crear una entrada</a></dt>
+ <dd>En la parte superior de la página hay un cuadro de texto que dice "<b>Compartir</b>". Al hacer clic en esta casilla se abre un nuevo editor de entradas. El editor de entradas es personalizable, pero el editor básico proporciona campos para el cuerpo de la publicación y un título opcional. Los botones que hay debajo de la zona de texto, a la izquierda, proporcionan
+ accesos directos para el <b>Formato</b> de texto y para&nbsp; insertar enlaces, imágenes y otros datos en la entrada. Los botones a la derecha proporcionan una vista previa del mensaje, los ajustes de permisos de la entrada, y un botón <b>Enviar</b> para publicarla.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#group-sidebar", 1); return false;' title="Pulsar sobre el elemento resaltado...">Grupos de canales</a></dt>
+ <dd>Los grupos de canales que ha creado se muestran en el panel lateral. Seleccionándolos, se filtran las entradas creadas por los canales incluidos en el grupo elegido.</dd>
+ <dt><a href="#" onclick='$("#dbtn-acl").click(); return false;' title="Pulsar sobre el elemento resaltado...">Permisos de una entrada</a></dt>
+ <dd>La lista de control de acceso (ACL) es lo que se utiliza para establecer quién puede ver su nueva entrada. Al pulsar el botón ACL, al lado del botón Enviar, se mostrará un cuadro de diálogo en el que puede seleccionar qué canales y / o grupos de canales pueden ver el mensaje. También puede seleccionar a quién se le niega el acceso explícitamente. Por ejemplo,di gamos que usted está planeando una
+ fiesta sorpresa para un amigo. Puede enviar un mensaje de invitación a todos los miembros de su grupo de <b>Amigos</b>, excepto el amigo al que quiere sorprender. En este caso, "se mostrará" al grupo de amigos, pero "no se mostrará" a esa única persona.</dd>
+ </dl>
diff --git a/doc/en/context/es-es/photos/help.html b/doc/en/context/es-es/photos/help.html
new file mode 100644
index 000000000..6623456eb
--- /dev/null
+++ b/doc/en/context/es-es/photos/help.html
@@ -0,0 +1,6 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página muestra los álbumes de fotos de un canal. Las imágenes visibles para el observador dependen de los permisos individuales de cada imagen.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Pulsar sobre el elemento resaltado...">Pestañas de los contenidos del canal</a></dt>
+<dd>Las pestañas de los contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña "<b>Mi perfil</b>" enlaza con el perfil del canal. La pestaña "<b>Fotos</b>" enlaza con las galerías de fotos. La pestaña "<b>Ficheros</b>" enlaza con los ficheros de cualquier tipo compartidos por el canal.</dd>
+ </dl>
diff --git a/doc/en/context/es-es/profile/help.html b/doc/en/context/es-es/profile/help.html
new file mode 100644
index 000000000..28ff22499
--- /dev/null
+++ b/doc/en/context/es-es/profile/help.html
@@ -0,0 +1,6 @@
+ <dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta es la página de perfil de un canal. Por lo general muestra la información que describe el canal. Si el canal representa a una persona en una red social, por ejemplo, el perfil podría proporcionar información de contacto y otros datos personales. Los canales pueden tener varios perfiles, en cuyo caso el perfil que se muestra depende del observador.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Pulsar sobre el elemento resaltado...">Pestañas de los contenidos del canal</a></dt>
+ <dd>Las pestañas de los contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña "Mi perfil" enlaza con el perfil del canal. La pestaña "Fotos" nlaza con las galerías de fotos. La pestaña "Ficheros" enlaza con los ficheros de cualquier tipo compartidos por el canal.</dd>
+ </dl>
diff --git a/doc/en/context/es-es/profiles/help.html b/doc/en/context/es-es/profiles/help.html
new file mode 100644
index 000000000..9303e049c
--- /dev/null
+++ b/doc/en/context/es-es/profiles/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Al registar <i>cuenta</i> en Hubzilla, también ha creado un <i>perfil</i> y un <i>canal</i>.
+ </dd>
+ <dt>Cuenta</dt>
+ <dd>
+ Tiene <i>una</i> cuenta. Esta consta de su correo electrónico y su contraseña. Mediante su cuenta, accede a su
+ perfil y su canal. <i>Piense en su cuenta como la vía para identificarse en un sitio Hubzilla. Le permite
+ hacer cosas, como crear perfiles y canales a través de los cuelas podrá conectar con otra gente.</i>
+ </dd>
+ <dt>Perfil</dt>
+ <dd>
+ Usted está registrado, seguramente, con algunos otros servicios de Internet, como foros o comunidades en línea. Para todos ellos
+ usted proporcionó algún tipo de información sobre usted mismo, tal como su fecha de nacimiento, país, edad y gustos o preferencias. Frente a otros
+ servicios, Hubzilla le ofrece la ventaja de crear
+ <i>muchos más perfiles</i>. De esa manera usted puede distinguir entre los perfiles dirigidos especialmente a todo el mundo
+ (su perfil público), Sus compañeros de trabajo, su familia y su pareja.<i>Piense en su perfil como la información básica
+ básica que acerca de usted mismo muestra a otra gente,</i>
+ </dd>
+ <dt>Canal</dt>
+ <dd>
+ Durante el registro, creó su primer <i>canal</i>. Sí, además de los varios perfiles, usted puede tener
+ varios canales. Esto podría ser un poco confuso al principio, pero vamos a aclarar las cosas. Usted ya ha creado
+ un canal. Puede usarlo para el público en general, para informar a los demás sobre su vida cotidiana. Pero
+ Tal vez usted es un ávido lector de libros y muchas personas se aburren con eso. Así que abre un <i>segundo canal</i> sólo
+ para los amantes de los libros, en el que todos ustedes pueden hablar de libros tanto como quieran. Obviamente, este es un nuevo flujo de
+ entradas, con un nuevo perfil (...o nuevos perfil<i>es</i>...) y contactos completamente diferentes. Algunas conexiones
+ pueden existir en ambos canales, pero habrá algunas que estén exclusivamente en uno de los dos. Usted mismo simplemente
+ cambie entre ambos como cambia de interlocutor en el mundo real cuando habla con varias personas en la calle
+ o personas con las que se reúne especialmente para hablar de libros. Incluso puede conectarse a sí mismo, o mejor: a su otro
+ canal. :)<i> Piense en un canal como en diferentes espacios dedicados a diferentes temas en los que puede hablar con diferentes
+ personas.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/settings/account/help.html b/doc/en/context/es-es/settings/account/help.html
new file mode 100644
index 000000000..9303e049c
--- /dev/null
+++ b/doc/en/context/es-es/settings/account/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Al registar <i>cuenta</i> en Hubzilla, también ha creado un <i>perfil</i> y un <i>canal</i>.
+ </dd>
+ <dt>Cuenta</dt>
+ <dd>
+ Tiene <i>una</i> cuenta. Esta consta de su correo electrónico y su contraseña. Mediante su cuenta, accede a su
+ perfil y su canal. <i>Piense en su cuenta como la vía para identificarse en un sitio Hubzilla. Le permite
+ hacer cosas, como crear perfiles y canales a través de los cuelas podrá conectar con otra gente.</i>
+ </dd>
+ <dt>Perfil</dt>
+ <dd>
+ Usted está registrado, seguramente, con algunos otros servicios de Internet, como foros o comunidades en línea. Para todos ellos
+ usted proporcionó algún tipo de información sobre usted mismo, tal como su fecha de nacimiento, país, edad y gustos o preferencias. Frente a otros
+ servicios, Hubzilla le ofrece la ventaja de crear
+ <i>muchos más perfiles</i>. De esa manera usted puede distinguir entre los perfiles dirigidos especialmente a todo el mundo
+ (su perfil público), Sus compañeros de trabajo, su familia y su pareja.<i>Piense en su perfil como la información básica
+ básica que acerca de usted mismo muestra a otra gente,</i>
+ </dd>
+ <dt>Canal</dt>
+ <dd>
+ Durante el registro, creó su primer <i>canal</i>. Sí, además de los varios perfiles, usted puede tener
+ varios canales. Esto podría ser un poco confuso al principio, pero vamos a aclarar las cosas. Usted ya ha creado
+ un canal. Puede usarlo para el público en general, para informar a los demás sobre su vida cotidiana. Pero
+ Tal vez usted es un ávido lector de libros y muchas personas se aburren con eso. Así que abre un <i>segundo canal</i> sólo
+ para los amantes de los libros, en el que todos ustedes pueden hablar de libros tanto como quieran. Obviamente, este es un nuevo flujo de
+ entradas, con un nuevo perfil (...o nuevos perfil<i>es</i>...) y contactos completamente diferentes. Algunas conexiones
+ pueden existir en ambos canales, pero habrá algunas que estén exclusivamente en uno de los dos. Usted mismo simplemente
+ cambie entre ambos como cambia de interlocutor en el mundo real cuando habla con varias personas en la calle
+ o personas con las que se reúne especialmente para hablar de libros. Incluso puede conectarse a sí mismo, o mejor: a su otro
+ canal. :)<i> Piense en un canal como en diferentes espacios dedicados a diferentes temas en los que puede hablar con diferentes
+ personas.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/settings/channel/help.html b/doc/en/context/es-es/settings/channel/help.html
new file mode 100644
index 000000000..9303e049c
--- /dev/null
+++ b/doc/en/context/es-es/settings/channel/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Al registar <i>cuenta</i> en Hubzilla, también ha creado un <i>perfil</i> y un <i>canal</i>.
+ </dd>
+ <dt>Cuenta</dt>
+ <dd>
+ Tiene <i>una</i> cuenta. Esta consta de su correo electrónico y su contraseña. Mediante su cuenta, accede a su
+ perfil y su canal. <i>Piense en su cuenta como la vía para identificarse en un sitio Hubzilla. Le permite
+ hacer cosas, como crear perfiles y canales a través de los cuelas podrá conectar con otra gente.</i>
+ </dd>
+ <dt>Perfil</dt>
+ <dd>
+ Usted está registrado, seguramente, con algunos otros servicios de Internet, como foros o comunidades en línea. Para todos ellos
+ usted proporcionó algún tipo de información sobre usted mismo, tal como su fecha de nacimiento, país, edad y gustos o preferencias. Frente a otros
+ servicios, Hubzilla le ofrece la ventaja de crear
+ <i>muchos más perfiles</i>. De esa manera usted puede distinguir entre los perfiles dirigidos especialmente a todo el mundo
+ (su perfil público), Sus compañeros de trabajo, su familia y su pareja.<i>Piense en su perfil como la información básica
+ básica que acerca de usted mismo muestra a otra gente,</i>
+ </dd>
+ <dt>Canal</dt>
+ <dd>
+ Durante el registro, creó su primer <i>canal</i>. Sí, además de los varios perfiles, usted puede tener
+ varios canales. Esto podría ser un poco confuso al principio, pero vamos a aclarar las cosas. Usted ya ha creado
+ un canal. Puede usarlo para el público en general, para informar a los demás sobre su vida cotidiana. Pero
+ Tal vez usted es un ávido lector de libros y muchas personas se aburren con eso. Así que abre un <i>segundo canal</i> sólo
+ para los amantes de los libros, en el que todos ustedes pueden hablar de libros tanto como quieran. Obviamente, este es un nuevo flujo de
+ entradas, con un nuevo perfil (...o nuevos perfil<i>es</i>...) y contactos completamente diferentes. Algunas conexiones
+ pueden existir en ambos canales, pero habrá algunas que estén exclusivamente en uno de los dos. Usted mismo simplemente
+ cambie entre ambos como cambia de interlocutor en el mundo real cuando habla con varias personas en la calle
+ o personas con las que se reúne especialmente para hablar de libros. Incluso puede conectarse a sí mismo, o mejor: a su otro
+ canal. :)<i> Piense en un canal como en diferentes espacios dedicados a diferentes temas en los que puede hablar con diferentes
+ personas.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/settings/features/help.html b/doc/en/context/es-es/settings/features/help.html
new file mode 100644
index 000000000..a9c3c2d6c
--- /dev/null
+++ b/doc/en/context/es-es/settings/features/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Esta página le permite configurar los ajustes para muchas funcionalidades adicionales de Hubzilla.</dd>
+ <dt><a href='#' onclick='$("#general-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#general-settings-title", 0)}), 1000); return false;' title="Pulsar para resaltar el elemento...">Funcionalidades básicas</a></dt>
+ <dd>Las ajustes de las funcionalidades básicas incluyen opciones importantes para su canal, tales como el hospedaje de páginas web y wikis.</dd>
+ <dt><a href='#' onclick='$("#composition-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#composition-settings-title", 0)}), 1000); return false;' title="Pulsar para resaltar el elemento...">Opciones para la redacción de entradas</a></dt>
+ <dd>Los ajustes de la redacción de entradas incluyen opciones adicionales para la composición de nuevas publicaciones.</dd>
+ <dt><a href='#' onclick='$("#net_module-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#net_module-settings-title", 0)}), 1000); return false;' title="Pulsar para resaltar el elemento...">Filtrado del contenido</a></dt>
+ <dd>Estos ajustes modifican funcionalidades asociadas al filtrado del contenido y a cómo ver las publicaciones nuevas.</dd>
+ <dt><a href='#' onclick='$("#tools-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#tools-settings-title", 0)}), 1000); return false;' title="Pulsar para resaltar el elemento...">Gestión de entradas y comentarios</a></dt>
+ <dd>Estos ajustes proporcionan herramientas adicionales para establecer el tema de las entradas y permiten métodos adicionales para los comentarios, tales como los emojis y el etiquetado de la comunidad.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/settings/tokens/help.html b/doc/en/context/es-es/settings/tokens/help.html
new file mode 100644
index 000000000..6d6a8d81f
--- /dev/null
+++ b/doc/en/context/es-es/settings/tokens/help.html
@@ -0,0 +1,23 @@
+<dl class="dl-horizontal">
+ <dt><a href="/help/member/member_guide#Guest_Access_Tokens">Guest Access Tokens</a></dt>
+ <dd>
+ Para facilitar el intercambio de recursos privados con no miembros o miembros de otros nodos federados con una identificación limitada, Hubzilla debe proporcionar a los miembros un mecanismo para crear y administrar inicios de sesión temporales ("desechables"), también conocidos como "Zot Access Tokens". Estos tokens/credenciales se pueden utilizar para autenticarse en un sitio de hubzilla con el único propósito de acceder a recursos privilegiados o de acceso controlado (archivos, fotos, publicaciones, páginas web, salas de chat, etc.).
+ </dd>
+ <dt>Crear un token</dt>
+ <dd>
+ El formulario para crear / editar acepta tres parámetros, un nombre legible por el usuario, una contraseña o un token de acceso, y un
+ límite de caducidad opcional. Una vez que ha caducado, el acceso mediante el token deja de ser válido, ya no puede usarse, y será
+ purgado automáticamente de la lista de cuentas temporales. El campo de la contraseña, en los formularios para crear/editar,
+ muestra el texto del token de acceso y no una displays the text of the access token and not una contraseña oscurecida.
+ </dd>
+ <dt>Compartir un token</dt>
+ <dd>
+ No especificamos mecanismos para compartir estos tokens con otros. Se puede usar cualquier método de comunicación. Cualquier token que haya creado se añade al selector de la Lista de Control y puede ser usado por cualquiera que esté en esa lista.
+
+ <b>Ejemplo</b>: Una visitante llega a su sitio. Tiene un token de acceso que usted le ha proporcionado e intenta ver uno de sus álbumes de fotos (que está restringido para que solo lo puedan ver usted mismo y una identidad temporal). El permiso es denegado.
+
+ La visitante, ahora, selecciona "Iniciar sesión" del menú de la barra de navegación, que muestra la página de inicio de sesión. Ella escribe el nombre y contraseña que usted le ha proporcionado: ahora ya puede ver el álbum privado de fotos.
+
+ De forma alternativa, puede compartir un enlace a un fichero protegido, añadiendo un parámetro del tipo "&zat=abc123" a la dirección URL, en el que la cadena "abc123" es el token de acceso o contraseña para el inicio de sesión temporal. No se requiere ninguna negociación posterior: el fichero será mostrado.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/webpages/help.html b/doc/en/context/es-es/webpages/help.html
new file mode 100644
index 000000000..7cd7f7c11
--- /dev/null
+++ b/doc/en/context/es-es/webpages/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Puede crear sitios web modulares, con identidad propia, compuestos de elementos compartibles. </dd>
+ <dt>Páginas</dt>
+ <dd>Esta página enumera sus "páginas", a las que se asignan URLs en las que la gente pueden visitar su sitio. La estructura de las páginas se describe típicamente mediante una plantilla de diseño <b>asociada</b>, y su contenido se construye a partir de una colección de <b>bloques</b>.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1); return false;' title="Pulsar para resaltar el elmento...">Herramientas de portabilidad de sitios web</a></dt>
+ <dd>Las herramientas de portabilidad de sitios web le permiten importar y exportar múltiples elementos de páginas web (páginas, plantillas, bloques). Puede <b>importar</b> tanto de un fichero zip como de una carpeta de ficheros existente en la nube. Puede <b>exportar</b> tanto a un fichero zip que contenga un grupo seleccionado de elementos de páginas web, o exportarlos directamente a una carpeta de ficheros en la nube. <a target="_blank" href="help/webpages">Leer más...</a></dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/es-es/wiki/help.html b/doc/en/context/es-es/wiki/help.html
new file mode 100644
index 000000000..fdae1f095
--- /dev/null
+++ b/doc/en/context/es-es/wiki/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Cada wiki es una colección de páginas, compuestas como ficheros de texto formateados en Markdown.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#wiki_list", 1); return false;' title="Pulsar para resaltar el elemento...">Lista de wikis</a></dt>
+ <dd>Las páginas wiki propiedad del canal <i>que esté autorizado a ver</i> aparecen en el panel lateral.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Pulsar para resaltar el elemento...">Historial de la página</a></dt>
+ <dd>Cada revisión de una página se salva para permitir su rápida recuperación. Pulsar en la pestaña <b>Historial</b> para ver las revisiones de la página, incluyendo la fecha y el autor de cada una. El botón de reversión cargará la revisión seleccionada, pero no salvará automáticamente la página.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#wiki_page_list", 1); return false;' title="Pulsar para resaltar el elemento...">Páginas</a></dt>
+ <dd>La lista de páginas en el wiki aparece en el panel <b>Páginas del wiki</b>. Antes de salvar las páginas editadas usando el control <b>Página</b> en el menú desplegable, puede <a href='#' onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Pulsar para resaltar el elemento...">escribir un mensaje personalizado</a> que se verá en el visor <a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Pulsar para resaltar el elemento..."><b>Historial de la página</b></a> junto con la revisión.</dd>
+</dl>
diff --git a/doc/en/context/fr/admin/logs/help.html b/doc/en/context/fr/admin/logs/help.html
new file mode 100644
index 000000000..53f8e65c3
--- /dev/null
+++ b/doc/en/context/fr/admin/logs/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page vous permet d'ajuster les paramètres du journal d'événements et d'afficher le journal existant.</dd>.
+ <dt>Réglages du journal</dt>
+ <dd>Lorsque vous activez l'option "Débogage", les informations du journal système commenceront à s'ajouter au fichier spécifié dans la boîte "Fichier du journal" (le chemin est relatif à la racine du hub, par exemple /var/www). Notez que ce fichier doit être inscriptible par le serveur web.</dd>.
+ <dt>Niveau de journalisation</dt>
+ <dd>L'option "Niveau de journalisation" vous permet de définir la quantité d'informations ajoutées au fichier journal. Attention : Augmenter ce niveau peut rapidement gonfler la taille du fichier journal à >100MB, en particulier sur les hubs avec plusieurs membres.</dd>.
+</dl>
diff --git a/doc/en/context/fr/admin/queue/help.html b/doc/en/context/fr/admin/queue/help.html
new file mode 100644
index 000000000..836d81b92
--- /dev/null
+++ b/doc/en/context/fr/admin/queue/help.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Les statistiques de file d'attente affichent le nombre de messages dans la file d'attente pour livraison à d'autres centres. La priorité est liée au nombre de fois où la livraison a été tentée sans succès.</dd>
+</dl>
diff --git a/doc/en/context/fr/appman/help.html b/doc/en/context/fr/appman/help.html
new file mode 100644
index 000000000..d65f78378
--- /dev/null
+++ b/doc/en/context/fr/appman/help.html
@@ -0,0 +1,5 @@
+<dl class="dl-horizontal">
+ <dt>Information de base</dt>
+ <dd>Modifiez les propriétés individuelles de l'application que vous avez sélectionnée. Les catégories vous permettent de trier vos applications pour vous aider à les trouver plus facilement dans la liste. La prise en charge des applications personnalisées que vous ou votre administrateur pouvez choisir de créer inclut des champs tels que &laquo;Prix de l'application&raquo; et &laquo;Lieu d'achat&raquo; qui ne sont pas applicables aux applications centrales Hubzilla.
+ </dd>
+</dl>
diff --git a/doc/en/context/fr/cards/help.html b/doc/en/context/fr/cards/help.html
new file mode 100644
index 000000000..a58a9a73e
--- /dev/null
+++ b/doc/en/context/fr/cards/help.html
@@ -0,0 +1,20 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Les cartes représentent un domaine persistant de collaboration qui est distinct du volet social. Ils sont un peu plus légers que les pages web et les wikis pour une organisation rapide de l'information et ont l'avantage de permettre la collaboration et le commentaire. Ils sont bien adaptés pour aider à organiser des tâches complexes où il y a des mises à jour et des retours d'information fréquents.
+ </dd>
+ <dt>Ajouter une carte</dt>
+ <dd>
+ La création d'une nouvelle carte est très similaire à la composition d'un nouveau message.<br><br>
+ <ul>
+ <li>
+ <b>Nom du lien de page :</b> Le nom du lien de page est le nom de la carte pour l'URL statique.
+ </li>
+ <li>
+ <b>Titre :</b> Le titre est affiché en haut de la carte.
+ </li>
+ <li>
+ <b>Catégories :</b> Si la <a href="/settings/features">fonction catégories de messages</a> est activée pour votre chaîne, vous pouvez ajouter des catégories à la carte. Ces catégories remplissent la liste des catégories sur le panneau de gauche et permettent de filtrer votre collection de cartes.
+ </li>
+ </ul>
+ </dd>
+</dl>
diff --git a/doc/en/context/fr/channel/help.html b/doc/en/context/fr/channel/help.html
new file mode 100644
index 000000000..b2cf958b9
--- /dev/null
+++ b/doc/en/context/fr/channel/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base<dt>
+ <dd>C'est la page d'accueil d'un canal. Il est similaire au "mur" de quelqu'un dans un contexte de réseau social. Les messages créés par le canal sont affichés en fonction des permissions de visualisation de l'observateur.</dd>
+<dt>Créer un message</dt>
+ <dd>Si vous avez la permission de créer des messages sur la page du canal, alors vous verrez l'éditeur de messages en haut de la page.</dd>
+</dl>
diff --git a/doc/en/context/fr/chat/help.html b/doc/en/context/fr/chat/help.html
new file mode 100644
index 000000000..5f354c3c6
--- /dev/null
+++ b/doc/en/context/fr/chat/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Créez et utilisez des salons de discussion pour communiquer en temps réel, en utilisant le système standard de permissions Hubzilla pour le contrôle d'accès aux salons de discussion.</dd>
+ <dt>Créer un nouveau salon de discussion</dt>
+ <dd>Utilisez le bouton &laquo;Nouveau&raquo; pour créer un nouveau salon de discussion. Entrez un nom et la durée de conservation des messages.</dd>
+ <dt>Discussion</dt>
+ <dd>Entrez votre message dans la boîte de message et cliquez sur &laquo;Envoyer&raquo;. Vous pouvez définir un statut en sélectionnant le bouton du menu de la salle de discussion à côté du bouton &laquo;Envoyer&raquo;. D'autres personnes &laquo;dans la salon&raquo; sont visibles dans le panneau latéral du panneau &laquo;Membres du Salon&raquo;.</dd>
+</dl>
diff --git a/doc/en/context/fr/cloud/help.html b/doc/en/context/fr/cloud/help.html
new file mode 100644
index 000000000..c72e2ca1b
--- /dev/null
+++ b/doc/en/context/fr/cloud/help.html
@@ -0,0 +1,7 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page affiche les fichiers cloud d'un canal. Les fichiers visibles par l'observateur dépendent des permissions individuelles définies par le propriétaire du canal. Si vous avez l'autorisation de créer/télécharger des fichiers, vous verrez des boutons de contrôle au-dessus de la liste des fichiers.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Onglets de contenu de la chaîne</a></dt>
+ <dd>Les onglets de contenu du canal sont des liens vers d'autres contenus publiés par le canal. L'onglet <b>A propos</b> permet d'accéder au profil du canal. L'onglet <b>Photos</b> permet d'accéder aux galeries de photos de la chaîne. L'onglet <b>Fichiers</b> permet d'accéder aux fichiers généraux partagés publiés par le canal.</dd>
+</dl>
diff --git a/doc/en/context/fr/connections/help.html b/doc/en/context/fr/connections/help.html
new file mode 100644
index 000000000..38e581866
--- /dev/null
+++ b/doc/en/context/fr/connections/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page affiche une liste de toutes les connexions de ce canal. La liste peut être <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">triée et filtrée à l'aide du bouton de menu à côté du bouton de recherche</a>. </dd>
+ <dt>Détails de connexion</dt>
+ <dd>Chaque entrée de liste affiche les détails d'une connexion spécifique. Une image d'avatar translucide indique une connexion archivée.</dd>
+ <dt>État de la connexion</dt>
+ <dd> Une connexion peut être dans différents états : <ul><li>Archivé</li><li>Ignoré</li><li>Bloqué</li><li>Caché</li></ul></dd>
+</dl>
diff --git a/doc/en/context/fr/connections/ifpending/help.html b/doc/en/context/fr/connections/ifpending/help.html
new file mode 100644
index 000000000..38e581866
--- /dev/null
+++ b/doc/en/context/fr/connections/ifpending/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page affiche une liste de toutes les connexions de ce canal. La liste peut être <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">triée et filtrée à l'aide du bouton de menu à côté du bouton de recherche</a>. </dd>
+ <dt>Détails de connexion</dt>
+ <dd>Chaque entrée de liste affiche les détails d'une connexion spécifique. Une image d'avatar translucide indique une connexion archivée.</dd>
+ <dt>État de la connexion</dt>
+ <dd> Une connexion peut être dans différents états : <ul><li>Archivé</li><li>Ignoré</li><li>Bloqué</li><li>Caché</li></ul></dd>
+</dl>
diff --git a/doc/en/context/fr/connedit/help.html b/doc/en/context/fr/connedit/help.html
new file mode 100644
index 000000000..c9b784d3e
--- /dev/null
+++ b/doc/en/context/fr/connedit/help.html
@@ -0,0 +1,13 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page vous permet de modifier ou d'éditer les paramètres individuels pour une connexion particulière ou de supprimer complètement une connexion. Vous êtes peut-être arrivé sur cette page après avoir créé ou approuvé une nouvelle connexion. Si c'est le cas, vous n'êtes pas tenu de faire quoi que ce soit. Votre connexion a déjà été établie. <strong>Vous pouvez</strong> les ajouter à un groupe ou ajuster des permissions spéciales, et cette page est présentée de façon à ce que vous puissiez le faire pendant que l'occasion se présente.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Outils de connexion</a></dt>
+ <dd>Le <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">menu Outils de connexion</a> permet d'accéder à plusieurs paramètres. Afficher le profil, Afficher l'activité récente, Rafraîchir les autorisations, définir ou réinitialiser les indicateurs (Bloquer, Ignorer, Archiver, Cacher) et supprimer la connexion.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Groupes de protection de la vie privée</a></dt>
+ <dd>Chaque connexion peut être assignée à un ou plusieurs groupes de confidentialité pour regrouper des collections d'amis ayant accès à des messages, médias et autres contenus spécifiques. Vous pouvez les ajouter à un groupe de confidentialité existant ici, ou créer un nouveau groupe de confidentialité. Lorsque vous les ajoutez à un groupe existant, l'action est immédiate et vous n'avez pas besoin de soumettre un formulaire. </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#perms-tool", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Permissions individuelles</a></dt>
+ <dd>L'octroi de permissions est généralement automatique et n'exige aucune action de votre part. Cependant, il se peut que vous souhaitiez ajuster des paramètres spécifiques pour cette connexion qui sont différents des autres.</dd>
+ <dt>Paramètres spécifiques aux fonctions</dt>
+ <dd>Un certain nombre de paramètres individuels sont contrôlés par des fonctions supplémentaires qui peuvent ou non être activées sur votre hub ou pour votre canal. Plusieurs fonctions optionnelles ont des paramètres pour chaque connexion, et ceux-ci peuvent être définis sur cette page par le biais d'onglets de formulaire supplémentaires qui peuvent être présents.</dd>
+</dl>
diff --git a/doc/en/context/fr/events/help.html b/doc/en/context/fr/events/help.html
new file mode 100644
index 000000000..aafd49703
--- /dev/null
+++ b/doc/en/context/fr/events/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page affiche un calendrier des événements qui vous appartiennent et que vous partagez avec d'autres canaux.</dd>
+ <dt>Vue du calendrier</dt>
+ <dd>Le calendrier peut être affiché en mode mois, semaine ou jour en utilisant les options du panneau latéral.</dd>
+ <dt>Exportation/Importation</dt>
+ <dd>Exporter ou importer des événements de calendrier en utilisant des fichiers au format standard iCalendar (.ics).</dd>
+</dl>
diff --git a/doc/en/context/fr/mail/help.html b/doc/en/context/fr/mail/help.html
new file mode 100644
index 000000000..fcf4eff21
--- /dev/null
+++ b/doc/en/context/fr/mail/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Les messages affichés dans courrier privé ne sont visibles que pour vous et le destinataire unique.</dd>
+ <dt>Vue combinée</dt>
+ <dd>Les conversations complètes peuvent être visualisées dans un fil continu en sélectionnant <b>Vue combinée </b>. Les conversations disponibles sont affichées sous le menu dans le panneau latéral.</dd>
+ <dt>Boîte de réception/Boîte d'envoi</dt>
+ <dd>Les messages individuels envoyés sont visualisés en sélectionnant <b>Boîte d'envoi</b>, et les messages entrants sont visualisés en utilisant le filtre <b>Boîte de réception</b>.</dd>
+ <dt>Nouveau message.</dt>
+ <dd>Les messages individuels ont des rapports de livraison qui peuvent être visualisés à l'aide du menu déroulant. Les messages peuvent également être rappelés à partir du même menu, ce qui peut empêcher le destinataire de voir le message <i>s'il ne l'a pas déjà lu</i>.</dd>
+</dl>
diff --git a/doc/en/context/fr/photos/help.html b/doc/en/context/fr/photos/help.html
new file mode 100644
index 000000000..8609e9849
--- /dev/null
+++ b/doc/en/context/fr/photos/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page affiche les albums photos du canal. Les images visibles pour l'observateur dépendent des permissions d'images individuelles.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Onglets de contenu du canal</a></dt>
+ <dd>Les onglets de contenu du canal sont des liens vers d'autres contenus publiés par le canal. L'onglet <b>A propos</b> permet d'accéder au profil de canal. L'onglet <b>Photos</b> permet d'accéder aux galeries de photos des chaînes. L'onglet <b>Fichiers</b> permet d'accéder aux fichiers généraux partagés publiés par le canal.</dd>
+</dl>
diff --git a/doc/en/context/fr/profile/help.html b/doc/en/context/fr/profile/help.html
new file mode 100644
index 000000000..26559db6f
--- /dev/null
+++ b/doc/en/context/fr/profile/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Ceci est la page de profil d'un canal. Il affiche typiquement des informations décrivant le canal. Si le canal représente une personne dans un réseau social, par exemple, le profil peut fournir des informations de contact et d'autres détails personnels sur la personne. Les canaux peuvent avoir plusieurs profils, où le profil affiché dépend de l'observateur.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Onglets de contenu du canal</a></dt>
+ <dd>Les onglets de contenu du canal sont des liens vers d'autres contenus publiés par le canal. L'onglet <b>A propos</b> permet d'accéder au profil de canal. L'onglet <b>Photos</b> permet d'accéder aux galeries de photos des chaînes. L'onglet <b>Fichiers</b> permet d'accéder aux fichiers généraux partagés publiés par le canal.</dd>
+</dl>
diff --git a/doc/en/context/fr/settings/account/help.html b/doc/en/context/fr/settings/account/help.html
new file mode 100644
index 000000000..ed8e7f374
--- /dev/null
+++ b/doc/en/context/fr/settings/account/help.html
@@ -0,0 +1,18 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>
+ Une fois que vous avez enregistré un <i>compte</i> dans la matrice, vous avez également créé un <i>profil</i> et un <i>canal</i>.
+ </dd>
+ <dt>Compte</dt>
+ <dd>
+ Vous avez <i>un compte</i>. Il contient votre compte de courriel et votre mot de passe. Avec votre compte, vous accédez à votre profil et votre canal. Pensez à votre compte comme la façon dont vous vous authentifiez sur un site Hubzilla. Il vous permet de faire des choses, comme créer des profils et des canaux avec lesquels vous pouvez vous connecter à d'autres personnes.
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ Vous vous êtes sûrement inscrit à d'autres services Internet, comme les forums ou les communautés en ligne. Pour chacun d'entre eux, vous avez fourni des informations sur vous-même, telles que la date de naissance, le pays, l'âge et autres. Contrairement à d'autres services, Hubzilla vous offre l'avantage de créer <i>plus de profils</i>. Vous pouvez ainsi faire la distinction entre les profils qui s'adressent à tous (votre profil public) et vos collègues de travail, votre famille et votre partenaire. Pensez à votre profil comme étant l'information de base sur vous-même que vous donnez aux autres.
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ Lors de l'enregistrement, vous avez créé votre premier <i>canal</i>. Oui, en plus de plusieurs profils, vous pouvez avoir plusieurs canaux. Cela pourrait être un peu confus au début, mais mettons les choses au clair. Vous avez déjà créé un canal. Vous pouvez utiliser celui-ci pour le public, pour communiquer avec les gens sur la vie de tous les jours. Mais vous êtes peut-être un lecteur de livres passionné et beaucoup de gens s'ennuient. Ainsi, vous ouvrez un <i>second canal </i> juste pour les amateurs de livres, où vous pouvez tous parler de livres autant que vous le souhaitez. Il s'agit évidemment d'un nouveau flux de messages, avec un nouveau profil (ou nouveaux profils) et des contacts complètement différents. Certaines connexions peuvent exister dans les deux canaux, mais il y en aura qui sont exclusives à l'un d'entre eux. Vous-même vous changez entre les deux comme vous le feriez dans la vie réelle lorsque vous parlez à des gens que vous rencontrez dans la rue ou à des gens que vous rencontrez pour parler de livres spécifiquement. Vous pouvez même vous connecter à vous-même, ou mieux : à votre autre canal <i class="fa fa-smile-o" aria-hidden="true"></i> <i>.<br/>Penser un canal comme différents espaces dédiés à différents sujets où vous rencontrez différentes personnes.</i>.
+ </dd>
+</dl>
diff --git a/doc/en/context/fr/settings/channel/help.html b/doc/en/context/fr/settings/channel/help.html
new file mode 100644
index 000000000..ed8e7f374
--- /dev/null
+++ b/doc/en/context/fr/settings/channel/help.html
@@ -0,0 +1,18 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>
+ Une fois que vous avez enregistré un <i>compte</i> dans la matrice, vous avez également créé un <i>profil</i> et un <i>canal</i>.
+ </dd>
+ <dt>Compte</dt>
+ <dd>
+ Vous avez <i>un compte</i>. Il contient votre compte de courriel et votre mot de passe. Avec votre compte, vous accédez à votre profil et votre canal. Pensez à votre compte comme la façon dont vous vous authentifiez sur un site Hubzilla. Il vous permet de faire des choses, comme créer des profils et des canaux avec lesquels vous pouvez vous connecter à d'autres personnes.
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ Vous vous êtes sûrement inscrit à d'autres services Internet, comme les forums ou les communautés en ligne. Pour chacun d'entre eux, vous avez fourni des informations sur vous-même, telles que la date de naissance, le pays, l'âge et autres. Contrairement à d'autres services, Hubzilla vous offre l'avantage de créer <i>plus de profils</i>. Vous pouvez ainsi faire la distinction entre les profils qui s'adressent à tous (votre profil public) et vos collègues de travail, votre famille et votre partenaire. Pensez à votre profil comme étant l'information de base sur vous-même que vous donnez aux autres.
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ Lors de l'enregistrement, vous avez créé votre premier <i>canal</i>. Oui, en plus de plusieurs profils, vous pouvez avoir plusieurs canaux. Cela pourrait être un peu confus au début, mais mettons les choses au clair. Vous avez déjà créé un canal. Vous pouvez utiliser celui-ci pour le public, pour communiquer avec les gens sur la vie de tous les jours. Mais vous êtes peut-être un lecteur de livres passionné et beaucoup de gens s'ennuient. Ainsi, vous ouvrez un <i>second canal </i> juste pour les amateurs de livres, où vous pouvez tous parler de livres autant que vous le souhaitez. Il s'agit évidemment d'un nouveau flux de messages, avec un nouveau profil (ou nouveaux profils) et des contacts complètement différents. Certaines connexions peuvent exister dans les deux canaux, mais il y en aura qui sont exclusives à l'un d'entre eux. Vous-même vous changez entre les deux comme vous le feriez dans la vie réelle lorsque vous parlez à des gens que vous rencontrez dans la rue ou à des gens que vous rencontrez pour parler de livres spécifiquement. Vous pouvez même vous connecter à vous-même, ou mieux : à votre autre canal <i class="fa fa-smile-o" aria-hidden="true"></i> <i>.<br/>Penser un canal comme différents espaces dédiés à différents sujets où vous rencontrez différentes personnes.</i>.
+ </dd>
+</dl>
diff --git a/doc/en/context/fr/settings/features/help.html b/doc/en/context/fr/settings/features/help.html
new file mode 100644
index 000000000..2811c932e
--- /dev/null
+++ b/doc/en/context/fr/settings/features/help.html
@@ -0,0 +1,12 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page vous permet de configurer les paramètres pour les nombreuses fonctionnalités supplémentaires de Hubzilla.</dd>
+ <dt><a href='#' onclick='$("#general-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#general-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">Paramètres généraux</a></dt>
+ <dd>Les paramètres généraux des fonctionnalités incluent des options pertinentes pour votre canal, telles que la page web et l'hébergement wiki.</dd>
+ <dt><a href='#' onclick='$("#composition-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#composition-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">Fonctions de composition de messages</a></dt>
+ <dd>Les fonctions de composition de messages offrent des options et des capacités supplémentaires lors de la composition de nouveaux messages.</dd>
+ <dt><a href='#' onclick='$("#net_module-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#net_module-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">Filtrage des réseaux et des flux</a></dt>
+ <dd>Ces paramètres modifient les fonctions associées au filtrage et au contrôle de l'affichage des messages entrants.</dd>
+ <dt><a href='#' onclick='$("#tools-settings-title h3 a").click(); setTimeout((function() {contextualHelpFocus("#tools-settings-title", 0)}), 1000); return false;' title="Click to highlight element...">Outils d'affichage et de commentaires</a></dt>
+ <dd>Ceux-ci fournissent des outils supplémentaires pour catégoriser les messages et permettre des méthodes de commentaires supplémentaires telles que l'emoji ou le balisage de la communauté.</dd>
+</dl>
diff --git a/doc/en/context/fr/settings/tokens b/doc/en/context/fr/settings/tokens
new file mode 100644
index 000000000..6be17a615
--- /dev/null
+++ b/doc/en/context/fr/settings/tokens
@@ -0,0 +1,20 @@
+<dl class="dl-horizontal">
+ <dt><a href="/help/member/member_guide#Guest_Access_Tokens">Jetons d'accès invités</a></dt>
+ <dd>
+ Afin de faciliter le partage de ressources privées avec des non-membres ou des membres de nœuds de fédération à découverte d'identification limitée, Hubzilla devrait fournir aux membres un mécanisme pour créer et gérer des logins temporaires (&laquo;jetables&raquo;), alias &laquo;Zot Access Tokens&raquo;. Ces jetons/accréditations peuvent être utilisés pour s'authentifier sur un site hubzilla dans le seul but d'accéder à des ressources privilégiées ou contrôlées (fichiers, photos, posts, pages web, salons de discussion, etc.
+ </dd>
+ <dt>Créer un jeton</dt>
+ <dd>
+ Le formulaire à créer/éditer accepte trois paramètres, un nom lisible par l'homme, un mot de passe ou un jeton d'accès, et une expiration facultative. Une fois expiré, le jeton d'accès n'est plus valide, ne peut plus être utilisé et sera automatiquement supprimé de la liste des comptes temporaires. Le champ mot de passe dans les formulaires de création/édition affiche le texte du jeton d'accès et non un mot de passe masqué.
+ </dd>
+ <dt>Partager un jeton</dt>
+ <dd>
+ Nous ne spécifions pas de mécanismes pour partager ces jetons avec d'autres. Toute méthode de communication peut être utilisée. Tous les jetons que vous avez créés sont ajoutés au sélecteur de liste de contrôle d'accès et peuvent être utilisés partout où des listes de contrôle d'accès sont fournies.
+
+ <b>Exemple</b> : Un visiteur arrive sur votre site. Elle a un jeton d'accès que vous lui avez fourni et tente de visiter l'un de vos albums photos (qui ne peut être visionné que par vous-même et une identité temporaire). La permission est refusée.
+
+ Le visiteur sélectionne maintenant &laquo;Login&raquo; dans la barre de navigation du menu. Ceci présente une page de connexion. Elle entre le nom et le mot de passe que vous lui avez fournis, et elle peut maintenant voir l'album photo restreint.
+
+ Alternativement, vous pouvez partager un lien vers un fichier protégé en ajoutant un paramètre &laquo;&zat=abc123&raquo; à l'URL, où la chaîne &laquo;abc123&raquo; est la clé d'accès ou le mot de passe pour la connexion temporaire. Aucune autre négociation n'est nécessaire et le dossier est présenté.
+ </dd>
+</dl>
diff --git a/doc/en/context/fr/webpages/help.html b/doc/en/context/fr/webpages/help.html
new file mode 100644
index 000000000..c9d34c08f
--- /dev/null
+++ b/doc/en/context/fr/webpages/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Vous pouvez créer des sites Web modulaires, conscients de l'identité, composés d'éléments partageables.</dd>
+ <dt>Pages</dt>
+ <dd>Cette page énumère vos "pages", qui sont assignées des URLs où les gens peuvent visiter votre site. La structure des pages est généralement décrite par une <b>mise en page </b> associée , et leur contenu est construit à partir d'une collection de <b>blocs</b>.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1); return false;' title="Cliquez pour mettre en évidence l'élément...">Outils de portage de site Web</a></dt>
+ <dd>Les outils de portation de site Web vous permettent d'importer/exporter plusieurs éléments de pages Web (pages, mises en page, mises en page, blocs). Vous pouvez <b>importer </b> soit à partir d'un fichier zip téléchargé, soit à partir d'un dossier de fichiers cloud existant. Vous pouvez <b>exporter </b> vers un fichier zip contenant un groupe choisi d'éléments de page Web sous une forme compatible avec l'outil d'importation, ou vous pouvez exporter directement vers un dossier de fichiers dans le cloud. <a target="_blank" href="help/webpages">en savoir plus...</a></dd>
+</dl>
diff --git a/doc/en/context/fr/wiki/help.html b/doc/en/context/fr/wiki/help.html
new file mode 100644
index 000000000..af46899e4
--- /dev/null
+++ b/doc/en/context/fr/wiki/help.html
@@ -0,0 +1,13 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Chaque wiki est une collection de pages, composée sous forme de fichiers texte au format Markdown.</dd>
+ <dt>Liste des wikis</dt>
+ <dd>Les wikis appartenant au canal <i>que vous avez la permission de voir </i> sont listés dans le panneau latéral.</dd>
+ <dt>Historique de la page</dt>
+ <dd>Chaque révision d'une page est sauvegardée pour permettre un retour rapide. Cliquez sur l'onglet <b>History</b> pour afficher l'historique des révisions de page, y compris la date et l'auteur de chacune d'entre elles. Le bouton Revenir chargera la révision sélectionnée mais n'enregistrera pas automatiquement la page.</dd>
+ <dt>Pages</dt>
+ <dd>La liste des pages du wiki est listée dans le panneau <b>Pages Wiki</b>. Avant d'enregistrer les modifications de page à l'aide du menu déroulant <b>Page</b>, vous pouvez <a href='#' onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">entrer un message personnalisé</a> à afficher dans le <a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">visualiseur d'historique de page</a> avec la révision.</dd>
+</dl>
+
+
+
diff --git a/doc/en/context/it/wiki/help.html b/doc/en/context/it/wiki/help.html
new file mode 100644
index 000000000..e93e18eb4
--- /dev/null
+++ b/doc/en/context/it/wiki/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>Ogni wiki è una raccolta di pagine, composta di file di testo formattati con Markdown.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#wiki_list", 1); return false;' title="Fai click per evidenziare l'elemento...">Elenco dei Wiki</a></dt>
+ <dd>I Wiki del canale <i>che sei abilitato a vedere</i> sono elencati nel pannello laterale.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Fai click per evidenziare l'elemento...">Cronologia della pagina</a></dt>
+ <dd>Le revisioni di ogni pagina vengono salvate per rendere possibile un ripristino veloce. Fai click sulla tab <b>Cronologia</b> per vedere l'elenco delle revisioni, con autore e data delle stesse. Il bottone di ripristino riporterà alla revisione selezionata, senza salvare automaticamente la pagina.</dd>
+ <dt><a href="#" onclick='contextualHelpFocus("#wiki_page_list", 1); return false;' title="Fai click per evidenziare l'elemento...">Pagine</a></dt>
+ <dd>L'elenco delle pagine del wiki si trova nel pannello <b>Pagine del wiki</b>. Prima di salvare le modifiche con il menu a discela <b>Pagina</b>, puoi <a href="#" onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Fai click per evidenziare l'elemento...">inserire un messaggio</a> che verrà visualizzato nella visualizzazione della <a href="#" onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Fai click per evidenziare l'elemento..."><b>storia della pagina</b></a> insieme alla revisione.</dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/admin/addons/assets/addon_repo_gui_1.png b/doc/en/context/pl/admin/addons/assets/addon_repo_gui_1.png
new file mode 100644
index 000000000..37139b345
--- /dev/null
+++ b/doc/en/context/pl/admin/addons/assets/addon_repo_gui_1.png
Binary files differ
diff --git a/doc/en/context/pl/admin/addons/help.html b/doc/en/context/pl/admin/addons/help.html
new file mode 100644
index 000000000..fe63718df
--- /dev/null
+++ b/doc/en/context/pl/admin/addons/help.html
@@ -0,0 +1,14 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>Ta strona zarządza instalacją dodatków (zwanych też <i>wtyczkami</i>).</dd>
+ <dt>Zarządzanie repozytorium</dt>
+ <dd>Jeśli serwer internetowy ma niezbędne uprawnienia do zapisu, zobaczysz przycisk <b>Zarządzaj repozytoriami</b>,
+ co otwiera panel sterowania do zarządzania zainstalowanymi <i>repozytoriami</i> wtyczek. Te repozytoria są
+ przechowywane w katalogu <span style = "font-family: monospace;">extension/addon/[nazwa repozytorium]/</span>.
+ Oficjalne repozytorium dodatków Hubzilla można dodać, wprowadzając adres URL repozytorium
+ <span style = "font-family: monospace;"> https://framagit.org/hubzilla/addons.git </span>
+ i wybierając nazwę repozytorium, na przykład <b>oficjalne</b>. Powinieneś zobaczyć to repozytorium na liście
+ podobnej do tej:
+ <br>
+ <img class="img-responsive" src="doc/context/en/admin/addons/assets/addon_repo_gui_1.png"></dd>
+</dl>
diff --git a/doc/en/context/pl/admin/logs/help.html b/doc/en/context/pl/admin/logs/help.html
new file mode 100644
index 000000000..1d79d6a8c
--- /dev/null
+++ b/doc/en/context/pl/admin/logs/help.html
@@ -0,0 +1,20 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Ta strona umożliwia dostosowanie ustawień dziennika oraz przeglądanie
+ istniejącego dziennika.
+ </dd>
+ <dt>Ustawienia dziennika</dt>
+ <dd>
+ Po włączeniu opcji debugowania informacje o zdarzeniach systemowych zaczną
+ być dołączane do pliku określonego w polu "Plik dziennika" (ścieżka jest
+ względna w stosunku do katalogu głównego huba, na przykład /var/www).
+ Zauważ, że ten plik musi być możliwy do zapisywania przez serwer WWW.</dd>
+ <dt>Pozion rejestracji</dt>
+ <dd>
+ Opcja poziomu dziennika umożliwia ustawienie ilości informacji dołączanych
+ do pliku dziennika. Ostrzeżenie: zwiększenie tego poziomu może szybko
+ zwiększyć rozmiar pliku dziennika do ponad 100 MB, szczególnie w hubach z
+ więcej niż kilkoma członkami.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/admin/queue/help.html b/doc/en/context/pl/admin/queue/help.html
new file mode 100644
index 000000000..af5c06787
--- /dev/null
+++ b/doc/en/context/pl/admin/queue/help.html
@@ -0,0 +1,7 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Statystyki kolejki pokazują, ile wpisów znajduje się w kolejce w celu dostarczenia
+ ich do innych portali. Priorytet jest związany z liczbą nieudanych prób dostawy.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/admin/security/help.html b/doc/en/context/pl/admin/security/help.html
new file mode 100644
index 000000000..0e582e6b4
--- /dev/null
+++ b/doc/en/context/pl/admin/security/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Ta strona zawiera różne ustawienia administratora związane z bezpieczeństwem.
+ Aby zapisać zmiany wprowadzone w tych ustawieniach, musisz nacisnąć przycisk
+ "Prześlij".
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/appman/help.html b/doc/en/context/pl/appman/help.html
new file mode 100644
index 000000000..867b5b482
--- /dev/null
+++ b/doc/en/context/pl/appman/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Edytowanie poszczególnych właściwości wybranej aplikacji. Kategorie umożliwiają
+ sortowanie aplikacji, aby ułatwić znajdowanie ich na liście. Wsparcie dla
+ niestandardowych aplikacji, które Ty lub Twój administrator możecie wybrać,
+ obejmuje pola, takie jak ""Cena aplikacji"" i "Lokalizacja zakupu"", które nie
+ są zastosowane w podstawowych aplikacjach Hubzilla.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/cards/help.html b/doc/en/context/pl/cards/help.html
new file mode 100644
index 000000000..2e9886283
--- /dev/null
+++ b/doc/en/context/pl/cards/help.html
@@ -0,0 +1,31 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Karty reprezentują trwały obszar współpracy, który jest niezależny od
+ strumienia społecznościowego. Są nieco lżejsze niż strony internetowe i wiki,
+ dzięki czemu zapewniają szybką organizację informacji i mają tę zaletę, że
+ umożliwiają współpracę i komentowanie. Są dobrze przystosowane do pomocy w
+ organizowaniu złożonych zadań, w przypadku których często pojawiają się
+ aktualizacje i informacje zwrotne.
+ </dd>
+ <dt>Dodanie karty</dt>
+ <dd>
+ Tworzenie nowej karty jest bardzo podobne do tworzenia nowego postaa.<br><br>
+ <ul>
+ <li>
+ <b>Nazwa linku do strony</b>: nazwa linku do strony jest nazwą
+ karty dla statycznego adresu URL
+ </li>
+ <li>
+ <b>Tytuł</b>: Tytuł jest wyświetlany u góry karty
+ </li>
+ <li>
+ <b>Kategorie</b>: Jeśli na swoim kanale masz włączoną
+ <a href="/settings/features"> funkcjonalność kategorii postów </a>,
+ możesz dodawać kategorie do karty. Kategorie te zawarte są na liście
+ <b>Kategorie</b>, na lewym panelu i umożliwiają filtrowanie
+ kolekcji kart.
+ </li>
+ </ul>
+ </dd>
+</dl>
diff --git a/doc/en/context/pl/channel/help.html b/doc/en/context/pl/channel/help.html
new file mode 100644
index 000000000..bd454c361
--- /dev/null
+++ b/doc/en/context/pl/channel/help.html
@@ -0,0 +1,13 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ To jest strona główna kanału. Jest ona podobna do "ściany" profilu w kontekście
+ sieci społecznościowej. Posty utworzone w kanale są wyświetlane zgodnie z
+ uprawnieniami obserwatora do oglądania treści.
+ </dd>
+ <dt>Tworzenie posta</dt>
+ <dd>
+ Jeśli masz uprawnienia do tworzenia postów na stronie kanału, u góry zobaczysz
+ edytor postów.
+ </dd>
+</dl>
diff --git a/doc/en/context/pl/chat/help.html b/doc/en/context/pl/chat/help.html
new file mode 100644
index 000000000..0cf063aa8
--- /dev/null
+++ b/doc/en/context/pl/chat/help.html
@@ -0,0 +1,19 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Twórz pokoje rozmów i wykorzystuj je do komunikacji w czasie rzeczywistym,
+ używając standardowego systemu uprawnień Hubzilla do kontroli dostępu do
+ pokojów rozmów.
+ </dd>
+ <dt>Tworzenie nowego pokoju rozmów</dt>
+ <dd>
+ Użyj przycisku "Utwórz nowy", aby utworzyć nowy pokój rozmów. Wpisz nazwę i
+ jak długo wiadomości mają być przechowywane.
+ </dd>
+ <dt>Czatowanie</dt>
+ <dd>
+ Wpisz wiadomość w polu wiadomości i naciśnij "Prześlij". Możesz ustawić status,
+ wybierając przycisk menu pokoju rozmów sieciowych obok przycisku "Wyślij".
+ Inne osoby "w pokoju" są widoczne w panelu bocznym w panelu "Członkowie czatu".
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/cloud/help.html b/doc/en/context/pl/cloud/help.html
new file mode 100644
index 000000000..d629e6d41
--- /dev/null
+++ b/doc/en/context/pl/cloud/help.html
@@ -0,0 +1,17 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Ta strona wyświetla pliki "w chmurze" kanału. To co widzi przeglądajacy zależy
+ od jego indywidualnych uprawnień do plików, które ustawia właściciel kanału.
+ Jeśli masz uprawnienia do tworzenia i przesyłania plików, zobaczysz przyciski
+ kontrolne nad listą plików.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;'
+ title="Kliknij, aby podświetlić element...">Karty zawartości kanału</a></dt>
+ <dd>
+ Karty zawarości kanału to linki do innych treści publikowanych przez kanał.
+ Karta <b>Informacje</b> prowadzi do profilu kanału. Karta <b>Zdjęcia</b>
+ prowadzi do galerii zdjęć kanału. Zakładka <b>Pliki</b> zawiera linki do
+ ogólnych plików udostępnionych do publikacji w kanale.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/connections/help.html b/doc/en/context/pl/connections/help.html
new file mode 100644
index 000000000..837184334
--- /dev/null
+++ b/doc/en/context/pl/connections/help.html
@@ -0,0 +1,24 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Ta strona wyświetla listę wszystkich połączeń tego kanału. Lista można
+ <a href = '#' onclick = 'contextualHelpFocus (".section-title-wrapper", 0); return false; '
+ title = "Kliknij, aby podświetlić element ..."> posortować i przefiltrować
+ za pomocą przycisku menu obok przycisku wyszukiwania </a>.
+ </dd>
+ <dt>Szczegóły połączenia</dt>
+ <dd>
+ Każdy wpis na liście przedstawia szczegóły określonego połączenia.
+ Przezroczysty obraz awatara wskazuje na zarchiwizowane połączenie.
+ </dd>
+ <dt>Stan połączenie</dt>
+ <dd>
+ Połączenie może mieć różne stany:
+ <ul>
+ <li> Zarchiwizowane</li>
+ <li> Zignorowane</li>
+ <li> Zablokowane</li>
+ <li> Ukryte</li>
+ </ul>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/connections/ifpending/help.html b/doc/en/context/pl/connections/ifpending/help.html
new file mode 100644
index 000000000..b2d05947a
--- /dev/null
+++ b/doc/en/context/pl/connections/ifpending/help.html
@@ -0,0 +1,24 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Ta strona wyświetla listę wszystkich połączeń tego kanału. Lista można
+ <a href = '#' onclick = 'contextualHelpFocus (".section-title-wrapper", 0); return false; '
+ title = "Kliknij, aby podświetlić element ..."> posortować i przefiltrować
+ za pomocą przycisku menu obok przycisku wyszukiwania</a>.
+ </dd>
+ <dt>Szczegóły połączenia</dt>
+ <dd>
+ Każdy wpis na liście przedstawia szczegóły określonego połączenia.
+ Przezroczysty obraz awatara wskazuje na zarchiwizowane połączenie.
+ </dd>
+ <dt>Stan połączenia</dt>
+ <dd>
+ Połączenie może mieć różne stany:
+ <ul>
+ <li> Zarchiwizowane</li>
+ <li> Zignorowane</li>
+ <li> Zablokowane</li>
+ <li> Ukryte</li>
+ </ul>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/connedit/help.html b/doc/en/context/pl/connedit/help.html
new file mode 100644
index 000000000..746908cf2
--- /dev/null
+++ b/doc/en/context/pl/connedit/help.html
@@ -0,0 +1,44 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Ta strona umożliwia zmianę lub edycję dowolnych indywidualnych ustawień dla
+ określonego połączenia lub całkowite usunięcie połączenia. Być może dotarłeś
+ do tej strony po utworzeniu lub zatwierdzeniu nowego połączenia. Jeśli tak,
+ nie musisz nic robić. Twoje połączenie zostało już nawiązane.
+ <strong>Możesz</strong> chcieć dodać je do grupy lub dostosować specjalne
+ uprawnienia, a ta strona jest prezentowana, abyś mógł to zrobić przy okazji
+ ustanowienie nowego połączenia.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;'
+ title="Kliknij, aby podświetlić element...">Narzędzia do połączeń</a></dt>
+ <dd>
+ <A href = '#' onclick = 'contextualHelpFocus (".section-title-wrapper", 0); return false; '
+ title = "Kliknij, aby podświetlić element ..."> Menu naarzędzi połączeń</a>
+ umożliwia dostęp do kilku ustawień. Wyświetl profil, wyświetl ostatnią aktywność,
+ odśwież uprawnienia, ustaw lub zresetuj flagi (blokuj, ignoruj, archiwizuj, ukryj)
+ i usuń połączenie.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 0); return false;'
+ title="Kliknij, aby podświetlić element...">Grupy prywatności</a></dt>
+ <dd>
+ Każde połączenie może być przypisane do jednej lub więcej grup prywatności
+ w celu grupowania kolekcji znajomych z dostępem do określonych wpisów,
+ multimediów i innych treści. Możesz dodać je tutaj do istniejącej grupy
+ prywatności lub utworzyć nową grupę prywatności. Po dodaniu ich do istniejącej
+ grupy akcja jest natychmiastowa i nie musisz przesyłać formularza.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#perms-tool", 0); return false;'
+ title="Kliknij, aby podświetlić element...">Indywidualne uprawniena</a></dt>
+ <dd>
+ Udzielanie uprawnień jest zwykle automatyczne i nie wymaga żadnych działań
+ z Twojej strony. Możesz jednak chcieć dostosować określone uprawnienia dla
+ tego połączenia, które są inne niż dla innych.
+ </dd>
+ <dt>Ustawienia specyficznych funkcji</dt>
+ <dd>
+ Szereg indywidualnych ustawień jest kontrolowanych za pomocą dodatkowych
+ funkcji, które mogą, ale nie muszą być aktywowane na Twoim węźle lub na Twoim
+ kanale. Kilka opcjonalnych funkcji ma ustawienia dla każdego połączenia,
+ które można ustawić na tej stronie za pomocą dodatkowych zakładek formularza.
+ </dd>
+</dl>
diff --git a/doc/en/context/pl/events/help.html b/doc/en/context/pl/events/help.html
new file mode 100644
index 000000000..542661fa5
--- /dev/null
+++ b/doc/en/context/pl/events/help.html
@@ -0,0 +1,18 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Na tej stronie wyświetlany jest kalendarz wydarzeń, który należy do Ciebie
+ oraz kalendarze, które zostały Ci udostępnione z innych kanałów.
+ /dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#title", 0); return false;'
+ title="Kliknij, aby podświetlić element...">Widok kalendarza</a></dt>
+ <dd>
+ Kalendarz może być wyświetlany w trybie miesiąca, tygodnia lub dnia, przy użyciu
+ opcji widocznych na panelu bocznym.
+ </dd>
+ <dt>Eksport/Import</dt>
+ <dd>
+ Eksportuj lub importuj wydarzenia kalendarza przy użyciu plików w standardowym
+ formacie iCalendar (.ics).
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/mail/help.html b/doc/en/context/pl/mail/help.html
new file mode 100644
index 000000000..b077aa2c4
--- /dev/null
+++ b/doc/en/context/pl/mail/help.html
@@ -0,0 +1,25 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Wiadomości wyświetlane w poczcie prywatnej są widoczne tylko dla Ciebie i
+ pojedynczego odbiorcy.
+ </dd>
+ <dt>Widok łączony</dt>
+ <dd>
+ Wybór opcji <b>Widok łączony</b> spowoduje wyświetlanie wszystkich rozmów w ciągłym
+ wątku. Dostępne rozmowy są wyświetlane poniżej menu w panelu bocznym.
+ </dd>
+ <dt>Skrzynka odbiorcza/nadawcza</dt>
+ <dd>
+ Poszczególne wysłane wiadomości można wyświetlić, wybierając opcję
+ <b>Skrzynka nadawcza</b>, a wiadomości przychodzące - za pomocą filtru
+ <b>Skrzynka odbiorcza</b>.
+ </dd>
+ <dt>Nowa wiadomość</dt>
+ <dd>
+ Poszczególne wiadomości mają raporty doręczenia, które można wyświetlić za
+ pomocą rozwijanego menu. Wysłane wiadomości można również odwołać, posługując
+ się tym samym menu, co może uniemożliwić odbiorcy przegląd takich wiadomości,
+ <i>jeśli jeszcze ich nie przeczytał</i>.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/network/help.html b/doc/en/context/pl/network/help.html
new file mode 100644
index 000000000..f6ba75241
--- /dev/null
+++ b/doc/en/context/pl/network/help.html
@@ -0,0 +1,36 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Strona strumienia sieciowego wyświetla strumień wpisów i rozmów, zwykle
+ uporządkowanych według ostatnio zaktualizowanych. Jest to strona wysoce konfigurowalna.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#profile-jot-wrapper", 0);
+ return false;' title="Kliknij, aby podświetlić element...">Tworzenie wpisu</a></dt>
+ <dd>
+ U góry strony znajduje się pole tekstowe z napisem "Udostępnij". Kliknięcie
+ tego pola otwiera nowy edytor wpisów. Edytor wpisów można dostosowywać, ale
+ podstawowy edytor udostępnia pola dla treści wpisu i opcjonalnego <b>tytułu</b>.
+ Przyciski poniżej obszaru tekstowego po lewej stronie zapewniają skróty do
+ formatowania tekstu i wstawiania linków, obrazów i innych danych do wpisu.
+ Przyciski po prawej stronie zapewniają podgląd wpisu, ustawienia uprawnień do
+ publikowania oraz przycisk <b>Prześlij</b> do wysłania wpisu.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 1);
+ return false;' title="Kliknij, aby podświetlić element...">Grupy prywatności</a></dt>
+ <dd>
+ Utworzone grupy prywatności są wyświetlane w panelu bocznym. Wybranie ich
+ powoduje filtrowanie wpisów do tych utworzonych przez kanały w wybranej grupie.
+ </dd>
+ <dt><a href='#' onclick='$("#dbtn-acl").click(); return false;'
+ title="Kliknij, aby podświetlić element...">Uprawnienia do wpisu</a></dt>
+ <dd>
+ Lista kontroli dostępu (ACL) służy do określania, kto może zobaczyć Twój nowy
+ wpis. Naciśnięcie przycisku ACL obok przycisku Prześlij spowoduje wyświetlenie
+ okna dialogowego, w którym możesz wybrać kanały albo grupy prywatności, które
+ będą widzieć wpis. Możesz także wybrać, komu wyraźnie odmówiono dostęp.
+ Załóżmy na przykład, że planujesz przyjęcie niespodziankę dla znajomego.
+ Możesz wysłać zaproszenie do wszystkich w swojej grupie <b>Znajomi</b>
+ <i>oprócz</i> znajomego, którego zaskakujesz. W tym przypadku "pokazujesz"
+ go grupie <b>Znajomi</b>, ale "nie pokazujesz" tej jednej osobie.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/photos/help.html b/doc/en/context/pl/photos/help.html
new file mode 100644
index 000000000..e9ff7ee9d
--- /dev/null
+++ b/doc/en/context/pl/photos/help.html
@@ -0,0 +1,15 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Na tej stronie wyświetlane są albumy ze zdjęciami opublikowane w kanale.
+ Widoczność obrazów zależy od indywidualnych uprawnień odwiedzającego do tych zdjęć.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;'
+ title="Kliknij, aby podświetlić element...">Zakładki treści kanału</a></dt>
+ <dd>
+ Karty treści kanału to odnośniki do innych treści publikowanych przez kanał.
+ Karta <b>Informacje</b> prowadzi do profilu kanału. Karta <b>Zdjęcia</b>
+ prowadzi do galerii zdjęć kanału. Zakładka <b>Pliki</b> zawiera linki do
+ ogólnych plików udostępnionych w kanale.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/profile/help.html b/doc/en/context/pl/profile/help.html
new file mode 100644
index 000000000..9ec5b0e73
--- /dev/null
+++ b/doc/en/context/pl/profile/help.html
@@ -0,0 +1,17 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ To jest strona profilu kanału. Zwykle wyświetla informacje opisujące kanał.
+ Jeśli na przykład kanał reprezentuje osobę w sieci społecznościowej, profil
+ może zawierać informacje kontaktowe i inne dane osobowe tej osoby. Kanały mogą
+ mieć wiele profili, przy czym wyświetlany profil zależy od obserwatora.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;'
+ title="Klknij, aby podświetlić element...">Zakładki treści kanału</a></dt>
+ <dd>
+ Karty treści kanału to odnośniki do innych treści publikowanych przez kanał.
+ Karta <b>Informacje</b> prowadzi do profilu kanału. Karta <b>Zdjęcia</b>
+ prowadzi do galerii zdjęć kanału. Zakładka <b>Pliki</b> zawiera linki do ogólnych
+ plików opublikowanych i udostępnionych w kanale.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/profiles/help.html b/doc/en/context/pl/profiles/help.html
new file mode 100644
index 000000000..874303908
--- /dev/null
+++ b/doc/en/context/pl/profiles/help.html
@@ -0,0 +1,49 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Po zarejestrowaniu <i>konta</i> w matrycy, utworzony został również
+ <i>profil</i> i <i>kanał</i>.
+ </dd>
+ <dt>Konto</dt>
+ <dd>
+ Masz teraz <i>jedno</i> konto. Składa się z Twojego adresu e-mail i
+ hasła. Za pomocą swojego konta uzyskujesz dostęp do profili i kanałów.
+ <i>Pomyśl o swoim koncie jak o sposobie uwierzytelniania w jednym
+ serwisie Hubzilla. To pozwala wykonywać różne czynności, takie jak
+ tworzenie profili i kanałów, za pomocą których można łączyć się z
+ innymi osobami.</i>
+ </dd>
+ <dt>Profil</dt>
+ <dd>
+ Z pewnością już zarejestrowałeś/zarejestrowałaś się w innych usługach
+ internetowych, takich jak fora lub społeczności internetowe. W nich
+ wszystkich trzeba było podać pewne informacje o sobie, takie jak data
+ urodzenia, kraj, wiek i upodobania. W przeciwieństwie do nich
+ usługi Hubzilla daje Ci przewagę tworzenia <i>wielu profili </i>.
+ W ten sposób możesz rozróżniać profil przeznaczone specjalnie dla
+ wszystkich (Twój profil publiczny), od profili przeznaczonych dla
+ współpracowników, rodziny czy partnera. <i> Potraktuj swój profil
+ jak pojemnik zawierający podstawowe informacje o Tobie, jakie
+ przekazujesz innym osobom. </i>
+ </dd>
+ <dt>Kanał</dt>
+ <dd>
+ Podczas rejestracji utworzyłeś/utworzyłaś swój pierwszy <i>kanał</i>.
+ Tak, poza kilkoma profilami, również możesz mieć kilka kanałów. Na
+ początku może to być nieco zagmatwane, ale wyjaśnijmy to. Już masz
+ utworzony jeden kanał. Możesz używać go do publicznego komunikowania
+ się z osobami w życiu codziennym. Lecz być może jesteś zapalonym
+ czytelnikiem książek a wielu ludzi się tym nudzi. Otwierasz więc
+ <i>drugi kanał</i> dla miłośników książek, gdzie wszyscy mogą rozmawiać
+ o książkach tyle, ile zechcą. Oczywiście jest to nowy strumień wpisów,
+ z nowym profilem (... lub nowymi profilami) i zupełnie z innymi
+ kontaktami. Niektóre połączenia mogą istnieć w obu kanałach, ale będą
+ takie, które będą występować wyłącznie w jednym z nich. Ty po prostu
+ przełączaj się między nimi tak, jak w prawdziwym życiu, gdy rozmawiasz
+ z ludźmi, których spotykasz na ulicy lub z osobami, które spotykasz
+ specjalnie, aby porozmawiać o książkach. Możesz nawet połączyć się
+ ze sobą lub lepiej: ze swoim innym kanał. :) <i> Pomyśl o kanałach
+ jak o różnych przestrzeniach poświęconych różnym tematom, w których
+ spotykasz się z różnymi osobami.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/register/help.html b/doc/en/context/pl/register/help.html
new file mode 100644
index 000000000..c5c879e36
--- /dev/null
+++ b/doc/en/context/pl/register/help.html
@@ -0,0 +1,54 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Na tej stronie odwiedzający mogą zarejestrować się, aby uzyskać dostęp do
+ portalu za pomocą identyfikatora logowania. Zalogowani użytkownicy nie tylko
+ widzą treści publiczne, ale mogą je sami publikować, komunikować się w sieciach
+ społecznościowych i nie tylko.
+ </dd>
+ <dt>Tryby rejestracji</dt>
+ <dd>
+ Rejestracja jest możliwa na adres e-mail lub anonimowo, jeśli regulamin portalu
+ to dopuszcza (wówczas nie wypełniaj pola e-mail). Możliwe, że masz również
+ kod zaproszenia, który trzeba wprowadzić wraz z adresem e-mail. Link nad polem
+ e-mail umożliwia wprowadzenie kodu zaproszenia. Ustaw też swoje hasło logowania.
+ Musisz podać go dwukrotnie. Nie jest ono jawnie wyświetlane w formularzu, więc
+ uważaj przy jego wprowadzaniu.
+ </dd>
+ <dt>Procedura rejestracji</dt>
+ <dd>
+ Aby zalogować się po udanej rejestracji, należy ustawić osobne hasło.
+ Ze względów bezpieczeństwa wprowadź je dwukrotnie z identycznymi wartościami.
+ Zarejestrowani anonimowo użytkownicy otrzymują automatycznie przypisywany identyfikator
+ i nie powinni zapomnieć własnego hasła, ponieważ w przeciwieństwie do rejestracji
+ adresem e-mail początkowo nie ma funkcji resetowania. W zależności od konfiguracji
+ portalu może być wymagana funkcja potwierdzenia. Użytkownicy rejestracji
+ przy użyciu adresu e-mail otrzymają odpowiednią wiadomość. W przypadku rejestracji
+ anonimowych zostanie wyświetlone inne okno dialogowe zawierające identyfikator
+ dostępu i kod PIN. Dane z tej strony powinny być przechowywana bezpiecznie i przez
+ długi czas (np. przez wydruk, zrzut ekranu, zdjęcie), ponieważ dane muszą zostać
+ ponownie potwierdzone w późniejszym czasie.
+ </dd>
+ <dt>Tożsamość cyfrowa</dt>
+ <dd>
+ W zależności od portalu, wyświetlaną nazwę (imię i nazwisko) oraz pseudonim można
+ wprowadzić już podczas rejestracji (alternatywnie również podczas pierwszego logowania).
+ Pseudonim ma bardzo ważne znaczenie i nie można go później zmienić. Jest to unikalna
+ tożsamość cyfrowa (Digital Identity, DID), która jest, będzie i pozostanie powiązana
+ ze wszystkimi naszymi działaniami. Ten DID nadaje się nie tylko do logowania na
+ tym portalu, ale także do wszystkich połączonych portali sieci federacyjnej.
+ W języku sieci federacyjnych ta tożsamość cyfrowa jest "kanałem".
+ Jest to porównywalne z numerem telefonu w sieci telefonicznej. DID ma format
+ kanał@portal.tld = pseudonim@portal.tld i jak wspomniano, nie można go później
+ zmienić. Chociaż format wygląda jak adres e-mail, tak nie jest.
+ </dd>
+ <dt>Nim rozpoczniesz rejestrację ...</dt>
+ <dd>
+ ... należy wybrać preferowany język (na przykład polski, angielski, hiszpański,
+ niemiecki) (w prawym górnym rogu menu hamburgera <span class = "fa fa-fw fa-bars"> </span>).
+ Aktualny język jest używany w kolejnych krokach, a także podczas logowania i po
+ zalogowaniu. Można to jednak zmienić w dowolnym momencie i w razie potrzeby.
+ Należy również zauważyć, że ten portal nie jest jedyny. Przegląd innych portali
+ można znaleźć <a href="./pubsites"> tutaj </a>.
+ </dd>
+</dl>
diff --git a/doc/en/context/pl/settings/account/help.html b/doc/en/context/pl/settings/account/help.html
new file mode 100644
index 000000000..dfe82f025
--- /dev/null
+++ b/doc/en/context/pl/settings/account/help.html
@@ -0,0 +1,49 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Po zarejestrowaniu <i>konta</i> w matrycy, utworzony został również
+ <i>profil</i> i <i>kanał</i>.
+ </dd>
+ <dt>Konto</dt>
+ <dd>
+ Masz teraz <i>jedno</i> konto. Składa się z Twojego adresu e-mail i
+ hasła. Za pomocą swojego konta uzyskujesz dostęp do profili i kanałów.
+ <i>Pomyśl o swoim koncie jak o sposobie uwierzytelniania w jednym
+ serwisie Hubzilla. To pozwala wykonywać różne czynności, takie jak
+ tworzenie profili i kanałów, za pomocą których można łączyć się z
+ innymi osobami.</i>
+ </dd>
+ <dt>Profil</dt>
+ <dd>
+ Z pewnością już zarejestrowałeś/zarejestrowałaś się w innych usługach
+ internetowych, takich jak fora lub społeczności internetowe. W nich
+ wszystkich trzeba było podać pewne informacje o sobie, takie jak data
+ urodzenia, kraj, wiek i upodobania. W przeciwieństwie do nich
+ usługi Hubzilla daje Ci przewagę tworzenia <i>wielu profili </i>.
+ W ten sposób możesz rozróżniać profil przeznaczone specjalnie dla
+ wszystkich (Twój profil publiczny), od profili przeznaczonych dla
+ współpracowników, rodziny czy partnera. <i> Potraktuj swój profil
+ jak pojemnik zawierający podstawowe informacje o Tobie, jakie
+ przekazujesz innym osobom. </i>
+ </dd>
+ <dt>Kanał</dt>
+ <dd>
+ Podczas rejestracji utworzyłeś/utworzyłaś swój pierwszy <i>kanał</i>.
+ Tak, poza kilkoma profilami, również możesz mieć kilka kanałów. Na
+ początku może to być nieco zagmatwane, ale wyjaśnijmy to. Już masz
+ utworzony jeden kanał. Możesz używać go do publicznego komunikowania
+ się z osobami w życiu codziennym. Lecz być może jesteś zapalonym
+ czytelnikiem książek a wielu ludzi się tym nudzi. Otwierasz więc
+ <i>drugi kanał</i> dla miłośników książek, gdzie wszyscy mogą rozmawiać
+ o książkach tyle, ile zechcą. Oczywiście jest to nowy strumień wpisów,
+ z nowym profilem (... lub nowymi profilami) i zupełnie z innymi
+ kontaktami. Niektóre połączenia mogą istnieć w obu kanałach, ale będą
+ takie, które będą występować wyłącznie w jednym z nich. Ty po prostu
+ przełączaj się między nimi tak, jak w prawdziwym życiu, gdy rozmawiasz
+ z ludźmi, których spotykasz na ulicy lub z osobami, które spotykasz
+ specjalnie, aby porozmawiać o książkach. Możesz nawet połączyć się
+ ze sobą lub lepiej: ze swoim innym kanał. :) <i> Pomyśl o kanałach
+ jak o różnych przestrzeniach poświęconych różnym tematom, w których
+ spotykasz się z różnymi osobami.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/settings/channel/help.html b/doc/en/context/pl/settings/channel/help.html
new file mode 100644
index 000000000..dfe82f025
--- /dev/null
+++ b/doc/en/context/pl/settings/channel/help.html
@@ -0,0 +1,49 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Po zarejestrowaniu <i>konta</i> w matrycy, utworzony został również
+ <i>profil</i> i <i>kanał</i>.
+ </dd>
+ <dt>Konto</dt>
+ <dd>
+ Masz teraz <i>jedno</i> konto. Składa się z Twojego adresu e-mail i
+ hasła. Za pomocą swojego konta uzyskujesz dostęp do profili i kanałów.
+ <i>Pomyśl o swoim koncie jak o sposobie uwierzytelniania w jednym
+ serwisie Hubzilla. To pozwala wykonywać różne czynności, takie jak
+ tworzenie profili i kanałów, za pomocą których można łączyć się z
+ innymi osobami.</i>
+ </dd>
+ <dt>Profil</dt>
+ <dd>
+ Z pewnością już zarejestrowałeś/zarejestrowałaś się w innych usługach
+ internetowych, takich jak fora lub społeczności internetowe. W nich
+ wszystkich trzeba było podać pewne informacje o sobie, takie jak data
+ urodzenia, kraj, wiek i upodobania. W przeciwieństwie do nich
+ usługi Hubzilla daje Ci przewagę tworzenia <i>wielu profili </i>.
+ W ten sposób możesz rozróżniać profil przeznaczone specjalnie dla
+ wszystkich (Twój profil publiczny), od profili przeznaczonych dla
+ współpracowników, rodziny czy partnera. <i> Potraktuj swój profil
+ jak pojemnik zawierający podstawowe informacje o Tobie, jakie
+ przekazujesz innym osobom. </i>
+ </dd>
+ <dt>Kanał</dt>
+ <dd>
+ Podczas rejestracji utworzyłeś/utworzyłaś swój pierwszy <i>kanał</i>.
+ Tak, poza kilkoma profilami, również możesz mieć kilka kanałów. Na
+ początku może to być nieco zagmatwane, ale wyjaśnijmy to. Już masz
+ utworzony jeden kanał. Możesz używać go do publicznego komunikowania
+ się z osobami w życiu codziennym. Lecz być może jesteś zapalonym
+ czytelnikiem książek a wielu ludzi się tym nudzi. Otwierasz więc
+ <i>drugi kanał</i> dla miłośników książek, gdzie wszyscy mogą rozmawiać
+ o książkach tyle, ile zechcą. Oczywiście jest to nowy strumień wpisów,
+ z nowym profilem (... lub nowymi profilami) i zupełnie z innymi
+ kontaktami. Niektóre połączenia mogą istnieć w obu kanałach, ale będą
+ takie, które będą występować wyłącznie w jednym z nich. Ty po prostu
+ przełączaj się między nimi tak, jak w prawdziwym życiu, gdy rozmawiasz
+ z ludźmi, których spotykasz na ulicy lub z osobami, które spotykasz
+ specjalnie, aby porozmawiać o książkach. Możesz nawet połączyć się
+ ze sobą lub lepiej: ze swoim innym kanał. :) <i> Pomyśl o kanałach
+ jak o różnych przestrzeniach poświęconych różnym tematom, w których
+ spotykasz się z różnymi osobami.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/settings/features/help.html b/doc/en/context/pl/settings/features/help.html
new file mode 100644
index 000000000..fc5a62363
--- /dev/null
+++ b/doc/en/context/pl/settings/features/help.html
@@ -0,0 +1,50 @@
+<dl class="dl-horizontal">
+ <dt>Informacje ogólne</dt>
+ <dd>
+ Ta strona umożliwia skonfigurowanie ustawień dla wielu dodatkowych funkcji Hubzilli, które możesz włączyć na swoim koncie.
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#calendar_settings">Kalendarz</a></dt>
+ <dd>
+ Są to dodatkowe opcje, które możesz włączyć dla wszystkich swoich kalendarzy.
+ Można to zmienić indywidualnie w każdym kalendarzu.<br />
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#channel_main_page_settings">Strona główna kanału</a></dt>
+ <dd>
+ Kilka dodatkowych możliwości związanych ze stroną główną kanału.
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#connections_settings">Połączenia</a></dt>
+ <dd>
+ Obecnie jest tu tylko ustawienie opcji umożliwiającej filtrowanie strumienia wg
+ słów kluczowych lub treści (fraz).
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#conversation-settings">Rozmowa</a></dt>
+ <dd>
+ Kilka dodatkowych opcji rozszerzających obsługę rozmów i dyskusji.
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#directoty_settings">Katalog</a></dt>
+ <dd>
+ Dostępna tu opcja zaawansowanego przeszukiawania katalogu może być bardzo użyteczna
+ dla osób chcących dotrzeć do konkretnych informacji publikowanych w sieci Hubzilla.
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#manage_settings">Zarządzanie</a></dt>
+ <dd>
+ Dostępna tu opcja włącza funkcję zmiany kanału bezpośrednio z rozwijanego menu nawigacji.
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#network-settings">Sieć</a></dt>
+ <dd>
+ Znajduje się tu szereg opcji włączających funkcje związane z siecią i strumieniem
+ sieciowym. Przede wszystkim dostępnych jest tu kilka dodatkowych filtrów i inne
+ użyteczne funkcje. Szczegóły można znaleźć dokumentacji.
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#photos_settings">Zdjęcia</a></dt>
+ <dd>
+ Tutaj można włączyć funkcję wyświetlania na mapie lokalizacji zdjęcia, jeśli
+ polik zdjęcia zawiera potrzebne metadane.
+ </dd>
+ <dt><a href="/help/pl/feature/additional/overview#profiles_settings">Profile</a></dt>
+ <dd>
+ W tej sekcji zawarte są opcje włączające dodatkowe funkcje dotyczące profilu.
+ Jeśli chcesz i możesz zakładać na swoim koncie wiele profili (i tożsamości),
+ włącz tu opcję "wiele profili".
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/settings/tokens/help.html b/doc/en/context/pl/settings/tokens/help.html
new file mode 100644
index 000000000..4c79841d6
--- /dev/null
+++ b/doc/en/context/pl/settings/tokens/help.html
@@ -0,0 +1,43 @@
+<dl class="dl-horizontal">
+ <dt><a href="/help/member/member_guide#Tokeny_dost_pu_go_cia">Tokeny dostępu gościa</a></dt>
+ <dd>
+ Aby ułatwić udostępnianie prywatnych zasobów osobom niebędących członkami
+ tego portalu lub sfederyzowanych portali (hubów) i zapewnić zabezpieczone
+ wykrywaniem danych identyfikacyjnych, Hubzilla posiada mechanizm tworzenia
+ i zarządzania tymczasowymi ("jednorazowymi") loginami, zwanymi "tokenami
+ dostępu Zot”. Tokeny te, będące swojego rodzaju danymi uwierzytelniającymi,
+ mogą być używane do uwierzytelniania w serwisie Hubzilla wyłącznie w celu
+ uzyskania dostępu do uprzywilejowanych lub kontrolowanych zasobów (pliki,
+ zdjęcia, wpisy, strony internetowe, pokoje rozmów itp.).
+ </dd>
+ <dt>Utworzenie tokenu</dt>
+ <dd>
+ Formularz do tworzenia i edycji akceptuje trzy parametry: czytelną dla
+ człowieka nazwę, hasło lub token dostępu oraz opconalną okres ważności.
+ Po wygaśnięciu token dostępu nie jest już ważny, nie może być już używany
+ i będzie automatycznie usunięte z listy kont tymczasowych. Pole hasła
+ w formularzach tworzenia i edycji wyświetla tekst tokenu dostępu, a nie
+ zasłonięte hasło.
+ </dd>
+ <dt>Udostępnienie tokenu</dt>
+ <dd>
+ Nie jest narzucony sposób udostępniania tych tokenów innym osobom. Można
+ użyć dowolnej metody komunikacji. Wszystkie utworzone tokeny są dodawane
+ do selektora listy kontroli dostępu i mogą być używane wszędzie tam, gdzie
+ są dostępne listy kontroli dostępu.
+
+ <b>Przykład</b>: Odwiedzający nawiguje w przeglądarce do Twojąej witryny.
+ Ma podany przez Ciebie token dostępu i próbuje odwiedzić jeden z Twoich
+ albumów ze zdjęciami (który jest ograniczony do przeglądania tylko przez
+ Ciebie i jedną tymczasową tożsamość). Odmowa dostępu.
+
+ Odwiedzający wybiera teraz opcję „Zaloguj się” z paska nawigacji menu.
+ To wyświetli stronę logowania. Wpisuje tam nazwę i hasło, które podałeś
+ i może teraz przeglądać zabezpieczony album ze zdjęciami.
+
+ Alternatywnie możesz udostępnić łącze do chronionego pliku, dodając parametr
+ "&zat=abc123" do adresu URL, gdzie ciąg "abc123" to token dostępu lub
+ hasło do tymczasowego logowania. Nie są wymagane dalsze negocjacje
+ a żądany zasób zostanie wyświetlony.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/webpages/help.html b/doc/en/context/pl/webpages/help.html
new file mode 100644
index 000000000..64858fcf6
--- /dev/null
+++ b/doc/en/context/pl/webpages/help.html
@@ -0,0 +1,24 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Możesz tworzyć modułowe, rozpoznające tożsamość witryny internetowe, składające
+ się z elementów, które można udostępniać.
+ </dd>
+ <dt>Strony</dt>
+ <dd>
+ Tutaj znajduje się lista Twoich "stron" z przypisanymi adresami URL,
+ pod którymi osoby mogą je odwiedzać. Struktura stron jest zwykle opisywana
+ przez powiązany <b>układ</b>, a ich zawartość jest tworzona ze zbioru <b>bloków</b>.
+ </dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1);
+ return false;' title="Click to highlight element...">Narzędzia do przenoszenia stron internetowych</a></dt>
+ <dd>
+ Narzędzia do przenoszenia witryn umożliwiają importowanie i eksportowanie wielu
+ elementów strony internetowej (stron, układów, bloków). Możesz <b>zaimportować</b>
+ te alementy albo z przesłanego pliku ZIP, albo z istniejącego folderu plików
+ w chmurze. Możesz je <b>wyeksportować</b> do pliku zip zawierającego wybraną
+ grupę elementów strony internetowej w formie zgodnej z narzędziem do importowania
+ lub możesz wyeksportować bezpośrednio do folderu plików w chmurze.
+ <a target="_blank" href="help/webpages"> Czytaj więcej ... </a>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/pl/wiki/help.html b/doc/en/context/pl/wiki/help.html
new file mode 100644
index 000000000..6aa6a7192
--- /dev/null
+++ b/doc/en/context/pl/wiki/help.html
@@ -0,0 +1,29 @@
+<dl class="dl-horizontal">
+ <dt>Ogólne</dt>
+ <dd>
+ Każda wiki to zbiór stron utworzonych jako pliki tekstowe w formacie Markdown.
+ </dd>
+ <dt>Wykaz Wiki</dt>
+ <dd>
+ Strony wiki należące do kanału, <i>do przeglądania którego masz uprawnienia</i>,
+ są wymienione w panelu bocznym.
+ </dd>
+ <dt>Historia strony</dt>
+ <dd>
+ Zapisywana jest każda wersja strony, aby umożliwić szybkie przywrócenie.
+ Kliknij kartę <b>Historia</b>, aby wyświetlić historię zmian strony, w tym
+ datę i autora każdej z nich. Przycisk przywróć załaduje wybraną wersję, ale
+ nie zapisze automatycznie strony.
+ </dd>
+ <dt>Strony</dt>
+ <dd>
+ Lista stron wiki znajduje się w panelu <b>Strony Wiki</b>. Przed zapisaniem
+ zmian na stronie za pomocą rozwijanego menu <b>Strona</b> można
+ <a href = '#' onclick = 'contextualHelpFocus ("# id_commitMsg", 0);
+ return false; ' title = "Kliknij, aby podświetlić element ...">wprowadzić
+ własny komunikat</a>, który będzie wyświetlany w
+ <a href = '#' onclick = 'contextualHelpFocus ("# wiki-get-history", 0);
+ return false; ' title = "Kliknij, aby podświetlić element ..."><b> Historii
+ strony</b> przeglądarki </a> wraz z wersją.
+ </dd>
+</dl>
diff --git a/doc/en/context/ru/cards/help.html b/doc/en/context/ru/cards/help.html
new file mode 100644
index 000000000..ccdf9d6d9
--- /dev/null
+++ b/doc/en/context/ru/cards/help.html
@@ -0,0 +1,16 @@
+<dl class="dl-horizontal"><dt>Резюме</dt>
+ <dd>Карточки используются для командной работы в виртуальном пространстве дополнительно к ленте сообщений. Карточки являются болле компактными по сравнению с веб-страницами и вики и предназначены для быстрой организации работы. Преимущество карточек в возможности совместной работы и комментирования. Карточки могут помочь организовать и упростить работу, связанную с частыми изменениями и с обсуждением в проекте.
+ </dd>
+ <dt>Добавить карточку</dt>
+ <dd>
+ Создание новой карточки подобно написанию нового поста.<br /><br /><ul><li>
+ <b>Имя ссылки для веб-страницы</b>: Имя ссылки для веб-страницы - это имя карточки для статической URL
+ </li>
+ <li>
+ <b>Заголовок</b>: Текст заголовка карточки
+ </li>
+ <li>
+ <b>Категории</b>: Если <a href="/settings/features">Инструмент "Категории сообщения"</a> в вашем канале разрешён, то вы можете присвоить карточке определённую категорию. Эта категория появится в списке <b>Категорий</b> в левой колонке и разрешает быстрый выбор записей определённой категории из картотеки одним щёлчком мышки.
+ </li>
+ </ul></dd>
+</dl>
diff --git a/doc/en/context/ru/connections/help.html b/doc/en/context/ru/connections/help.html
new file mode 100644
index 000000000..6c9b9a0e9
--- /dev/null
+++ b/doc/en/context/ru/connections/help.html
@@ -0,0 +1,7 @@
+<dl class="dl-horizontal">
+ <dd>На этой странице отображается список всех подключений этого канала. Список можно отсортировать и отфильтровать с помощью кнопки <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Нажмите чтобы выделить элемент..."><button class='btn btn-outline-secondary btn-sm'><i class="fa fa-filter"></i></button></a> рядом с кнопкой поиска.</dd>
+ <dt>Сведения о контакте</dt>
+ <dd>Каждая запись в списке показывает информацию о конкретном контакте. Полупрозрачное изображение профиля указывает на заархивированное соединение.</dd>
+ <dt>Статус контакта</dt>
+ <dd>Контакт может находиться в разных состояниях: <ul><li>Заархивирован</li><li>Игнорируется</li><li>Заблокирован</li><li>Скрыт</li></ul></dd>
+</dl> \ No newline at end of file
diff --git a/doc/en/context/ru/network/help.html b/doc/en/context/ru/network/help.html
new file mode 100644
index 000000000..19b5452e2
--- /dev/null
+++ b/doc/en/context/ru/network/help.html
@@ -0,0 +1,9 @@
+<dl class="dl-horizontal">
+ <dd>Здесь отображается поток сообщений и бесед, обычно упорядоченных по последнему обновлению. Данная страница имеет гибкие настройки.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#profile-jot-wrapper", 0); return false;' title="Нажмите чтобы выделить элемент...">Создать заметку</a></dt>
+ <dd>В верхней части страницы есть текстовое поле с надписью "Поделиться". Нажатие на это поле открывает редактор сообщений. Внешний ид редактора сообщений настраивается, однако по умолчанию редактор имеет поля для текста заметки и необязательного поля "Заголовок". Кнопки под полем для ввода текста слева служат для форматирования текста, вставки ссылок, изображений и других данных. Кнопки справа обеспечивают предварительный просмотр сообщения, настройку разрешений для публикации и кнопку <button class='btn btn-outline-secondary btn-sm'>Отправить</button> для её отправки.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 1); return false;' title="Нажмите чтобы выделить элемент...">Группы конфиденциальности</a></dt>
+ <dd>Созданные вами группы конфиденциальности отображаются на боковой панели. Их выбор фильтрует сообщения по публикациям, которые созданы каналами в выбранной группе.</dd>
+ <dt><a href='#' onclick='$("#dbtn-acl").click(); return false;' title="Нажмите чтобы выделить элемент...">Разрешения публикации</a></dt>
+ <dd>Список контроля доступа (ACL) используется для того, чтобы указать, кто будет видеть вашу новую публикацию. При нажатии кнопки ACL рядом с кнопкой <button class='btn btn-outline-secondary btn-sm'>Поделиться</button> появится диалоговое окно, в котором вы можете выбрать, какие каналы и / или группы конфиденциальности могут видеть сообщение. Вы также можете выбрать, кому явно отказано в доступе. Например, вы планируете сюрприз для друга. Вы можете отправить сообщение с приглашением всем в вашей группе "Друзья" <i>кроме</i> друга, которого вы хотите поздравить. В этом случае публикацию увидят все члены группы "Друзья", кроме этого человека.</dd>
+</dl>
diff --git a/doc/en/database.bb b/doc/en/database.bb
new file mode 100644
index 000000000..a0c1e8841
--- /dev/null
+++ b/doc/en/database.bb
@@ -0,0 +1,71 @@
+[h2]Database updates[/h2]
+
+In the [observer.baseurl]/admin/dbsync page the administrator can check if any update was not successful and, if so, retry it.
+
+If an update has failed but doesn't register as failed for some reason, the administrator can attempt to re-execute the update. For example for DB update #1999, by visiting the webpage:
+
+https://hubzilla.com.bradmin/dbsync/1999
+
+
+[h2]Database Tables[/h2][table border=1][tr][th]Table[/th][th]Description[/th][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_abconfig]abconfig[/zrl][/td][td]arbitrary storage for connections of local channels[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_abook]abook[/zrl][/td][td]connections of local channels[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_account]account[/zrl][/td][td]service provider account[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_addon]addon[/zrl][/td][td]registered plugins[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_app]app[/zrl][/td][td]personal app data[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_attach]attach[/zrl][/td][td]file attachments[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_auth_codes]auth_codes[/zrl][/td][td]OAuth usage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_cache]cache[/zrl][/td][td]OEmbed cache[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_cal]cal[/zrl][/td][td]CalDAV containers for events[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_channel]channel[/zrl][/td][td]local channels[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_chat]chat[/zrl][/td][td]chat room content[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_chatpresence]chatpresence[/zrl][/td][td]channel presence information for chat[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_chatroom]chatroom[/zrl][/td][td]data for the actual chat room[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_clients]clients[/zrl][/td][td]OAuth usage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_config]config[/zrl][/td][td]main configuration storage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_conv]conv[/zrl][/td][td]Diaspora private messages meta conversation structure[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_event]event[/zrl][/td][td]Events[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_pgrp_member]pgrp_member[/zrl][/td][td]privacy groups (collections), group info[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_pgrp]pgrp[/zrl][/td][td]privacy groups (collections), member info[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_hook]hook[/zrl][/td][td]plugin hook registry[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_hubloc]hubloc[/zrl][/td][td]xchan location storage, ties a hub location to an xchan[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_iconfig]iconfig[/zrl][/td][td]extensible arbitrary storage for items[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_issue]issue[/zrl][/td][td]future bug/issue database[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_item]item[/zrl][/td][td]all posts and webpages[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_item_id]item_id[/zrl][/td][td](deprecated by iconfig) other identifiers on other services for posts[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_likes]likes[/zrl][/td][td]likes of 'things'[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_mail]mail[/zrl][/td][td]private messages[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_menu]menu[/zrl][/td][td]webpage menu data[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_menu_item]menu_item[/zrl][/td][td]entries for webpage menus[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_notify]notify[/zrl][/td][td]notifications[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_obj]obj[/zrl][/td][td]object data for things (x has y)[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_outq]outq[/zrl][/td][td]output queue[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_pconfig]pconfig[/zrl][/td][td]personal (per channel) configuration storage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_photo]photo[/zrl][/td][td]photo storage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_poll]poll[/zrl][/td][td]data for polls[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_poll_elm]poll_elm[/zrl][/td][td]data for poll elements[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_profdef]profdef[/zrl][/td][td]custom profile field definitions[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_profext]profext[/zrl][/td][td]custom profile field data[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_profile]profile[/zrl][/td][td]channel profiles[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_profile_check]profile_check[/zrl][/td][td]DFRN remote auth use, may be obsolete[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_register]register[/zrl][/td][td]registrations requiring admin approval[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_session]session[/zrl][/td][td]web session storage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_shares]shares[/zrl][/td][td]shared item information[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_sign]sign[/zrl][/td][td]Diaspora signatures. To be phased out.[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_site]site[/zrl][/td][td]site table to find directory peers[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_source]source[/zrl][/td][td]channel sources data[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_sys_perms]sys_perms[/zrl][/td][td]extensible permissions for OAuth[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_term]term[/zrl][/td][td]item taxonomy (categories, tags, etc.) table[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_tokens]tokens[/zrl][/td][td]OAuth usage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_updates]updates[/zrl][/td][td]directory sync updates[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_verify]verify[/zrl][/td][td]general purpose verification structure[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_vote]vote[/zrl][/td][td]vote data for polls[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xchan]xchan[/zrl][/td][td]list of known channels in the universe[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xchat]xchat[/zrl][/td][td]bookmarked chat rooms[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xconfig]xconfig[/zrl][/td][td]as pconfig but for channels with no local account[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xign]xign[/zrl][/td][td]channels ignored by friend suggestions[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xlink]xlink[/zrl][/td][td]"friends of friends" linkages derived from poco, also ratings storage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xperm]xperm[/zrl][/td][td]OAuth/OpenID-Connect extensible permissions permissions storage[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xprof]xprof[/zrl][/td][td]if this hub is a directory server, contains basic public profile info of everybody in the network[/td][/tr]
+[tr][td][zrl=[baseurl]/help/database/db_xtag]xtag[/zrl][/td][td]if this hub is a directory server, contains tags or interests of everybody in the network[/td][/tr]
+[/table]
diff --git a/doc/en/database/db_abook.bb b/doc/en/database/db_abook.bb
new file mode 100644
index 000000000..a346480d7
--- /dev/null
+++ b/doc/en/database/db_abook.bb
@@ -0,0 +1,55 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]abook_id[/td][td]Sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]abook_account[/td][td]account.account_id of the channel which owns this record[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]abook_channel[/td][td]channel.channel_id of the channel which owns this record[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]abook_xchan[/td][td]xchan.xchan_hash of the target identity (this channel's connection)[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]abook_my_perms[/td][td]bitfield of all specific permissions granted this connection[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_their_perms[/td][td]bitfield of all permissions granted to you by this connection[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_closeness[/td][td]"closeness" value for optional affinity tool, 0-99[/td][td]tinyint(3) unsigned[/td][td]NO[/td][td]MUL[/td][td]99[/td][td]
+[/td][/tr]
+[tr][td]abook_created[/td][td]Datetime this record was created[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]abook_updated[/td][td]Datetime this record was modified[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]abook_connected[/td][td]datetime of last successful "poll" for this connection[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]abook_dob[/td][td]Datetime of connection's birthday converted from *their* timezone to UTC[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]abook_flags[/td][td]No longer used[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_profile[/td][td]profile.guid of profile to display to this connection if authenticated[/td][td]char(64)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]abook_blocked[/td][td]Bi-directional communications with this channel are blocked, regardless of other permissions. [/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_ignored[/td][td]Incoming communications from this channel are blocked, regardless of other permissions. [/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_hidden[/td][td]This connection will not be shown as a connection to anybody but the channel owner[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_archived[/td][td]This connection is likely non-functioning and the entry and conversations are preserved, but further polled communications will not be attempted. [/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_pending[/td][td]A connection request was received from this channel but has not been approved by the channel owner, public communications may still be visible but no additional permissions have been granted. [/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_unconnected[/td][td]currently unused. Projected usage is to indicate "one-way" connections which were insitgated on this end but are still pending on the remote end. [/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_self[/td][td]is a special case where the owner is the target. Every channel has one abook entry with abook_self and with a target abook_xchan set to channel.channel_hash . When this flag is present, abook_my_perms is the default permissions granted to all new connections and several other fields are unused.[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_feed[/td][td]indicates this connection is an RSS/Atom feed and may trigger special handling.[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_incl[/td][td]connection filter allow rules separated by LF[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_excl[/td][td]connection filter deny rules separated by LF[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]abook_instance[/td][td]comma separated list of site urls of all channel clones that this connection is connected with (used only for singleton networks which don't support cloning)[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_account.bb b/doc/en/database/db_account.bb
new file mode 100644
index 000000000..35d7a9eb3
--- /dev/null
+++ b/doc/en/database/db_account.bb
@@ -0,0 +1,66 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]account_id[/td][td]table index[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]account_parent[/td][td]for hierarchical accounts, the account_id of the parent to this one, if account_parent = account_id, this is the top level account[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]account_default_channel[/td][td]channel_id of channel to connect on login[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]account_salt[/td][td]complexity token for account_password[/td][td]char(32)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]account_password[/td][td]hashed password for this account[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]account_email[/td][td]essentially the login ID, although it is usually possible to login with a channel address[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]account_external[/td][td]Currently unused[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]account_language[/td][td]default language (closest available browser-accept language when account was created)[/td][td]char(16)[/td][td]NO[/td][td][/td][td]en[/td][td]
+[/td][/tr]
+[tr][td]account_created[/td][td]timestamp of account creation[/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]account_lastlog[/td][td]timestamp of last login (or daily update if "remember me" is in effect)[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]account_flags[/td][td]see notes[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]account_roles[/td][td]see notes[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]account_reset[/td][td]verification token for password reset[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]account_expires[/td][td]timestamp when account expires and will be deleted[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]account_expire_notified[/td][td]timestamp of last warning of account expiration[/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]account_service_class[/td][td]service class for this account, determines what if any limits/restrictions are in place[/td][td]char(32)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]account_level[/td][td]future use[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]account_password_changed[/td][td]timestamp of last password change - to limit account deletion for 48 hours to prevent malicious activity[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Notes:
+
+
+
+/**
+ * Account Flags
+ */
+
+define ( 'ACCOUNT_OK', 0x0000 );
+define ( 'ACCOUNT_UNVERIFIED', 0x0001 );
+define ( 'ACCOUNT_BLOCKED', 0x0002 );
+define ( 'ACCOUNT_EXPIRED', 0x0004 );
+define ( 'ACCOUNT_REMOVED', 0x0008 );
+define ( 'ACCOUNT_PENDING', 0x0010 );
+
+/**
+ * Account roles
+ */
+
+define ( 'ACCOUNT_ROLE_SYSTEM', 0x0002 ); // 2 - this is the special system account
+define ( 'ACCOUNT_ROLE_DEVELOPER', 0x0004 );
+define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 ); // 4096 - this account is an administrator
+
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_addon.bb b/doc/en/database/db_addon.bb
new file mode 100644
index 000000000..bccd295f5
--- /dev/null
+++ b/doc/en/database/db_addon.bb
@@ -0,0 +1,24 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td]generated index[td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]aname[/td][td]plugin base (file)name[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]version[/td][td]currently unused[/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]installed[/td][td]currently always 1[/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]hidden[/td][td]currently unused[/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]tstamp[/td][td]file timestamp to check for reloads[/td][td]bigint(20)[/td][td]NO[/td][td][/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]plugin_admin[/td][td]1 = has admin config, 0 = has no admin config[/td][td]tinyint(1)[/td][td]NO[/td][td][/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Notes:
+
+These are addons which have been enabled by the site administrator on the admin/plugin page
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_app.bb b/doc/en/database/db_app.bb
new file mode 100644
index 000000000..09df473ee
--- /dev/null
+++ b/doc/en/database/db_app.bb
@@ -0,0 +1,48 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]generated index[/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]app_id[/td][td]hash identifying this app[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_sig[/td][td]currently unused[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_author[/td][td]xchan_hash of app creator[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_name[/td][td]name of app[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_desc[/td][td]optional description of app[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]app_url[/td][td]target_url[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_photo[/td][td]app icon[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_version[/td][td]version of app[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_channel[/td][td]channel_id owning this instance of the app[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]app_addr[/td][td]reddress/webbie of app creator[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_price[/td][td]free-form price field[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_page[/td][td]currently unused[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_requires[/td][td]access rules[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+
+[tr][td]app_created[/td][td]datetime of app creation[/td][td]datetime[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_edited[/td][td]datetime of last app edit[/td][td]datetime[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+
+[tr][td]app_deleted[/td][td]1 = deleted, 0 = normal[/td][td]int(11)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]app_system[/td][td]1 = imported system app, 0 = member created app[/td][td]int(11)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+
+
+[/table]
+
+Storage for personal apps
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_attach.bb b/doc/en/database/db_attach.bb
new file mode 100644
index 000000000..5098401de
--- /dev/null
+++ b/doc/en/database/db_attach.bb
@@ -0,0 +1,54 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]generated index[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]aid[/td][td]account_id of owner[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td]channel_id of owner[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]hash[/td][td]hash for cross-site identification[/td][td]char(64)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]creator[/td][td]xchan_hash of author/creator[/td][td]char(128)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]filename[/td][td]filename of original[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]filetype[/td][td]mimetype[/td][td]char(64)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]filesize[/td][td]size in bytes[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]revision[/td][td]for version control (partially implemented)[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]folder[/td][td]attach.hash of parent folder[/td][td]char(64)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]flags[/td][td]no longer used[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]is_dir[/td][td]0 (file) or 1 to indicate a directory[/td][td]tinyint[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]is_photo[/td][td]if 1, a photo is linked to this resource[/td][td]tinyint[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]os_storage[/td][td]if 0, data contains content; if 1 data contains path to content (always 1 in hubzilla)[/td][td]tinyint[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]os_path[/td][td]under construction, store the system path[/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]display_path[/td][td]under construction, store the human readable path[/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]content[/td][td]file data or pathname to stored data if ATTACH_FLAG_OS[/td][td]longblob[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]created[/td][td]creation time[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]edited[/td][td]last edit time[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]allow_cid[/td][td]permissions[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]allow_gid[/td][td]permissions[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_cid[/td][td]permissions[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_gid[/td][td]permissions[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+permissions are xchan_hash or group_hash surrounded by angle chars. e.g. '<abc123><xyz789>'
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_auth_codes.bb b/doc/en/database/db_auth_codes.bb
new file mode 100644
index 000000000..c60f064a4
--- /dev/null
+++ b/doc/en/database/db_auth_codes.bb
@@ -0,0 +1,19 @@
+
+OAuth2 authorisation register - currently implemented but unused
+
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]varchar(40)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]client_id[/td][td][/td][td]varchar(20)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]redirect_uri[/td][td][/td][td]varchar(200)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]expires[/td][td][/td][td]int(11)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]scope[/td][td][/td][td]varchar(250)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_cache.bb b/doc/en/database/db_cache.bb
new file mode 100644
index 000000000..02c292f20
--- /dev/null
+++ b/doc/en/database/db_cache.bb
@@ -0,0 +1,15 @@
+
+OEmbed information cache
+
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]k[/td][td]horizontal width + url or resource[/td][td]char(255)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]v[/td][td]OEmbed response from site[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]updated[/td][td]datetime of cache insertion[/td][td]datetime[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_channel.bb b/doc/en/database/db_channel.bb
new file mode 100644
index 000000000..518ff0978
--- /dev/null
+++ b/doc/en/database/db_channel.bb
@@ -0,0 +1,104 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]channel_id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]channel_account_id[/td][td]account.id of the account owning this channel[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]channel_primary[/td][td]1 = this is the primary instance of this channel[/td][td]tinyint(1) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]channel_name[/td][td]Name that this channel is known by[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_address[/td][td]"username" or URL-and-email safe nickname[/td][td]char(255)[/td][td]NO[/td][td]UNI[/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_guid[/td][td]Long hash representing a psuedo-unique ID, does not have ot be globally unique[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_guid_sig[/td][td]channel.gui signed with channel.prvkey and base64url_encoded[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channel_hash[/td][td]base64url_encode of a 64-char whirlpool hash of channel.guid and channel_guid_sig concatenated, synonymous with xchan_hash.[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_timezone[/td][td]PHP-legal timezone[/td][td]char(128)[/td][td]NO[/td][td]MUL[/td][td]UTC[/td][td]
+[/td][/tr]
+[tr][td]channel_location[/td][td]Default for item.location[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_theme[/td][td]channel theme preference[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_startpage[/td]relative site URL to visit after logging in[td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_pubkey[/td][td]RSA public key 4096 bit[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channel_prvkey[/td][td]RSA private key 4096 bit[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channel_notifyflags[/td][td]bifield representing what notification types are active[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]65535[/td][td]
+[/td][/tr]
+[tr][td]channel_pageflags[/td][td]bitfield of special channel uses[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]channel_dirdate[/td][td]time when directory was last pinged. Must do this once a month[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]channel_lastpost[/td][td]date of last post for this channel. May not be fully implemented[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]channel_deleted[/td][td]time when channel was deleted[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]channel_max_anon_mail[/td][td]unused[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]10[/td][td]
+[/td][/tr]
+[tr][td]channel_max_friend_req[/td][td]unused[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]10[/td][td]
+[/td][/tr]
+[tr][td]channel_expire_days[/td][td]expire imported content that hasn't been otherwise protected after this many days, 0 is no expiration[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]channel_passwd_reset[/td][td]password reset token[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_default_group[/td][td]put all new connections into the group with this name[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]channel_allow_cid[/td][td]Default permissions for this channel[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channel_allow_gid[/td][td]Default permissions for this channel[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channel_deny_cid[/td][td]Default permissions for this channel[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channel_deny_gid[/td][td]Default permissions for this channel[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channel_r_stream[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_r_profile[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_r_photos[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_r_abook[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_stream[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_wall[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_tagwall[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_comment[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_mail[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_photos[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_chat[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_a_delegate[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]channel_r_storage[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_storage[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_r_pages[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_pages[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_a_republish[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_w_like[/td][td]specific permission bitfield[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_removed[/td][td]if 1, this channel has been deleted[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_system[/td][td]if 1, this is the special system channel on this site[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]128[/td][td]
+[/td][/tr]
+[tr][td]channel_moved[/td][td]URL of relocated channel, making this instance abandoned if set[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl]
diff --git a/doc/en/database/db_chat.bb b/doc/en/database/db_chat.bb
new file mode 100644
index 000000000..1aac2bd15
--- /dev/null
+++ b/doc/en/database/db_chat.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]chat_id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]chat_room[/td][td]chatroom.cr_id for this chat[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]chat_xchan[/td][td]author xchan_hash[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]chat_text[/td][td]the text of the chat message[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]created[/td][td]timestamp of this message[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_chatpresence.bb b/doc/en/database/db_chatpresence.bb
new file mode 100644
index 000000000..0a7f666c9
--- /dev/null
+++ b/doc/en/database/db_chatpresence.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]cp_id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]cp_room[/td][td]chatroom.cr_id of the chatroom[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]cp_xchan[/td][td]xchan_hash of the chatroom participant[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]cp_last[/td][td]datetime last ping[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]cp_status[/td][td]text status description e.g. "online"[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]cp_client[/td][td]IP address of this client[/td][td]char(128)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_chatroom.bb b/doc/en/database/db_chatroom.bb
new file mode 100644
index 000000000..1d316288d
--- /dev/null
+++ b/doc/en/database/db_chatroom.bb
@@ -0,0 +1,28 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]cr_id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]cr_aid[/td][td]account.id of chatroom owner[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]cr_uid[/td][td]channel.channel_id of chatroom owner[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]cr_name[/td][td]visible name of chatroom[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]cr_created[/td][td]creation timestampe[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]cr_edited[/td][td]edited timestamp[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]cr_expire[/td][td]expiration period for chats in this chatroom in minutes, 0 is no expiration[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]allow_cid[/td][td]permissions for this room[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]allow_gid[/td][td]permissions for this room[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_cid[/td][td]permissions for this room[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_gid[/td][td]permissions for this room[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_clients.bb b/doc/en/database/db_clients.bb
new file mode 100644
index 000000000..0c66a4fc2
--- /dev/null
+++ b/doc/en/database/db_clients.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]client_id[/td][td][/td][td]varchar(20)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]pw[/td][td][/td][td]varchar(20)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]redirect_uri[/td][td][/td][td]varchar(200)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]clname[/td][td][/td][td]text[/td][td]YES[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]icon[/td][td][/td][td]text[/td][td]YES[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td][/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_config.bb b/doc/en/database/db_config.bb
new file mode 100644
index 000000000..f32d3c259
--- /dev/null
+++ b/doc/en/database/db_config.bb
@@ -0,0 +1,14 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]cat[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]k[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]v[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_conv.bb b/doc/en/database/db_conv.bb
new file mode 100644
index 000000000..5adfa8c80
--- /dev/null
+++ b/doc/en/database/db_conv.bb
@@ -0,0 +1,25 @@
+
+Used in Diaspora private mails
+
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]guid[/td][td]A unique identifier for this conversation[/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]recips[/td][td]sender_handle;recipient_handle[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td]channel.channel_id of the owner of this data[/td][td]int(11)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]creator[/td][td]handle of creator[/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]created[/td][td]creation timestamp[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]updated[/td][td]edited timestamp[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]subject[/td][td]subject of initial message (obscured for privacy)[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_event.bb b/doc/en/database/db_event.bb
new file mode 100644
index 000000000..ad3c15789
--- /dev/null
+++ b/doc/en/database/db_event.bb
@@ -0,0 +1,64 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]aid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]event_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]event_hash[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]created[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]edited[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]dtstart[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]dtend[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]summary[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]description[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]location[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]etype[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]nofinish[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]adjust[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]1[/td][td]
+[/td][/tr]
+[tr][td]dismissed[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]allow_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]allow_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+
+[tr][td]event_status[/td][td][/td][td]charr(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]event_status_date[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]event_percent[/td][td][/td][td]smallint(6)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]event_repeat[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]event_sequence[/td][td][/td][td]smallint[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]event_priority[/td][td][/td][td]smallint[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]event_vdata[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]cal_id[/td][td][/td][td]int(10)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_fcontact.bb b/doc/en/database/db_fcontact.bb
new file mode 100644
index 000000000..9bd8c20fe
--- /dev/null
+++ b/doc/en/database/db_fcontact.bb
@@ -0,0 +1,38 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]url[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]name[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]photo[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]request[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]nick[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]addr[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]batch[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]notify[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]poll[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]confirm[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]priority[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]network[/td][td][/td][td]char(32)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]alias[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]pubkey[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]updated[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_ffinder.bb b/doc/en/database/db_ffinder.bb
new file mode 100644
index 000000000..c20158d56
--- /dev/null
+++ b/doc/en/database/db_ffinder.bb
@@ -0,0 +1,14 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]cid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]fid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_fserver.bb b/doc/en/database/db_fserver.bb
new file mode 100644
index 000000000..4c4b0b530
--- /dev/null
+++ b/doc/en/database/db_fserver.bb
@@ -0,0 +1,14 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]server[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]posturl[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]key[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_fsuggest.bb b/doc/en/database/db_fsuggest.bb
new file mode 100644
index 000000000..9da1f2f6d
--- /dev/null
+++ b/doc/en/database/db_fsuggest.bb
@@ -0,0 +1,24 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]cid[/td][td][/td][td]int(11)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]name[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]url[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]request[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]photo[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]note[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]created[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_hook.bb b/doc/en/database/db_hook.bb
new file mode 100644
index 000000000..233062f98
--- /dev/null
+++ b/doc/en/database/db_hook.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]sequential ID[/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]hook[/td][td]name of hook[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]file[/td][td]relative filename of hook handler[/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]fn[/td][td]function name of hook handler[/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]priority[/td][td]can be used to sort conflicts in hook handling by calling handlers in priority order[/td][td]int(11) unsigned[/td][td]NO[/td][td][/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]hook_version[/td][td]version 0 hooks must have two arguments, the App and the hook data. version 1 hooks have 1 argument - the hook data[/td][td]int(11) unsigned[/td][td]NO[/td][td][/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_hubloc.bb b/doc/en/database/db_hubloc.bb
new file mode 100644
index 000000000..e4ab7159d
--- /dev/null
+++ b/doc/en/database/db_hubloc.bb
@@ -0,0 +1,38 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]hubloc_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]hubloc_guid[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]hubloc_guid_sig[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]hubloc_hash[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]hubloc_addr[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]hubloc_network[/td][td][/td][td]char(32)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]hubloc_flags[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]hubloc_status[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]hubloc_url[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]hubloc_url_sig[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]hubloc_host[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]hubloc_callback[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]hubloc_connect[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]hubloc_sitekey[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]hubloc_updated[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]hubloc_connected[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_issue.bb b/doc/en/database/db_issue.bb
new file mode 100644
index 000000000..0a6f2912b
--- /dev/null
+++ b/doc/en/database/db_issue.bb
@@ -0,0 +1,20 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]issue_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]issue_created[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]issue_updated[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]issue_assigned[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]issue_priority[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]issue_status[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]issue_component[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_item.bb b/doc/en/database/db_item.bb
new file mode 100644
index 000000000..6383e13f8
--- /dev/null
+++ b/doc/en/database/db_item.bb
@@ -0,0 +1,151 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]Sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]mid[/td][td]Message-id - globally unique, there can be several items with the same message-ID in the table as they may have different uid owners[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]aid[/td][td]channel_account_id of the channel_id (uid) which owns this copy of the item[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td]channel_id (uid) which owns this copy of the item[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]parent[/td][td]item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]parent_mid[/td][td]Globally unique message-id of the parent to this item[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]thr_parent[/td][td]If the parent of this item is not the top-level item in the conversation, the message-id of the immediate parent; otherwise set to parent_mid[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]created[/td][td]Creation timestamp. If creation is more than ten minutes into the future, set item_delayed to 1; it will automatically be delivered by the poller once the created time has passed[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]edited[/td][td]Date of last edit (default is created)[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]expires[/td][td]Date this item expires and will be removed[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]commented[/td][td]Date of last comment/reply to this item[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]received[/td][Date the item was received at this sitetd][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]changed[/td][td]Date that something in the conversation changed, indicating clients should fetch the conversation again[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]comments_closed[/td][td]Date after which no more comments will be accepted[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]owner_xchan[/td][td]xchan_hash of the owner of this conversation (this is who replies are sent to)[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]author_xchan[/td][td]xchan_hash of the author of this item[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]source_xchan[/td][td]xchan_hash of the external source of this item belongs to multiple delivery chains and comments need to be uplinked[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]mimetype[/td][td]mime type of the content body[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]title[/td][td]item title[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]body[/td][td]item body content[/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]app[/td][td]application which generated this item[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]lang[/td][td]auto-detected language[/td][td]char(64)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]revision[/td][td]future use, version control[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]verb[/td][td]ActivityStreams verb (old style URI)[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]obj_type[/td][td]ActivityStreams object type (old style URI)[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]obj[/td][td]JSON encoded object structure unless it is an implied object (normal post)[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]tgt_type[/td][td]ActivityStreams target type if applicable (URI)[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]target[/td][td]JSON encoded target structure if used[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]layout_mid[/td][td]For webpages, which layout (mid or message_id) to use when displaying this page[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]postopts[/td][td]External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]route[/td][td]comma separated xchan list of xchans where this message was routed on its way to this destination, used for route loop discovery and rejection of comments which arrived by alternate routes and may have different permissions[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]llink[/td][td]URL of a displayable copy of this post/conversation on this site[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]plink[/td][td]permalink or URL toa displayable copy of the message at its source[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]resource_id[/td][td]Used to link other tables to items, it identifies the linked resource and if set must also set resource_type[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]resource_type[/td][td]default none, if a linked resource this should be the name of the resource type such as "photo" or "event"[/td][td]char(16)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]attach[/td][td]JSON structure representing attachments to this item[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]sig[/td][td]RSA signature of the item body by the original author if the private key is available[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]diaspora_meta[/td][td]Used to store Diaspora comment signatures with their weird requirements[/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]location[/td][td]text location where this item originated[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]coord[/td][td] longitude/latitude pair representing location where this item originated[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]public_policy[/td][td]If the author has specified restrictions (this network, this site) etc. for distribution, the corresponding policy text is present here and item_private = 1[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]comment_policy[/td][td]If the author has specified comment restrictions (thei network, this site, etc.) the corresponding policy text is present here[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]allow_cid[/td][td]Access Control - list of allowed xchans '<xchan1><xchan2>...'[/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]allow_gid[/td]Access Control - list of allowed group hashes, see allow_cid[td][/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_cid[/td][td]Access Control - list of denied xchans[/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_gid[/td][td]Access Control - list of denied groups[/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]item_restrict[/td]no longer used[td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_flags[/td][td]no longer used[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_private[/td][td]distribution is restricted[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_origin[/td][td]item originated at this site[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_unseen[/td][td]item has not been seen[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_starred[/td][td]item has been favourited[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_uplink[/td][td]This item is part of a multiple delivery chain and must be uplinked to the original sender (source_xchan)[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_consensus[/td][td]This item allows voting tools[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_wall[/td][td]This item was posted to the wall of uid[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_thread_top[/td][td]parent = id, this is the top post in a conversation [/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_notshown[/td][td][/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_nsfw[/td][td][/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_relay[/td][td][/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_mentionsme[/td][td]The owner of this item was mentioned in it[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_nocomment[/td][td]if 1, no comments are allowed[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_obscured[/td][td]no longer used[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_verified[/td][td]the signature has been verified on this site[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_retained[/td][td][/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_rss[/td][td]item originated in a feed[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_deleted[/td][td]item has been deleted[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_type[/td][td]used to identify webpage and design element types, 0 is a normal conversation item[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_hidden[/td][td]0 or 1 if item is not to be displayed[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_unpublished[/td][td][/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_delayed[/td][td]item is posted in the future[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_pending_remove[/td][td]item is in the process of being removed[/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]item_blocked[/td][td][/td][td]tinyint(4)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_item_id.bb b/doc/en/database/db_item_id.bb
new file mode 100644
index 000000000..ba4cca247
--- /dev/null
+++ b/doc/en/database/db_item_id.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]iid[/td][td]item.id of the referenced item[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td]channel.channel_id of the owner of this data[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]sid[/td][td]an additional identifier to attach or link to the referenced item (often used to store a message_id from another system in order to suppress duplicates)[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]service[/td][td]the name or description of the service which generated this identifier[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_likes.bb b/doc/en/database/db_likes.bb
new file mode 100644
index 000000000..118c9a87e
--- /dev/null
+++ b/doc/en/database/db_likes.bb
@@ -0,0 +1,24 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]channel_id[/td][td][/td][td]int(11) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]liker[/td][td][/td][td]char(128)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]likee[/td][td][/td][td]char(128)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]iid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]verb[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]target_type[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]target_id[/td][td][/td][td]char(128)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]target[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_mail.bb b/doc/en/database/db_mail.bb
new file mode 100644
index 000000000..0628584ae
--- /dev/null
+++ b/doc/en/database/db_mail.bb
@@ -0,0 +1,34 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]convid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]mail_flags[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]from_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]to_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]account_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]channel_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]title[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]body[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]attach[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]mid[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]parent_mid[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]created[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]expires[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_menu.bb b/doc/en/database/db_menu.bb
new file mode 100644
index 000000000..5b478115d
--- /dev/null
+++ b/doc/en/database/db_menu.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]menu_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]menu_channel_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]menu_name[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]menu_desc[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]menu_flags[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_menu_item.bb b/doc/en/database/db_menu_item.bb
new file mode 100644
index 000000000..b14aac5e4
--- /dev/null
+++ b/doc/en/database/db_menu_item.bb
@@ -0,0 +1,28 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]mitem_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]mitem_link[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]mitem_desc[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]mitem_flags[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]allow_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]allow_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]mitem_channel_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]mitem_menu_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]mitem_order[/td][td][/td][td]int(11)[/td][td]NO[/td][td][/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_notify.bb b/doc/en/database/db_notify.bb
new file mode 100644
index 000000000..4787266cd
--- /dev/null
+++ b/doc/en/database/db_notify.bb
@@ -0,0 +1,36 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]hash[/td][td][/td][td]char(64)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xname[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]url[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]photo[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]date[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]msg[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]aid[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]link[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]parent[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]seen[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]ntype[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]verb[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]otype[/td][td][/td][td]char(16)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_obj.bb b/doc/en/database/db_obj.bb
new file mode 100644
index 000000000..cc5e75598
--- /dev/null
+++ b/doc/en/database/db_obj.bb
@@ -0,0 +1,26 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]obj_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]obj_page[/td][td][/td][td]char(64)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]obj_verb[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]obj_type[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]obj_obj[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]obj_channel[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]allow_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]allow_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_outq.bb b/doc/en/database/db_outq.bb
new file mode 100644
index 000000000..970f99de5
--- /dev/null
+++ b/doc/en/database/db_outq.bb
@@ -0,0 +1,28 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]outq_hash[/td][td][/td][td]char(255)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]outq_account[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]outq_channel[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]outq_driver[/td][td][/td][td]char(32)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]outq_posturl[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]outq_async[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]outq_delivered[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]outq_created[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]outq_updated[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]outq_notify[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]outq_msg[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_pconfig.bb b/doc/en/database/db_pconfig.bb
new file mode 100644
index 000000000..2ac36e61a
--- /dev/null
+++ b/doc/en/database/db_pconfig.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]cat[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]k[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]v[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_pgrp.bb b/doc/en/database/db_pgrp.bb
new file mode 100644
index 000000000..73265b90e
--- /dev/null
+++ b/doc/en/database/db_pgrp.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]hash[/td][td]unique hash representing this group with the group name appended[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td]channel.channel_id owning this data[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]visible[/td][td]1 indicates the member list is not private[/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]deleted[/td][td]1 indicates the group has been deleted[/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]gname[/td][td]human readable name of group[/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_pgrp_member.bb b/doc/en/database/db_pgrp_member.bb
new file mode 100644
index 000000000..b9ab8171d
--- /dev/null
+++ b/doc/en/database/db_pgrp_member.bb
@@ -0,0 +1,14 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]uid[/td][td]channel.channel_id of the owner of this data[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]gid[/td][td]groups.id of the associated group[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xchan[/td][td]xchan.xchan_hash of the member assigned to the associated group[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_photo.bb b/doc/en/database/db_photo.bb
new file mode 100644
index 000000000..91840ec1e
--- /dev/null
+++ b/doc/en/database/db_photo.bb
@@ -0,0 +1,52 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]aid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]resource_id[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]created[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]edited[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]title[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]description[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]album[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]filename[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]mimetype[/td][td][/td][td]char(128)[/td][td]NO[/td][td]MUL[/td][td]image/jpeg[/td][td]
+[/td][/tr]
+[tr][td]height[/td][td][/td][td]smallint(6)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]width[/td][td][/td][td]smallint(6)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]filesize[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]content[/td][td][/td][td]mediumblob[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]scale[/td][td][/td][td]tinyint(3)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]profile[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]photo_flags[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]allow_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]allow_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_cid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]deny_gid[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_poll.bb b/doc/en/database/db_poll.bb
new file mode 100644
index 000000000..57d808b71
--- /dev/null
+++ b/doc/en/database/db_poll.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]poll_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]poll_channel[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]poll_desc[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]poll_flags[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]poll_votes[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_poll_elm.bb b/doc/en/database/db_poll_elm.bb
new file mode 100644
index 000000000..fd649d5a6
--- /dev/null
+++ b/doc/en/database/db_poll_elm.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]pelm_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]pelm_poll[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]pelm_desc[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]pelm_flags[/td][td][/td][td]int(11)[/td][td]NO[/td][td][/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]pelm_result[/td][td][/td][td]float[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_profdef.bb b/doc/en/database/db_profdef.bb
new file mode 100644
index 000000000..a0904fd79
--- /dev/null
+++ b/doc/en/database/db_profdef.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]field_name[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]field_type[/td][td][/td][td]char(16)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]field_desc[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]field_help[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]field_inputs[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_profext.bb b/doc/en/database/db_profext.bb
new file mode 100644
index 000000000..ada9dce2a
--- /dev/null
+++ b/doc/en/database/db_profext.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]channel_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]hash[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]k[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]v[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_profile.bb b/doc/en/database/db_profile.bb
new file mode 100644
index 000000000..717fae585
--- /dev/null
+++ b/doc/en/database/db_profile.bb
@@ -0,0 +1,94 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]profile_guid[/td][td][/td][td]char(64)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]aid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]profile_name[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]is_default[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]hide_friends[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]fullname[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]pdesc[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]chandesc[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]dob[/td][td][/td][td]char(32)[/td][td]NO[/td][td][/td][td]0000-00-00[/td][td]
+[/td][/tr]
+[tr][td]dob_tz[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]UTC[/td][td]
+[/td][/tr]
+[tr][td]address[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]locality[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]region[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]postal_code[/td][td][/td][td]char(32)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]country_name[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]hometown[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]gender[/td][td][/td][td]char(32)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]marital[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]partner[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]howlong[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]sexual[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]politic[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]religion[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]keywords[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]likes[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]dislikes[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]about[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]summary[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]music[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]book[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]tv[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]film[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]interest[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]romance[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]employment[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]education[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]contact[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]channels[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]homepage[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]photo[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]thumb[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]publish[/td][td][/td][td]tinyint(1)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_profile_check.bb b/doc/en/database/db_profile_check.bb
new file mode 100644
index 000000000..3be64c5da
--- /dev/null
+++ b/doc/en/database/db_profile_check.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]cid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]dfrn_id[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]sec[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]expire[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_register.bb b/doc/en/database/db_register.bb
new file mode 100644
index 000000000..50672b5e1
--- /dev/null
+++ b/doc/en/database/db_register.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]hash[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]created[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]password[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]language[/td][td][/td][td]char(16)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_session.bb b/doc/en/database/db_session.bb
new file mode 100644
index 000000000..d7ff0482d
--- /dev/null
+++ b/doc/en/database/db_session.bb
@@ -0,0 +1,14 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]bigint(20) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]sid[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]data[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]expire[/td][td][/td][td]bigint(20) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_shares.bb b/doc/en/database/db_shares.bb
new file mode 100644
index 000000000..be5255c03
--- /dev/null
+++ b/doc/en/database/db_shares.bb
@@ -0,0 +1,14 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]share_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]share_type[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]share_target[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]share_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_sign.bb b/doc/en/database/db_sign.bb
new file mode 100644
index 000000000..e80ea7ef3
--- /dev/null
+++ b/doc/en/database/db_sign.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]iid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]retract_iid[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]signed_text[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]signature[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]signer[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_site.bb b/doc/en/database/db_site.bb
new file mode 100644
index 000000000..8dea4dae6
--- /dev/null
+++ b/doc/en/database/db_site.bb
@@ -0,0 +1,28 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]site_url[/td][td][/td][td]char(255)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]site_access[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]site_flags[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]site_update[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]site_pull[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]site_sync[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]site_directory[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]site_register[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]site_sellpage[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]site_location[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]site_realm[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_source.bb b/doc/en/database/db_source.bb
new file mode 100644
index 000000000..92850a82e
--- /dev/null
+++ b/doc/en/database/db_source.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]src_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]src_channel_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]src_channel_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]src_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]src_patt[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_spam.bb b/doc/en/database/db_spam.bb
new file mode 100644
index 000000000..b75e1edd3
--- /dev/null
+++ b/doc/en/database/db_spam.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(11)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]spam[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]ham[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]term[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]date[/td][td][/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_sys_perms.bb b/doc/en/database/db_sys_perms.bb
new file mode 100644
index 000000000..04416a26b
--- /dev/null
+++ b/doc/en/database/db_sys_perms.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]cat[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]k[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]v[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]public_perm[/td][td][/td][td]tinyint(1) unsigned[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_term.bb b/doc/en/database/db_term.bb
new file mode 100644
index 000000000..bd155fe21
--- /dev/null
+++ b/doc/en/database/db_term.bb
@@ -0,0 +1,28 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]tid[/td][td]sequential index[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]aid[/td][td]channel_account_id of the controlling channel[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td]channel_id of the controlling channel[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]oid[/td][td]DB index of linked thing[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]otype[/td][td]type of linked thing[/td][td]tinyint(3) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]ttype[/td][td]taxonomy type (See Tag/term types in boot.php)[/td][td]tinyint(3) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]term[/td][td]the actual taxonomy term[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]url[/td]relevant link (for tags and mentions, a link to the associated resource)[td][/td][td]char(255)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]imgurl[/td][td]rarely used - an image associated with this taxonomy term[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]term_hash[/td][td]unique hash for this entry[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]parent_hash[/td][td]for hierarchical taxonomies, the hash of the relevant parent[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_tokens.bb b/doc/en/database/db_tokens.bb
new file mode 100644
index 000000000..35da2458c
--- /dev/null
+++ b/doc/en/database/db_tokens.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]varchar(40)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]secret[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]client_id[/td][td][/td][td]varchar(20)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]expires[/td][td][/td][td]bigint(20) unsigned[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]scope[/td][td][/td][td]varchar(200)[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]uid[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_updates.bb b/doc/en/database/db_updates.bb
new file mode 100644
index 000000000..f2e25d84c
--- /dev/null
+++ b/doc/en/database/db_updates.bb
@@ -0,0 +1,20 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]ud_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]ud_hash[/td][td][/td][td]char(128)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]ud_guid[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]ud_date[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]ud_last[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]ud_flags[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]ud_addr[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_verify.bb b/doc/en/database/db_verify.bb
new file mode 100644
index 000000000..9d01181c5
--- /dev/null
+++ b/doc/en/database/db_verify.bb
@@ -0,0 +1,18 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]channel[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]type[/td][td][/td][td]char(32)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]token[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]meta[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]created[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_vote.bb b/doc/en/database/db_vote.bb
new file mode 100644
index 000000000..0b9a423eb
--- /dev/null
+++ b/doc/en/database/db_vote.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]vote_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]vote_poll[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]vote_element[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]vote_result[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]vote_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_xchan.bb b/doc/en/database/db_xchan.bb
new file mode 100644
index 000000000..8932969c5
--- /dev/null
+++ b/doc/en/database/db_xchan.bb
@@ -0,0 +1,59 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]xchan_hash[/td][td]calculated hash of this extended channel[/td][td]char(255)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xchan_guid[/td][td]channel_guid of this extended channel[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_guid_sig[/td][td]base64url encoded signature of the guid[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xchan_pubkey[/td][td]public key for verifying signed data and assertions[/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xchan_photo_mimetype[/td][td]mimetype of the profile photo[/td][td]char(32)[/td][td]NO[/td][td][/td][td]image/jpeg[/td][td]
+[/td][/tr]
+[tr][td]xchan_photo_l[/td][td]photo url 300px[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_photo_m[/td][td]photo url 80 px[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_photo_s[/td][td]photo url 48 px[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_addr[/td][td]user@host[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_url[/td][td]url of channel page on primary hub location[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_connurl[/td]poco url[td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_follow[/td]url template for following %s[td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_connpage[/td][td]for premium channels url of channel to display when connecting[/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_name[/td][td]human readabl name of channel[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_network[/td][td]network of channel for instance 'zot', 'diaspora', 'unknown'[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_instance_url[/td][td]no longer used[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchan_flags[/td][td]no longer used[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan_photo_date[/td][td]timestamp of last photo change in GMT[/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]xchan_name_date[/td][td]timestamp of last name change in GMT[/td][td]datetime[/td][td]NO[/td][td][/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[tr][td]xchan_hidden[/td][td]flag - channel is hidden[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan_orphan[/td][td]flag - channel has no known hubloc locations[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan_censored[/td][td]flag - channel has been censored[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan_selfcensored[/td][td]flag - channel is self censored (adult or nsfw)[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan_system[/td][td]flag - this represents a system channel[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan_pubforum[/td][td]flag - channel is a public forum[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan_deleted[/td][td]flag - channel was deleted[/td][td]int(10) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_xchat.bb b/doc/en/database/db_xchat.bb
new file mode 100644
index 000000000..0897408d1
--- /dev/null
+++ b/doc/en/database/db_xchat.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]xchat_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]xchat_url[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchat_desc[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchat_xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xchat_edited[/td][td][/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_xconfig.bb b/doc/en/database/db_xconfig.bb
new file mode 100644
index 000000000..111d1ce3a
--- /dev/null
+++ b/doc/en/database/db_xconfig.bb
@@ -0,0 +1,16 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]xchan[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]cat[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]k[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]v[/td][td][/td][td]mediumtext[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_xign.bb b/doc/en/database/db_xign.bb
new file mode 100644
index 000000000..63c6569de
--- /dev/null
+++ b/doc/en/database/db_xign.bb
@@ -0,0 +1,13 @@
+xign - holds xchan information for channels that have been ignored in 'friend suggestions'
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]uid[/td][td]local channel.channel_id[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xchan[/td][td]xchan.xchan_hash of ignored channel[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_xlink.bb b/doc/en/database/db_xlink.bb
new file mode 100644
index 000000000..528f8da19
--- /dev/null
+++ b/doc/en/database/db_xlink.bb
@@ -0,0 +1,22 @@
+xlink - used to store social graph and channel ratings
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]xlink_id[/td][td]sequential ID[/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]xlink_xchan[/td][td]xchan.xchan_hash of controlling channel[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xlink_link[/td][td]xchan.xchan_hash of link target (connection or rating)[/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xlink_rating[/td][td]int rating[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xlink_rating_txt[/td][td]rating text[/td][td]mediumtext[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xlink_updated[/td][td]timestamp of update in GMT[/td][td]datetime[/td][td]NO[/td][td]MUL[/td][td]0000-00-00 00:00:00[/td][td]
+[tr][td]xlink_static[/td][td]0 for social graph, 1 for ratings[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xlink_sig[/td][td]base64url encoded signature of rating information[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_xprof.bb b/doc/en/database/db_xprof.bb
new file mode 100644
index 000000000..bed79e9ca
--- /dev/null
+++ b/doc/en/database/db_xprof.bb
@@ -0,0 +1,37 @@
+xprof - stores searchable public profile information on directory servers
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]xprof_hash[/td][td]xchan.xchan_hash of this channel[/td][td]char(255)[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xprof_age[/td][td]current age (updated monthly)[/td][td]tinyint(3) unsigned[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[tr][td]xprof_desc[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_dob[/td][td][/td][td]char(12)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_gender[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_marital[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_sexual[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_locale[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_region[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_postcode[/td][td][/td][td]char(32)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_country[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_keywords[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xprof_about[/td][td][/td][td]text[/td][td]NO[/td][td][/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xprof_homepage[/td][td][/td][td]char(255)[/td][td]NO[/td][td][/td][td][/td][td]
+[/td][/tr]
+[tr][td]xprof_hometown[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/database/db_xtag.bb b/doc/en/database/db_xtag.bb
new file mode 100644
index 000000000..1e6fb9961
--- /dev/null
+++ b/doc/en/database/db_xtag.bb
@@ -0,0 +1,14 @@
+[table]
+[tr][th]Field[/th][th]Description[/th][th]Type[/th][th]Null[/th][th]Key[/th][th]Default[/th][th]Extra
+[/th][/tr]
+[tr][td]xtag_id[/td][td][/td][td]int(10) unsigned[/td][td]NO[/td][td]PRI[/td][td]NULL[/td][td]auto_increment
+[/td][/tr]
+[tr][td]xtag_hash[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td]NULL[/td][td]
+[/td][/tr]
+[tr][td]xtag_term[/td][td][/td][td]char(255)[/td][td]NO[/td][td]MUL[/td][td][/td][td]
+[/td][/tr]
+[tr][td]xtag_flags[/td][td][/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td]
+[/td][/tr]
+[/table]
+
+Return to [zrl=[baseurl]/help/database]database documentation[/zrl] \ No newline at end of file
diff --git a/doc/en/dev-function-overview.md b/doc/en/dev-function-overview.md
new file mode 100644
index 000000000..4dccc8cef
--- /dev/null
+++ b/doc/en/dev-function-overview.md
@@ -0,0 +1,51 @@
+$Projectname development - some useful basic functions
+======================================================
+
+
+
+* get_account_id()
+
+Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel.
+
+* local_channel()
+
+Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code.
+
+* remote_channel()
+
+Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
+
+* App::get_observer()
+
+returns an xchan structure representing the current viewer if authenticated (locally or remotely).
+
+* get_config($family,$key), get_pconfig($uid,$family,$key)
+
+Returns the config setting for $family and $key or false if unset.
+
+Deprecated: Use Zotlabs\Lib\Config::Get instead.
+
+* set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)
+
+Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id).
+
+Deprecated: Use Zotlabs\Lib\Config::Set instead.
+
+* dbesc()
+
+Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval()
+
+* q($sql,$var1...)
+
+Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't.
+
+* t($string)
+
+Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist.
+
+* x($var), $x($array,$key)
+
+Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set.
+If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0;
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/dev_beginner.bb b/doc/en/dev_beginner.bb
new file mode 100644
index 000000000..4ac69c301
--- /dev/null
+++ b/doc/en/dev_beginner.bb
@@ -0,0 +1,419 @@
+[h2]You want to contribute code?[/h2]
+[b]...and don't know how to start to...[/b]
+[list]
+[*] debug the red#matrix (php on the webserver),
+[*] contribute code to the project,
+[*] optionally - do it all from inside a virtual machine
+[/list]
+This manual was tested for Debian (Wheezy) as virtual machine on Lubuntu (Ubuntu 14.0) as host.
+
+Content
+
+[toc]
+
+[h2]Install a Virtual Machine (KVM)[/h2]
+
+[url=https://wiki.debian.org/KVM]Here[/url] the installation guide for Linux Debian.
+The summary:
+[list=1]
+[*] install KVM
+[code]# apt-get install qemu-kvm libvirt-bin[/code]
+[*] add yourself to the group libvirt [code]# adduser <youruser> libvirt[/code]
+[*] install gui to manage virtual machines [code]# apt-get install virt-manager[/code]
+[*] download an operating system to run inside the vm ([url=http://ftp.nl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/mini.iso]mini.iso[/url])
+[*] start the virt manager
+- create new virtual machine (click on icon)
+- choose your iso image (just downloaded) as installation source
+- optional: configure the new vm: ram, cpu's,...
+- start virtual machine > result: linux debian starts in a new window.
+[*] (optional) avoid network errors after restart of host os
+[code]# virsh net-start default
+# virsh net-autostart default[/code]
+[/list]
+
+
+[h2]Install Apache Webserver[/h2]
+
+Open a terminal and make yourself root
+[code]su -l[/code]
+
+Create the standard group for the Apache webserver
+[code]groupadd www-data[/code]
+might exist already
+
+[code]usermod -a -G www-data www-data[/code]
+
+Check if the system is really up to date
+[code]apt-get update
+apt-get upgrade[/code]
+
+Optional restart services after installation
+[code]reboot[/code]
+
+If you restarted, make yourself root
+[code]su -l[/code]
+
+Install Apache: [code]
+apt-get install apache2 apache2-doc apache2-utils[/code]
+
+Open webbrowser on PC and check [url=localhost]localhost[/url]
+Should show you a page like "It works"
+
+(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[h2]Install PHP, MySQL, phpMyAdmin[/h2]
+
+[h3]PHP, MySQL[/h3]
+
+[code]su -l
+apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl php5-mcrypt php5-xdebug
+apt-get install php5-mysql
+apt-get install mysql-server mysql-client[/code]
+enter and note the mysql passwort
+
+Optional since its already enabled during phpmyadmin setup
+[code]
+php5enmod mcrypt
+[/code]
+
+[h3]phpMyAdmin[/h3]
+
+Install php myadmin
+[code]apt-get install phpmyadmin[/code]
+
+Configuring phpmyadmin
+- Select apache2 (hint: use the tab key to select)
+- Configure database for phpmyadmin with dbconfig-common?: Choose Yes
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+[h3]Enable rewrite[/h3]
+
+The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load
+
+[code]
+root@debian /var/www $ nano /etc/apache2/mods-available/rewrite.load
+[/code]
+
+ (You should find the content: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so)
+To enable and load mod_rewrite, do the rest of steps.
+Create a symbolic link in /etc/apache2/mods-enabled
+
+[code]
+cd /var/www
+root@debian /var/www $ a2enmod rewrite
+[/code]
+
+Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all".
+
+[code]
+root@debian /var/www $nano /etc/apache2/apache2.conf
+[/code]
+or
+[code]
+root@debian:/var# gedit /etc/apache2/sites-enabled/000-default
+[/code]
+
+Finally, restart Apache2.
+
+[code]
+root@debian /var/www $service apache2 restart
+[/code]
+
+[h3]Test installation[/h3]
+
+[code]cd /var/www[/code]
+
+create a php file to test the php installation[code]nano phpinfo.php[/code]
+
+Insert into the file:
+[code]
+<?php
+ phpinfo();
+?>
+[/code]
+(save CTRL+0, ENTER, CTRL+X)
+
+open webbrowser on PC and try #^[url=http://localhost/phpinfo.php]http://localhost/phpinfo.php[/url] (page shows infos on php)
+
+connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf
+[/code]
+- CTRL+V... to the end of the file
+- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code]
+
+restart apache
+[code]/etc/init.d/apache2 restart
+apt-get update
+apt-get upgrade
+reboot[/code]
+
+[b]phpMyAdmin[/b]
+
+open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url]
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+[h3]Create an empty database... that is later used by the red#matrix[/h3]
+
+
+open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url]
+
+Create an empty database, for example named "red".
+Create a database user, for example "red".
+Grant all rights for the user "red" to the database "red".
+
+Note the access details (hostname, username, password, database name).
+
+
+[h2]Fork the project on github[/h2]
+
+Please follow the instruction in the offiical [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project] documentation[/url] of git.
+It is a good idea to read the whole manual! Git is different to other version control systems in many ways.
+
+Now you should
+[list]
+[*] create an account at github.com
+[*] fork https://framagit.org/hubzilla/core
+[*] fork https://framagit.org/hubzilla/addons
+[/list]
+
+If you not want to use GIT from the command line - there is a usefull Eclipse plugin named ""Eclipse Mylyn to GitHub connector".
+
+
+[h2]Install RED and its Addons[/h2]
+
+[h3]Git at your computer / vm[/h3]
+
+You should have created an account on github and forked the projects befor you procceed.
+
+Delete the directory www
+[code]root@debian:/var# rm -R www/
+[/code]
+
+Install git (and optionally git-gui a client gui)
+[code]apt-get install git git-gui[/code]
+
+[h3]Download red#matri and addons[/h3]
+
+Download the main project red and red-addons
+[code]
+root@debian:/var# git clone https://github.com/yourname/red www
+root@debian:/var# cd www/
+root@debian:/var/www# git clone https://github.com/yourname/red-addons addon
+[/code]
+
+Make this extra folder
+[code]
+root@debian:/var/www# mkdir -p "store/[data]/smarty3"
+[/code]
+
+Create .htconfig.php and make it writable by the webserver
+[code]
+root@debian:/var/www# touch .htconfig.php
+root@debian:/var/www# chmod ou+w .htconfig.php
+[/code]
+
+Make user www-data (webserver) is the owner all the project files
+[code]
+root@debian:/var/www# cd ..
+root@debian:/var# chown -R www-data:www-data www/
+[/code]
+
+Add yourself ("surfer" in this example) to the group www-data. Why? Later you want to modify files in eclipse or in another editor.
+Then make all files writable by the group www-date you are now a member of.
+[code]
+root@debian:/var# cd www/
+root@debian:/var/www# usermod -G www-data surfer
+root@debian:/var# chmod -R g+w www/
+[/code]
+
+Restart the computer (or vm)
+If you are still not able to modify the project files you can check the members of the group www-data with
+[code]
+cat /etc/group
+[/code]
+
+[h3]Register yourself as admin[/h3]
+
+Open http://localhost and init the matrix
+
+Befor you register a first user switch off the registration mails.
+Open /var/www/.htconfig.php
+and make sure "0" is set in this line
+[code]
+App::$config['system']['verify_email'] = 0;
+[/code]
+You should be able to change the file as "yourself" (instead of using root or www-data).
+
+[h3]Cron and the poller[/h3]
+
+Important!
+Run the poller to pick up the recent "public" postings of your friends
+Set up a cron job or scheduled task to run the poller once every 5-10
+minutes to pick up the recent "public" postings of your friends
+
+[code]
+crontab -e
+[/code]
+
+Add
+[code]
+*/10 * * * * cd /var/www/; /usr/bin/php include/poller.php
+[/code]
+
+If you don't know the path to PHP type
+[code]
+whereis php
+[/code]
+
+
+[h2]Debug the server via eclipse[/h2]
+
+[h3]Check the configuration of xdebug[/h3]
+
+You shoud already have installed xdebug in the steps befor
+[code]
+apt-get install php5-xdebug
+[/code]
+
+Configuring Xdebug
+
+Open your terminal and type as root (su -l)
+[code]
+gedit /etc/php5/mods-available/xdebug.ini
+[/code]
+
+if the file is empty try this location
+[code]
+gedit /etc/php5/conf.d/xdebug.ini
+[/code]
+
+That command should open the text editor gedit with the Xdebug configuration file
+At the end of the file content append the following text
+
+xdebug.remote_enable=on
+xdebug.remote_handler=dbgp
+xdebug.remote_host=localhost
+xdebug.remote_port=9000
+
+Save changes and close the editor.
+In you terminal type to restart the web server.
+[code]
+service apache2 restart
+[/code]
+
+
+[h3]Install Eclipse and start debugging[/h3]
+
+Install eclipse.
+Start eclipse with default worspace (or as you like)
+
+Install the PHP plugin
+Menu > Help > Install new software...
+Install "PHP Developnent Tools ..."
+
+Optionally - Install the GitHub connector plugin
+Menu > Help > Install new software...
+Install "Eclipse Mylyn to GitHub connector"
+
+Configure the PHP plugin
+Menu > Window > Preferences...
+> General > Webbrowser > Change to "Use external web browser"
+> PHP > Debug > Debug Settings > PHP Debugger > Change to "XDebug"
+
+Create a new PHP project
+Menu > File > New Project > Choose PHP > "PHP Project"
+> Choose Create project at existing location" and "/var/www"
+
+Start debugging
+Open index.php and "Debug as..."
+Choose as Launch URL: "http://localhost/"
+
+Expected:
+[list]
+[*] The web browser starts
+[*] The debugger will stop at the first php line
+[/list]
+
+
+[h2]Contribute your changes via github[/h2]
+
+[h3]Preparations[/h3]
+
+There is a related page in this docs: [zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl].
+As stated befor it is recommended to read the official documentation [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project]GitHub-Contributing-to-a-Project[/url] of git.
+
+Eclipse has a usefull plugin for GIT: "Eclipse Mylyn to GitHub connector".
+
+Make sure you have set your data
+[code]
+surfer@debian:/var/www$ git config --global user.name "Your Name"
+surfer@debian:/var/www$ git config --global user.email "your@mail.com"
+[/code]
+
+[h3]Your first contribution[/h3]
+
+Create a descriptive topic branch
+[code]
+surfer@debian:/var/www$ git checkout -b dev_beginning
+[/code]
+
+Make sure your local repository is up-to-date with the main project.
+Add the original repository as a remote named “upstream” if not done yet
+[code]
+surfer@debian:/var/www$ git remote add upstream https://framagit.org/hubzilla/core/
+[/code]
+
+Fetch the newest work from that remote
+[code]
+surfer@debian:/var/www$ git fetch upstream
+surfer@debian:/var/www$ git merge upstream/master
+[/code]
+
+Hint: You can list the branches
+[code]
+surfer@debian:/var/www$ git branch -v
+[/code]
+
+Make your changes. In this example it is a new doc file.
+
+Check your modifications
+[code]
+surfer@debian:/var/www$ git status
+[/code]
+
+Add (stage) the new file
+[code]
+surfer@debian:/var/www$ git add doc/dev_beginner.bb
+[/code]
+
+Commit the changes to your local branch. This will open an editor to provide a message.
+[code]
+surfer@debian:/var/www$ git commit -a
+[/code]
+
+Push back up to the same topic branch online
+[code]
+surfer@debian:/var/www$ git push
+[/code]
+
+Now you can go to your (online) account at github and create the pull request.
+
+[h3]Following contributions[/h3]
+
+In case the main devolpers want you to change something.
+Fetch the newest work from the remote upstream/master to be sure you have the latest changes.
+[code]
+surfer@debian:/var/www$ git fetch upstream
+surfer@debian:/var/www$ git merge upstream/master
+[/code]
+Make your changes, test them, commit (to local repository), push (to online repository)
+[code]
+surfer@debian:/var/www$ git status
+surfer@debian:/var/www$ git commit -a -m "added modification of branch"
+surfer@debian:/var/www$ git push
+[/code]
+
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/develop.bb b/doc/en/develop.bb
new file mode 100644
index 000000000..20e987a5a
--- /dev/null
+++ b/doc/en/develop.bb
@@ -0,0 +1,31 @@
+[h2]Documentation for Developers[/h2]
+
+[h3]Technical Documentation[/h3]
+[zrl=[baseurl]/help/Zot---A-High-Level-Overview]A high level overview of Zot[/zrl]
+[zrl=[baseurl]/help/zot]An introduction to Zot[/zrl]
+[zrl=[baseurl]/help/zot_structures]Zot Stuctures[/zrl]
+[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl]
+[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl]
+[zrl=[baseurl]/help/Widgets]Widgets[/zrl]
+[zrl=[baseurl]/help/plugins]Plugins[/zrl]
+[zrl=[baseurl]/help/hooklist]Hooks (detailed - under construction)[/zrl]
+[zrl=[baseurl]/help/doco]Contributing Documentation[/zrl]
+[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl]
+[zrl=[baseurl]/help/schema_development]Schemas[/zrl]
+[zrl=[baseurl]/help/Translations]Translations[/zrl]
+[zrl=[baseurl]/help/developers]Developers[/zrl]
+[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl]
+[zrl=[baseurl]/help/database]Database schema documentation[/zrl]
+[zrl=[baseurl]/help/api_functions]API functions[/zrl]
+[zrl=[baseurl]/help/api_posting]Posting to $Projectname using the API[/zrl]
+[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl]
+[zrl=[baseurl]/doc/html/]Code Reference (Doxygen generated - sets cookies)[/zrl]
+[zrl=[baseurl]/help/to_do_doco]To-Do list for $Projectname Documentation Project[/zrl]
+[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl]
+[zrl=[baseurl]/help/roadmap]Roadmap[/zrl]
+[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]
+[zrl=[baseurl]/help/dev_beginner]Step-for-step manual for beginning developers[/zrl]
+
+[h3]External Resources[/h3]
+[url=https://grid.reticu.li/channel/hubzilla]Development Channel[/url]
+[url=https://federated.social/channel/postgres]Postgres-specific $Projectname Admin Support Channel[/url]
diff --git a/doc/en/developer/api_zot.bb b/doc/en/developer/api_zot.bb
new file mode 100644
index 000000000..ff937bfa5
--- /dev/null
+++ b/doc/en/developer/api_zot.bb
@@ -0,0 +1,766 @@
+[h3]Zot API[/h3]
+
+Many existing social applications and tools can interface directly using the Twitter/StatusNet API, which is available using the 'twitter_api' addon.
+
+This document describes the native API; which allows direct programmatic access to several internal data structures and libraries extending beyond the basic social interface.
+
+The API endpoints detailed below are relative to [code]api/z/1.0[/code], meaning that if an API is listed as [code]channel/stream[/code] the full API URL is [code][baseurl]/api/z/1.0/channel/stream[/code].
+
+[h3]channel/export/basic[/h3]
+
+Export basic channel data
+
+Options:
+ - sections
+ comma-separated list of data types to export
+
+ - posts
+ if true, return default sections plus 3 months of posts
+
+ If no sections are requested, the following sections are returned:
+ channel, connections, config, apps, chatrooms, events, webpages, mail, wikis
+
+ Files and large collections of posts may run into memory limits; these must generally be
+ requested separately.
+
+
+[h3]channel/stream[/h3]
+
+Fetch channel conversation items
+
+[h3]network/stream[/h3]
+
+
+Fetch network conversation items
+
+
+
+[h3]files[/h3]
+
+
+List file storage (attach DB)
+
+GET /api/z/1.0/files
+
+
+Options:
+
+ - filehash
+ return only entries matching hash (exactly)
+
+ - filename
+ return only entries matching filename (substring)
+
+ - filetype
+ return only entries matching filetype/mimetype (substring)
+
+ - start
+ start at record (default 0)
+
+ - records
+ number of records to return or 0 for unlimited
+
+
+
+Example:
+
+curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/files -d filetype=multipart/mixed
+
+
+Returns:
+[code nowrap]
+ {
+
+ "success": true,
+ "results": [
+ {
+ "id": "1",
+ "aid": "1",
+ "uid": "2",
+ "hash": "44ee8b2a1a7f36dea07b93b7747a2383a1bc0fdd08339e8928bfcbe45f65d939",
+ "filename": "Profile Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-02 21:51:17",
+ "edited": "2016-01-02 21:51:17",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "12",
+ "aid": "1",
+ "uid": "2",
+ "hash": "71883f1fc64af33889229cbc79c5a056deeec5fc277d765f182f19073e1b2998",
+ "filename": "Cover Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-15 00:24:33",
+ "edited": "2016-01-15 00:24:33",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "16",
+ "aid": "1",
+ "uid": "2",
+ "hash": "f48f7ec3278499d1dd86b72c3207beaaf4717b07df5cc9b373f14d7aad2e1bcd",
+ "filename": "2016-01",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-22 03:24:55",
+ "edited": "2016-01-22 03:26:57",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ }
+ ]
+ }
+[/code]
+
+
+
+[h3]filemeta[/h3]
+
+Export file metadata for any uploaded file
+
+
+[h3]filedata[/h3]
+
+
+Provides the ability to download a file from cloud storage in chunks
+
+GET /api/z/1.0/filedata
+
+
+Required:
+
+ - file_id
+ attach.hash of desired file ('begins with' match)
+
+
+Optional:
+
+ - start
+ starting byte of returned data in file (counting from 0)
+
+ - length
+ length (prior to base64 encoding) of chunk to download
+
+
+Returns:
+
+ attach (DB) structure with base64 encoded 'content' comprised of the desired chunk
+
+
+
+Example:
+
+ https://xyz.macgirvin.com/api/z/1.0/filedata?f=&file_id=9f5217770fd&start=0&length=48
+
+Returns:
+[code nowrap]
+ {
+
+ "attach": {
+ "id": "107",
+ "aid": "1",
+ "uid": "2",
+ "hash": "9f5217770fd55d563bd77f84d534d8e119a187514bbd391714626cd9c0e60207",
+ "creator": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "filename": "pcxtopbm.c",
+ "filetype": "application/octet-stream",
+ "filesize": "3934",
+ "revision": "0",
+ "folder": "",
+ "flags": "0",
+ "is_dir": "0",
+ "is_photo": "0",
+ "os_storage": "1",
+ "os_path": "",
+ "display_path": "",
+ "content": "LyogcGN4dG9wYm0uYyAtIGNvbnZlcnQgUEMgcGFpbnRicnVzaCAoLnBjeCkgZmls",
+ "created": "2016-07-24 23:13:01",
+ "edited": "2016-07-24 23:13:01",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "start": 0,
+ "length": 48
+ }
+
+ }
+[/code]
+
+[h3]file/export[/h3]
+
+
+[h3]file[/h3]
+
+
+[h3]albums[/h3]
+
+
+Description: list photo albums
+
+GET /api/z/1.0/albums
+
+
+Output:
+
+ text - textual name
+
+ total - number of photos in this album
+
+ url - web URL
+
+ urlencode - textual name, urlencoded
+
+ bin2hex - textual name using bin2hex (which is used in the web URL link)
+
+
+Example:
+
+[code nowrap]
+ {
+
+ "success": true,
+ "albums": [
+ {
+ "text": "/",
+ "total": "2",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/",
+ "urlencode": "",
+ "bin2hex": ""
+ },
+ {
+ "text": "2016-01",
+ "total": "6",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3031",
+ "urlencode": "2016-01",
+ "bin2hex": "323031362d3031"
+ },
+ {
+ "text": "2016-02",
+ "total": "7",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3032",
+ "urlencode": "2016-02",
+ "bin2hex": "323031362d3032"
+ },
+ {
+ "text": "Cover Photos",
+ "total": "5",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/436f7665722050686f746f73",
+ "urlencode": "Cover+Photos",
+ "bin2hex": "436f7665722050686f746f73"
+ },
+ {
+ "text": "Profile Photos",
+ "total": "26",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/50726f66696c652050686f746f73",
+ "urlencode": "Profile+Photos",
+ "bin2hex": "50726f66696c652050686f746f73"
+ }
+ ]
+
+ }
+[/code]
+
+
+[h3]photos[/h3]
+
+
+list photo metadata
+
+
+[h3]photo[/h3]
+
+
+
+[h3]group[/h3]
+
+
+[code]GET /api/z/1.0/group[/code]
+
+Description: list privacy groups
+
+Returns: DB tables of all privacy groups.
+
+To use with API group_members, provide either 'group_id' from the id element returned in this call, or 'group_name' from the gname returned in this call.
+
+[code nowrap]
+ [
+
+ {
+ "id": "1",
+ "hash": "966c946394f3e2627bbb8a55026b5725e582407098415c02f85232de3f3fde76Friends",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Friends"
+ },
+ {
+ "id": "2",
+ "hash": "852ebc17f8c3ed4866f2162e384ded0f9b9d1048f93822c0c84196745f6eec66Family",
+ "uid": "2",
+ "visible": "1",
+ "deleted": "0",
+ "gname": "Family"
+ },
+ {
+ "id": "3",
+ "hash": "cc3cb5a7f9818effd7c7c80a58b09a189b62efa698a74319117babe33ee30ab9Co-workers",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Co-workers"
+ }
+ ]
+[/code]
+[h3]group_members[/h3]
+
+
+[code]GET /api/z/1.0/group_members[/code]
+
+Required:
+
+group_id or group_name
+
+
+Returns:
+
+group_member+abook+xchan (DB join) for each member of the privacy group
+
+[code nowrap]
+ [
+
+ {
+ "id": "1",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_id": "2",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "0",
+ "abook_closeness": "0",
+ "abook_created": "2016-01-02 21:16:26",
+ "abook_updated": "2016-01-02 21:16:26",
+ "abook_connected": "0000-00-00 00:00:00",
+ "abook_dob": "0000-00-00 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "1",
+ "abook_feed": "0",
+ "abook_profile": "",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "xchan_guid": "lql-1VnxtiO4-WF0h72wLX1Fu8szzHDOXgQaTbELwXW77k8AKFfh-hYr70vqMrc3SSvWN-Flrc5HFhRTWB7ICw",
+ "xchan_guid_sig": "PafvEL0VpKfxATxlCqDjfOeSIMdmpr3iU7X-Sysa1h5LzDpjSXsjO37tYZL-accb1M5itLlfnW5epkTa5I4flsW21zSY1A2jCuBQUTLLGV7rNyyBy7lgqJUFvAMRx0TfXzP9lcaPqlM9T1tA6jfWOsOmkdzwofGeXBnsjGfjsO2xdGYe6vwjOU0DSavukvzDMnOayB9DekpvDnaNBTxeGLM45Skzr7ZEMcNF7TeXMbnvpfLaALYEKeQs9bGH-UgAG8fBWgzVAzeBfx_XSR1rdixjyiZGP0kq0h35SlmMPcEjliodOBFwMXqpXFB7Ibp4F6o6te2p2ErViJccQVG8VNKB6SbKNXY6bhP5zVcVsJ-vR-p4xXoYJJvzTN7yTDsGAXHOLF4ZrXbo5yi5gFAlIrTLAF2EdWQwxSGyLRWKxG8PrDkzEzX6cJJ0VRcLh5z6OI5QqQNdeghPZbshMFMJSc_ApCPi9_hI4ZfctCIOi3T6bdgTNKryLm5fhy_eqjwLAZTGP-aUBgLZpb1mf2UojBn6Ey9cCyq-0T2RWyk-FcIcbV4qJ-p_8oODqw13Qs5FYkjLr1bGBq82SuolkYrXEwQClxnrfKa4KYc2_eHAXPL01iS9zVnI1ySOCNJshB97Odpooc4wk7Nb2Fo-Q6THU9zuu0uK_-JbK7IIl6go2qA",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA18JB76lyP4zzL/y7BCej\neJnfZIWZNtM3MZvI1zEVMWmmwOS+u/yH8oPwyaDk4Y/tnj8GzMPj1lCGVRcd8EJa\nNrCMd50HODA5EsJtxpsOzRcILYjOcTtIAG1K4LtKqELi9ICAaFp0fNfa+Jf0eCek\nvPusx2/ORhy+o23hFoSMhL86o2gmaiRnmnA3Vz4ZMG92ieJEDMXt9IA1EkIqS4y5\nBPZfVPLD1pv8iivj+dtN1XjwplgjUbtxmU0/Ej808nHppscRIqx/XJ0XZU90oNGw\n/wYoK2EzJlPbRsAkwNqoFrAYlr5HPpn4BJ2ebFYQgWBUraD7HwS5atsQEaxGfO21\nlUP0+lDg9t3CXvudDj0UG1jiEKbVIGA+4aG0GN2DSC5AyRq/GRxqyay5W2vQbAZH\nyvxPGrZFO24I65g3pjhpjEsLqZ4ilTLQoLMs0drCIcRm5RxMUo4s/LMg16lT4cEk\n1qRtk2X0Sb1AMQQ2uRXiVtWz77QHMONEYkf6OW4SHbwcv5umvlv69NYEGfCcbgq0\nAV7U4/BWztUz/SWj4r194CG43I9I8dmaEx9CFA/XMePIAXQUuABfe1QMOR6IxLpq\nTHG1peZgHQKeGz4aSGrhQkZNNoOVNaZoIfcvopxcHDTZLigseEIaPPha4WFYoKPi\nUPbZ5o8gTLc750uzrnb2jwcCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/profile/l/2",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/profile/m/2",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/profile/s/2",
+ "xchan_addr": "teller@xyz.macgirvin.com",
+ "xchan_url": "https://xyz.macgirvin.com/channel/teller",
+ "xchan_connurl": "https://xyz.macgirvin.com/poco/teller",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Teller",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-10-19 01:26:50",
+ "xchan_name_date": "2016-01-02 21:16:26",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ },
+ {
+ "id": "12",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_id": "24",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "218555",
+ "abook_closeness": "80",
+ "abook_created": "2016-01-27 00:48:43",
+ "abook_updated": "2016-12-04 17:16:58",
+ "abook_connected": "2016-12-04 17:16:58",
+ "abook_dob": "0001-01-01 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "0",
+ "abook_feed": "0",
+ "abook_profile": "debb5236efb1626cfbad33ccb49892801e5f844aa04bf81f580cfa7d13204819",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "xchan_guid": "d5EMLlt1tHHZ0dANoA7B5Wq9UgXoWcFS9-gXOkL_AAejcPApoQRyxfHTuu8DoTbUaO-bYmX5HPuWuK9PHyqNmA",
+ "xchan_guid_sig": "CVWEMRPtzI1YcHfnnWHTuv3H964OAmSElgUfxMoX6RdQdxNpqb_POirpVuyP8s3W17mVCfO5V9IAjkg5iKcqCk6YcvOD_egmMy-AnM9TC1kKndQHw55CunD82Q8K_xBNSXkSROizcNkKh9DVLjJPFjW1AqtI4njkZ3EMgrWqnbFRM1qPToUoCY9zM3tEMHoAD9YX1zP90wl40LzfN-dtcNWpSBbiz9owou62uzLbN7mrCwKOMlXLjwwGswRnxIsEnb3O-FXOs8hs0mArKe9snq1-BKeD16LyzxgwlpVLElzIJZGEZGtMdIJgeRzKuBvPjsOIpQ1yAkuOpFJ3nGCM-IPOIIjAmyVl5zD3xPVcxxpZlJRn5fG1Y-gnqTgsrEQCA7M6XPWQdrdHU4akZfyUyFJDhv3uM-jon9VzrYTBw68R0WA-1Z8WafEHA4qh5OWAj85lUarwhr7iTiEckH51ypPCPs6VbT6Pw7yMaxfjFOcipashQagx0tfOlDhE5dQANOXKASFtH1J9-CZY2MQdLPQ6u54d5whuHKMGaJ0V68pnmZ2rOn7g344Ah2WCJrm17jj60QsRMorqRFj7GMdPIA1XB8Wrk88MuYOe3Dhyuu6ZWKI7YTWJS690ZVkKUqAiNHqj0W86DtaiPUc_mmGR0fHl4Gksnko3WmCFv9q2X2E",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoj2xCJktBA8Ww7Hp+ZNL\nrNuQpo8UB/bfvRkIy+yua3xpF1TuXcnAH61kyRz8vXgOu/l2CyxQbIoaGslCV5Sy\n8JKeNXe+IilUdSSEjMIwCPfSPsYnMHsSnHWmPmclvJwEtQUKOZmW5mMuVBvXy7D2\njomFwc69AYphdyys6eQ7Dcn6+FRBiQbyMprZ5lxyVW+O4DuXVNa3ej2ebx0gCJZ4\ntTIlBoKwEey91dY+FyKVFjdwfNczpmL7LgmZXqcVx+MG3mYgibwdVMiXVj5X06cs\nV9hJ5Xi+Aklsv/UWJtjw9FVt7y9TLptnhh4Ra6T/MDmnBBIAkOR7P/X8cRv078MT\nl0IMsP0RJcDEtTLtwHFVtDs6p52KDFqclKWbqmxmxqV3OTPVYtArRGIzgnJi/5ur\nHRr5G6Cif7QY3UowsIOf78Qvy28LwSbdymgBAWwPPKIviXWxGO+9kMWdmPSUQrWy\nK0+7YA9P9fBUFfn9Hc+p8SJQmQ6OAqLwrDGiPSOlGaNrbEqwqLGgIpXwK+lEFcFJ\n3SPOjJRWdR2whlMxvpwX+39+H7dWN3vSa3Al4/Sq7qW8yW2rYwf+eGyp4Z0lRR+8\nJxFMCwZkSw5g14YdlikAPojv5V1c6KuA5ieg8G1hwyONV7A4JHPyEdPt0W0TZi6C\nCOVkPaC3xGrguETZpJfVpwUCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-4",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-5",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-6",
+ "xchan_addr": "cloner@xyz.macgirvin.com",
+ "xchan_url": "http://abc.macgirvin.com/channel/cloner",
+ "xchan_connurl": "http://abc.macgirvin.com/poco/cloner",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Karen",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-03-31 19:59:20",
+ "xchan_name_date": "2016-01-26 23:23:42",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ }
+
+ ]
+[/code]
+
+[h3]xchan[/h3]
+
+
+An xchan is a global location independent channel and is the primary record for a network
+identity. It may refer to channels on other websites, networks, or services.
+
+[code]GET /api/z/1.0/xchan[/code]
+
+Required: one of [ address, hash, guid ] as GET parameters
+
+Returns a portable xchan structure
+
+Example: https://xyz.macgirvin.com/api/z/1.0/xchan?f=&address=mike@macgirvin.com
+
+Returns:
+[code nowrap]
+ {
+ "hash": "jr54M_y2l5NgHX5wBvP0KqWcAHuW23p1ld-6Vn63_pGTZklrI36LF8vUHMSKJMD8xzzkz7s2xxCx4-BOLNPaVA",
+ "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg",
+ "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4",
+ "pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "photo_mimetype": "image/jpeg",
+ "photo_l": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-4",
+ "photo_m": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-5",
+ "photo_s": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-6",
+ "address": "mike@macgirvin.com",
+ "url": "https://macgirvin.com/channel/mike",
+ "connurl": "https://macgirvin.com/poco/mike",
+ "follow": "https://macgirvin.com/follow?f=&url=%s",
+ "connpage": "https://macgirvin.com/connect/mike",
+ "name": "Mike Macgirvin",
+ "network": "zot",
+ "instance_url": "",
+ "flags": "0",
+ "photo_date": "2012-12-06 05:06:11",
+ "name_date": "2012-12-06 04:59:13",
+ "hidden": "1",
+ "orphan": "0",
+ "censored": "0",
+ "selfcensored": "0",
+ "system": "0",
+ "pubforum": "0",
+ "deleted": "0"
+ }
+[/code]
+[h3]item/update[/h3]
+
+
+Create or update an item (post, activity, webpage, etc.)
+
+Usage: [code]POST /api/z/1.0/item/update[/code]
+
+Description: item/update posts an item (typically a conversation item or post, but can be any item) using form input.
+
+
+Required:
+
+- body
+
+ text/bbcode contents by default.
+
+
+Optional:
+
+- $_FILES['media']
+
+ uploaded media file to include with post
+
+- title
+
+ title of post/item
+
+- contact_allow
+
+ array of xchan.xchan_hash allowed to view this item
+
+- group_allow
+
+ array of group.hash allowed to view this item
+
+- contact_deny
+
+ array of xchan.xchan_hash not allowed to view this item
+
+- group_deny
+
+ array of group.hash not allowed to view this item
+
+- coord
+
+ geographic coordinates
+
+- location
+
+ freefrom location
+
+- expire
+
+ datetime this post will expire or be removed
+
+- mimetype
+
+ mimetype if not text/bbcode
+
+- parent
+
+ item.id of parent to this post (makes it a comment)
+
+- parent_mid
+
+ alternate form of parent using message_id
+
+- remote_xchan
+
+ xchan.xchan_hash of this message author if not the channel owner
+
+- consensus
+
+ boolean set to true if this is a consensus or voting item (default false)
+
+- nocomment
+
+ boolean set to true if comments are to be disabled (default false)
+
+- origin
+
+ do not use this without reading the code
+
+- namespace
+
+ persistent identity for a remote network or service
+
+- remote_id
+
+ message_id of this resource on a remote network or service
+
+- message_id
+
+ message_id of this item (leave unset to generate one)
+
+- created
+
+ datetime of message creation
+
+- post_id
+
+ existing item.id if this is an edit operation
+
+- app
+
+ application or network name to display with item
+
+- category
+
+ comma separated categories for this item
+
+- webpage
+
+ item.page_type if not 0
+
+- pagetitle
+
+ for webpage and design elements, the 'page name'
+
+- layout_mid
+
+ item.mid of layout for this design element
+
+- plink
+
+ permalink for this item if different than the default
+
+- verb
+
+ activitystream verb for this item/activity
+
+- obj_type
+
+ activitystream object type for this item/activity
+
+
+
+Example:
+
+ curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/item/update -d body="hello world"
+
+
+Returns:
+
+[code nowrap]
+ {
+
+ "success": true,
+ "item_id": "2245",
+ "item": {
+ "id": "2245",
+ "mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "aid": "1",
+ "uid": "2",
+ "parent": "2245",
+ "parent_mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "thr_parent": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "created": "2016-12-03 20:00:12",
+ "edited": "2016-12-03 20:00:12",
+ "expires": "0001-01-01 00:00:00",
+ "commented": "2016-12-03 20:00:12",
+ "received": "2016-12-03 20:00:12",
+ "changed": "2016-12-03 20:00:12",
+ "comments_closed": "0001-01-01 00:00:00",
+ "owner_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "author_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "source_xchan": "",
+ "mimetype": "text/bbcode",
+ "title": "",
+ "body": "hello world",
+ "html": "",
+ "app": "",
+ "lang": "",
+ "revision": "0",
+ "verb": "http://activitystrea.ms/schema/1.0/post",
+ "obj_type": "http://activitystrea.ms/schema/1.0/note",
+ "obj": "",
+ "tgt_type": "",
+ "target": "",
+ "layout_mid": "",
+ "postopts": "",
+ "route": "",
+ "llink": "https://xyz.macgirvin.com/display/14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "plink": "https://xyz.macgirvin.com/channel/mychannel/?f=&mid=14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "resource_id": "",
+ "resource_type": "",
+ "attach": "",
+ "sig": "sa4TOQNfHtV13HDZ1tuQGWNBpZp-nWhT2GMrZEmelXxa_IvEepD2SEsCTWOBqM8OKPJLfNy8_i-ORXjrOIIgAa_aT8cw5vka7Q0C8L9eEb_LegwQ_BtH0CXO5uT30e_8uowkwzh6kmlVg1ntD8QqrGgD5jTET_fMQOIw4gQUBh40GDG9RB4QnPp_MKsgemGrADnRk2vHO7-bR32yQ0JI-8G-eyeqGaaJmIwkHoi0vXsfjZtU7ijSLuKEBWboNjKEDU89-vQ1c5Kh1r0pmjiDk-a5JzZTYShpuhVA-vQgEcADA7wkf4lJZCYNwu3FRwHTvhSMdF0nmyv3aPFglQDky38-SAXZyQSvd7qlABHGCVVDmYrYaiq7Dh4rRENbAUf-UJFHPCVB7NRg34R8HIqmOKq1Su99bIWaoI2zuAQEVma9wLqMoFsluFhxX58KeVtlCZlro7tZ6z619-dthS_fwt0cL_2dZ3QwjG1P36Q4Y4KrCTpntn9ot5osh-HjVQ01h1I9yNCj6XPgYJ8Im3KT_G4hmMDFM7H9RUrYLl2o9XYyiS2nRrf4aJHa0UweBlAY4zcQG34bw2AMGCY53mwsSArf4Hs3rKu5GrGphuwYX0lHa7XEKMglwBWPWHI49q7-oNWr7aWwn1FnfaMfl4cQppCMtKESMNRKm_nb9Dsh5e0",
+ "diaspora_meta": "",
+ "location": "",
+ "coord": "",
+ "public_policy": "",
+ "comment_policy": "contacts",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "item_restrict": "0",
+ "item_flags": "0",
+ "item_private": "0",
+ "item_origin": "1",
+ "item_unseen": "0",
+ "item_starred": "0",
+ "item_uplink": "0",
+ "item_consensus": "0",
+ "item_wall": "1",
+ "item_thread_top": "1",
+ "item_notshown": "0",
+ "item_nsfw": "0",
+ "item_relay": "0",
+ "item_mentionsme": "0",
+ "item_nocomment": "0",
+ "item_obscured": "0",
+ "item_verified": "1",
+ "item_retained": "0",
+ "item_rss": "0",
+ "item_deleted": "0",
+ "item_type": "0",
+ "item_hidden": "0",
+ "item_unpublished": "0",
+ "item_delayed": "0",
+ "item_pending_remove": "0",
+ "item_blocked": "0"
+ }
+
+ }
+[/code]
+[h3]item/full[/h3]
+
+
+Get all data associated with an item
+
+[h3]abook[/h3]
+
+
+Connections
+
+[h3]abconfig[/h3]
+
+
+Connection metadata (such as permissions)
+
+[h3]perm_allowed[/h3]
+
+
+Check a permission for a given xchan
diff --git a/doc/en/developer/covenant.bb b/doc/en/developer/covenant.bb
new file mode 100644
index 000000000..431cc74e9
--- /dev/null
+++ b/doc/en/developer/covenant.bb
@@ -0,0 +1,47 @@
+[size=large]Contributor Covenant Code of Conduct[/size]
+
+[h3]Our Pledge[/h3]
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+[h3]Our Standards[/h3]
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+[list]
+ [*]Using welcoming and inclusive language
+ [*]Being respectful of differing viewpoints and experiences
+ [*]Gracefully accepting constructive criticism
+ [*]Focusing on what is best for the community
+ [*]Showing empathy towards other community members
+[/list]
+
+Examples of unacceptable behavior by participants include:
+
+[list]
+ [*]The use of sexualized language or imagery and unwelcome sexual attention or advances
+ [*]Trolling, insulting/derogatory comments, and personal or political attacks
+ [*]Public or private harassment
+ [*]Publishing others' private information, such as a physical or electronic address, without explicit permission
+ [*]Other conduct which could reasonably be considered inappropriate in a professional setting
+[/list]
+
+[h3]Our Responsibilities[/h3]
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+[h3]Scope[/h3]
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+[h3]Enforcement[/h3]
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at project&#x40;hubzilla.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+[h3]Attribution[/h3]
+
+This Code of Conduct is adapted from the [url=http://contributor-covenant.org]Contributor Covenant[/url], version 1.4, available at [url=http://contributor-covenant.org/version/1/4/]http://contributor-covenant.org/version/1/4[/url].
+
diff --git a/doc/en/developer/developer_guide.bb b/doc/en/developer/developer_guide.bb
new file mode 100644
index 000000000..d04cec121
--- /dev/null
+++ b/doc/en/developer/developer_guide.bb
@@ -0,0 +1,176 @@
+[h3]Who is a $Projectname developer? Should I read this?[/h3]
+
+Anyone who contributes to making $Projectname better is a developer. There are many different and important ways you can contribute to this amazing technology, [i]even if you do not know how to write code[/i]. The software itself is only a part of the $Projectname project. You can contribute by
+[list]
+[*] translating text to your language so that people around the world have the opportunity to use $Projectname
+[*] promoting $Projectname and spreading awareness of the platform through blog posts, articles, and word-of-mouth
+[*] creating artwork and graphics for project assets such as icons and marketing material
+[*] supporting project infrastructure like the project website and demo servers
+[/list]
+[i]Software[/i] developers are of course welcomed; there are so many great ideas to implement and not enough people to make them all a reality! The $Projectname code base is an advanced and mature system, but the platform is still very flexible and responsive to new ideas.
+
+We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. All developers are expected to abide by our [zrl=[baseurl]/help/developer/covenant]code of conduct[/zrl]. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
+
+This document will help you get started learning and contributing to $Projectname.
+
+[h3]Versions and Releases[/h3]
+
+$Projectname currently uses a standard version numbering sequence of $x.$y(.$z), for instance '1.12' or '1.12.1'. The first digit is the major version number. Major versions are released "roughly" once per year; often in December.
+
+The second digit is the minor release number. If this number is odd, it is a development version. If the number is even, it is a released version. Minor versions are released (moved from dev to master) typically once per month when development is 'stable', but this is likely to increase. Going forward minor releases will be made somewhere between one and three months; corresponding to a stable code point and when there is general community consensus that the current code base is stable enough to consider a release.
+
+The final digit is an interface or patch designator.
+
+The release process involves changing the version number (by definition the minor version number will be odd, and the minor number will be incremented). Once a year for a major release the major version will be incremented, and the minor number reset to 0.
+
+The release candidate is moved to a new branch; and testing will commence/continue for a period of 1-2 weeks afterward or until any significant issues have been resolved. This branch is usually labelled with RC (release candidate); for instance 1.8RC represents the pending release of version 1.8. At this time, the minor version number on the dev branch is incremented to the next odd number. (For instance 1.9). New development can then take place in the dev branch.
+
+Bug fixes should always be applied to 'dev' and from there merged forward (typically with git cherry-pick) to the RC branch and if necessary applied to the master or official release branch.
+
+At the time a release candidate is produced, the language strings file is frozen until a release is made. Translation work may continue, but all translations should be submitted to 'dev' and merged forward to RC.
+
+Once RC testing is completed, RC is merged to 'master' and the RC version designator removed; resulting in one final checkin to change the version number. The CHANGELOG file should also be updated at or just prior to this time. If there are merge conflicts during this final merge, the merge will be abandoned; and 'git merge -s ours' applied. This results in a replacement of master with the contents of the RC branch. Conflicts often arise with string updates which were made to master after the last release and cannot easily be resolved without hand editing. Since this is a release of tested code, hand editing is discouraged, and the replacement merge strategy should be used instead. It is assumed that RC now contains the most recent well-tested code.
+
+Once the release is live and merged to master, the RC branch may be removed.
+
+Fixes may be made to master after release. Where possible these should be made to dev and 'git cherry-pick' used to merge forward; which preserves the commit info and prevents merge conflicts in the next cycle. Only rarely does a patch only apply to the master branch. If necessary this can be made. If the change is severe, the interface version number should be incremented. This is at the discretion of the community. In any event, a 'git pull' of the master branch should always result in the latest release with any post-release patches applied.
+
+The interface number (the $z in $x.$y.$z) should be incremented in dev whenever a change is made which changes the interfaces or API in incompatible ways so that any external packages (especially addons and API clients) relying on a the current behaviour can discover and change their own interfaces accordingly at the point that it changed.
+
+[h3]Git repository branches[/h3]
+
+There are two official branches of the $Projectname git repo.
+[list]
+[*] The stable version is maintained on the [b]master[/b] branch. The latest commit in this branch is considered to be suitable for production hubs.
+[*] Experimental development occurs on the [b]dev[/b] branch, which is merged into [b]master[/b] when it is deemed tested and stable enough.
+[/list]
+
+[h3]Developer tools and workflows[/h3]
+
+[h4]Hub Snapshots[/h4]
+
+The [url=[baseurl]/help/admin/hub_snapshots]hub snapshots[/url] page provides instructions and scripts for taking complete snapshots of a hub to support switching between consistent and completely known states. This is useful to prevent situations where the content or database schema might be incompatible with the code.
+
+[h3]Translations[/h3]
+
+Our translations are managed through Transifex. If you wish to help out translating $Projectname to another language, sign up on transifex.com, visit [url=https://www.transifex.com/Friendica/hubzilla/]Transifex[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+[h4]Translation Process[/h4]
+
+The strings used in the UI of $Projectname is translated at [url=https://www.transifex.com/Friendica/hubzilla/]Transifex[/url] and then
+included in the git repository at github. If you want to help with translation
+for any language, be it correcting terms or translating $Projectname to a
+currently not supported language, please register an account at transifex.com
+and contact the translation team there.
+
+Translating $Projectname is simple. Just use the online tool at transifex. If you
+don't want to deal with git & co. that is fine, we check the status of the translations
+regularly and import them into the source tree at github so that others can use them.
+
+We do not include every translation from transifex in the source tree to avoid
+a scattered and disturbed overall experience. As an uneducated guess we have a
+lower limit of 50% translated strings before we include the language. This
+limit is judging only by the amount of translated strings under the assumption
+that the most prominent strings for the UI will be translated first by a translation
+team. If you feel your translation useable before this limit,
+please contact us and we will probably include your teams work in the source tree.
+
+If you want to get your work into the source tree yourself, feel free to do so
+and contact us with and question that arises. The process is simple and
+$Projectname ships with all the tools necessary.
+
+The location of the translated files in the source tree is
+ /view/LNG-CODE/
+where LNG-CODE is the language code used, e.g. de for German or fr for French.
+For the email templates (the *.tpl files) just place them into the directory
+and you are done. The translated strings come as a "hmessages.po" file from
+Transifex which needs to be translated into the PHP file $Projectname uses. To do
+so, place the file in the directory mentioned above and use the "po2php"
+utility from the util directory of your $Projectname installation.
+
+Assuming you want to convert the German localization which is placed in
+view/de/hmessages.po you would do the following.
+
+1. Navigate at the command prompt to the base directory of your
+ $Projectname installation
+
+2. Execute the po2php script, which will place the translation
+ in the hstrings.php file that is used by $Projectname.
+
+ $> php util/po2php.php view/de/hmessages.po
+
+ The output of the script will be placed at view/de/hstrings.php where
+ froemdoca os expecting it, so you can test your translation mmediately.
+
+3. Visit your $Projectname page to check if it still works in the language you
+ just translated. If not try to find the error, most likely PHP will give
+ you a hint in the log/warnings.about the error.
+
+ For debugging you can also try to "run" the file with PHP. This should
+ not give any output if the file is ok but might give a hint for
+ searching the bug in the file.
+
+ $> php view/de/hstrings.php
+
+4. commit the two files with a meaningful commit message to your git
+ repository, push it to your fork of the $Projectname repository at github and
+ issue a pull request for that commit.
+
+[h4]Utilities[/h4]
+
+Additional to the po2php script there are some more utilities for translation
+in the "util" directory of the $Projectname source tree. If you only want to
+translate $Projectname into another language you wont need any of these tools most
+likely but it gives you an idea how the translation process of $Projectname
+works.
+
+For further information see the utils/README file.
+
+[h4]Known Problems[/h4]
+
+* $Projectname uses the language setting of the visitors browser to determain the
+ language for the UI. Most of the time this works, but there are some known
+ quirks.
+* the early translations are based on the friendica translations, if you
+ some rough translations please let us know or fix them at Transifex.
+
+[h3]Licensing[/h3]
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+[h3]Coding Style[/h3]
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+[list]
+[*]All comments should be in English.
+[*]We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
+[*]Indentation is accomplished primarily with tabs using a tab-width of 4.
+[*]String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
+[*]Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
+[*]Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
+[*]Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
+[*]Some functions take arguments in argc/argv style like main() in C or function args in bash or Perl. Urls are broken up within a module. e.g, given "http://example.com/module/arg1/arg2", then $this->argc will be 3 (integer) and $this->argv will contain: [0] => 'module', [1] => 'arg1', [2] => 'arg2'. There will always be one argument. If provided a naked domain URL, $this->argv[0] is set to "home".
+[/list]
+
+[h3]File system layout[/h3]
+[table border=0]
+[th]Directory[/th][th]Description[/th][/tr]
+[tr][td]addon[/td][td]optional addons/plugins[/td][/tr]
+[tr][td]boot.php[/td][td]Every process uses this to bootstrap the application structure[/td][/tr]
+[tr][td]doc[/td][td]Help Files[/td][/tr]
+[tr][td]images[/td][td]core required images[/td][/tr]
+[tr][td]include[/td][td]The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing[/td][/tr]
+[tr][td]index.php[/td][td]The front-end controller for web access[/td][/tr]
+[tr][td]install[/td][td]Installation and upgrade files and DB schema[/td][/tr]
+[tr][td]library[/td][td]Third party modules (must be license compatible)[/td][/tr]
+[tr][td]mod[/td][td]Controller modules based on URL pathname (e.g. [url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)[/td][/tr]
+[tr][td]mod/site/[/td][td]site-specific mod overrides, excluded from git[/td][/tr]
+[tr][td]util[/td][td]translation tools, main English string database and other miscellaneous utilities[/td][/tr]
+[tr][td]version.inc[/td][td]contains current version (auto-updated via cron for the master repository and distributed via git)[/td][/tr]
+[tr][td]view[/td][td]theming and language files[/td][/tr]
+[tr][td]view/(css,js,img,php,tpl)[/td][td]default theme files[/td][/tr]
+[tr][td]view/(en,it,es ...)[/td][td]language strings and resources[/td][/tr]
+[tr][td]view/theme/[/td][td]individual named themes containing (css,js,img,php,tpl) over-rides[/td][/tr]
+[/table]
+
+[b][url=[baseurl]/help/developer/unorganized]More information needing re-organization and updating...[/url][/b]
diff --git a/doc/en/developer/testing.md b/doc/en/developer/testing.md
new file mode 100644
index 000000000..f7e8ffeba
--- /dev/null
+++ b/doc/en/developer/testing.md
@@ -0,0 +1,130 @@
+# Testing
+
+Hubzilla uses [PHPUnit] for automated testing, often called _unit testing_ or _integration testing_.
+
+The tests are written as PHP classes, and live under the `tests/unit` subdirectory of the main Hubzilla repository. This guide will explain how to run the tests, how the tests are structured, and how you can write your own tests.
+
+## Running the test suite
+
+### Installing the dependencies
+
+To be able to run the tests you have to install the developer dependencies listen in the `composer.json` file. Make sure you have [composer installed] on your development system, and then run:
+
+ % composer install
+
+This will install phpunit and a few other dependencies. It will also update some files in the `vendor/composer` subdirectory. This may seem a bit noisy, but it's important that these changes are *not* committed to the repository!
+
+**Warning:** Do not commit the changes to the files in the `vendor/composer` directory to your repository!
+
+### Setting up the test database
+
+We have included a script (`tests/create_test_db.sh`) that will help you set up the test database. You can run it like this:
+
+ % HZ_TEST_DB_TYPE=mysql ./tests/create_test_db.sh
+
+If you are running PostgreSQL instead, you create the test db like this:
+
+ % HZ_TEST_DB_TYPE=postgres ./tests/create_test_db.sh
+
+The script make some assumptions about your setup, but everything is configurable using environment variables. If you need any customization, see the script source for the details.
+
+### Running the tests
+
+Once you have installed the developer dependencies and set up the test database, you can run the tests like this:
+
+ % ./vendor/bin/phpunit -c tests/phpunit.xml
+
+Again, by default the configuration in `tests/phpunit.xml` makes some assumptions about your setup, which can be overridden using environment variables. See `tests/phpunit.xml` for the details.
+
+You can also run a specific test, or a specific set of tests using the `--filter` argument to PHPUnit:
+
+ % ./vendor/bin/phpunit -c tests/phpunit.xml --filter Autoname
+
+Will run any test mathcing "Autoname".
+
+### Generating coverage reports
+
+To generate coverage reports you need a driver that is able to generate the coverage info that PHPUnit will collect. We recommend [Xdebug], but see the PHPUnit [page on code coverage analysis](https://docs.phpunit.de/en/9.6/code-coverage-analysis.html) for alternatives and details.
+
+With Xdebug properly set up, you can generate the coverage report like this:
+
+ % XDEBUG_MODE=coverage ./vendor/bin/phpunit -c ./tests/phpunit.xml
+
+This will generate a number of HTML files in directories under the `tests/results/coverage/` subdirectory.
+
+Open the `index.php file in your web browser to view the stats.
+
+### Debugging
+
+With Xdebug installed, you can also do step debugging and a number of other things to debug and get information about the execution of the tests. See the [Xdebug] pages and your prefered editor for how to set this up.
+
+## Test structure and organization
+
+Tests are located in the `tests/unit` subdirectory, and subdirectories under there again, more or less reflecting the directory layout of the core code repository.
+
+Tests are written as PHP classes that extends the UnitTestCase class (located in `tests/unit/UnitTestcase.php`). The file name and the test class it contains should be the same, and they _must_ end with `Test.php`.
+
+Examples are:
+
+* `tests/unit/includes/AccountTest.php`
+* `tests/unit/Lib/ActivityTest.php`
+
+The test classes contain one or more test functions, these must be public and prefixed with `test`.
+
+Here's an example:
+
+ use Zotlabs\Tests\Unit\UnitTestCase;
+
+ class AccountTest extends UnitTestCase {
+ public function test_get_account_by_id_returns_existing_account() {
+ $account = get_account_by_id(42);
+ $this->assertNotFalse($account);
+ $this->assertEquals(
+ $this->fixtures['account'][0]['account_email'],
+ $account['account_email']
+ );
+ }
+
+Notice that we try to make the name of the test funtion as descriptive as possible.
+
+The class can also contain any number of other functions to keep things tidy and nice. These can be private, protected or public as needed by the test code.
+
+Results and artifacts from the test runs will be left in the `tests/results/` directory. This will typically include the test log, code coverage report etc.
+
+### Hubzilla specific features
+
+#### Test database access:
+
+Ideally it should be able to test each part of the code in isolation, where any dependencies should be replaced by stubs, mocks or fakes.
+
+This is not feasible with a legacy codebase like Hubzilla, that has not been written with testability in mind. For this reason we use a separate test database, and make it available to the code under test using the same mechanisms as Hubzilla normally do.
+
+This means that any code that executes database queries will behave as normal when called by a test.
+
+To make this work we connect to the database before running each test function. We also load some initial data into the database to make sure things work as expected, and that we have a known state of the database when the test runs.
+
+When the test finishes, the test database is wiped clean, so that we have the same consistent state when the next test runs.
+
+All of this is handled by the `UnitTestCase` base class.
+
+#### Database fixtures:
+
+We need some predictable content in the database to set up things like logging, and other content that's useful in general for the tests. These are database fixtures that are loaded into the database for each test run.
+
+The database fixtures are located in the `tests/unit/include/dba/_files` directory, and consist of YAML files, where each file represents the content of a database table with the same name as the file itself.
+
+While database fixtures are nice to have, we try to keep the number of them as minimal as possible. It's usually better to add any content needed for a specific test in the test itself.
+
+#### Fakes:
+
+Fakes are classes that we can pass to the code under test that will look and (to the code under test) behave the same as the original class. These are useful when we're able to pass objects to the code under test, as we can control it completely from the test code.
+
+Fakes are located under the `tests/fakes` directory.
+
+## Writing your own tests
+
+To be done
+
+[PHPUnit]: https://phpunit.de
+[composer installed]: https://getcomposer.org/
+[Xdebug]: https://xdebug.org/ \ No newline at end of file
diff --git a/doc/en/developer/unorganized.md b/doc/en/developer/unorganized.md
new file mode 100644
index 000000000..5ba719226
--- /dev/null
+++ b/doc/en/developer/unorganized.md
@@ -0,0 +1,73 @@
+### To-be-organized information
+
+**Here is how you can join us.**
+
+First, get yourself a working git package on the system where you will be
+doing development.
+
+Create your own github account.
+
+You may fork/clone the Red repository from [https://framagit.org/hubzilla/core.git](https://framagit.org/hubzilla/core.git).
+
+Follow the instructions provided here: [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/)
+to create and use your own tracking fork on github
+
+Then go to your github page and create a "Pull request" when you are ready
+to notify us to merge your work.
+
+
+**Important**
+
+Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+**How to theme Hubzilla**
+
+This is a short documentation on what I found while trying to modify Hubzilla's appearance.
+
+First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .
+
+Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().
+
+At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css').
+
+Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
+
+
+We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
+
+**Here is how you can join us.**
+
+First, get yourself a working git package on the system where you will be
+doing development.
+
+Create your own github account.
+
+You may fork/clone the Red repository from [url=https://framagit.org/hubzilla/core.git]https://framagit.org/hubzilla/core.git[/url]
+
+Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url]
+to create and use your own tracking fork on github
+
+Then go to your github page and create a "Pull request" when you are ready
+to notify us to merge your work.
+
+
+**Important**
+
+Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+Further documentation can be found at the Github wiki pages at: [url=https://github.com/friendica/red/wiki]https://github.com/friendica/red/wiki[/url]
+
+**Concensus Building**
+
+Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.
+
+We encourage consensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to [url=https://zothub.com/channel/one]Channel One[/url]. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.
+
+There are places where opposition cannot be resolved. In these cases, please consider making your feature **optional** or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.
+
+If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.
+
diff --git a/doc/en/developer/zot_protocol.bb b/doc/en/developer/zot_protocol.bb
new file mode 100644
index 000000000..e9355bca8
--- /dev/null
+++ b/doc/en/developer/zot_protocol.bb
@@ -0,0 +1,478 @@
+[h3] What is Zot?[/h3]
+Zot is the revolutionary protocol that powers $Projectname, providing [b]communications[/b], [b]identity management[/b], and [b]access control[/b] across a fully [b]decentralised[/b] network of independent websites, often called "the grid". The resulting platform is a robust system that supports privacy and security while enabling the kind of rich web services typically seen only in centralized, proprietary solutions.
+
+Consider this typical scenario:
+
+Jaquelina wishes to share photos with Roberto from her blog at [b]jaquelina.org[/b], but to nobody else. Roberto maintains his own family hub at [b]roberto.net[/b] on a completely independent server. Zot allows Jaquelina to publish her photos using an [i]access control list (ACL)[/i] that includes only Roberto. That means that while Roberto can see the photos when he visits her blog, his brother Marco cannot, and neither can any of his other family members who have accounts on [b]roberto.net[/b].
+
+The magic in this scenario comes from the fact that Roberto never logged in to Jaquelina's website. Instead, he had to login only once using his password on his [i]own[/i] website at [b]roberto.net[/b]. When Roberto visits [b]jaquelina.org[/b], her hub seamlessly authenticates him by remotely querying his server in the background.
+
+It is not uncommon for servers to have technical problems or become inaccessible for a variety of reasons. Zot provides robustness for Roberto's online activities by allowing him to have [i]clones[/i] of his online identity, or [i]channel[/i], on multiple independent hubs. Imagine that Roberto's server crashes for some reason and he cannot log in there. He simply logs in to one of his clones at [b]gadfly.com[/b], a site operated by his friend Peter. Once authenticated at [b]gadfly.com[/b], Roberto can view Jaquelina's blog as before, without Jaquelina having to grant any additional access!
+
+[h4] Communications[/h4]
+Communications and social networking are an integral part of the grid. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers.
+
+Zot supports a wide array of background services in the grid, from friend suggestions to directory services. New content and data updates are propagated in the background between hubs across the grid according to access control lists and permissions specified by both sender [i]and[/i] receiver channels. Data is also synchronized between an arbitrary number of channel clones, allowing hub members to access data and continue collaborating seamlessly in the event that their primary hub is inaccessible or offline.
+
+[h4] Identity [/h4]
+Zot's identity layer is unique. It provides [b]invisible single sign-on[/b] across all sites in the grid.
+
+It also provides [b]nomadic identity[/b], so that your communications with friends, family, and or anyone else you're communicating with won't be affected by the loss of your primary communication node - either temporarily or permanently.
+
+The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the grid at any time - with all your friends and preferences intact.
+
+Crucially, these nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation or censorship.
+
+Nomadic identity, single sign-on, and $Projectname's decentralisation of hubs, we believe, introduce a high degree of degree of [b]resiliency[/b] and [b]persistence[/b] in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.
+
+As you browse the grid, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit.
+
+How does Zot do that? We call it [b]magic-auth[/b], because $Projectname hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the grid. This is one of the design goals of $Projectname: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and login names for every different sight that someone might visit online. You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the grid - such as shopping, blogs, forums, and access to private information. Your password isn't stored on a thousand different sites; it is stored on servers that you control or that you have chosen to trust.
+
+You cannot be silenced. You cannot be removed from the grid unless you yourself choose to exit it.
+
+[h4] Access Control[/h4]
+Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across the grid. This is like having one super huge website made up of an army of small individual websites - and where each channel in the grid can completely control their privacy and sharing preferences for any web resources they create.
+
+Currently, $Projectname supports access control for many types of data, including post/comment discussion threads, photo albums, events, cloud files, web pages, wikis, and more. Every object and how it is shared and with whom is completely under your control.
+
+This type of control is trivial on large corporate providers because they own the user database. Within the grid, there is no need for a huge user database on your machine - because the grid [b]is[/b] your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers.
+
+Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the grid. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub.
+
+[h3]Technical Introduction[/h3]
+Zot is a JSON-based web framework for implementing secure decentralised communications and services. In order to provide this functionality, Zot creates a decentralised globally unique identifier for each hub on the network. This global identifier is not linked inextricably to DNS, providing the requisite mobility. Many existing decentralised communications frameworks provide the communication aspect, but do not provide remote access control and authentication. Additionally most of these are based on 'webfinger', which still binds identity to domain names and cannot support nomadic identity.
+
+The primary issues Zot addresses are
+
+[list]
+[*] completely decentralised communications
+[*] independence from DNS-based identity
+[*] node mobility
+[*] seamless remote authentication
+[*] high performance
+[/list]
+We will rely on DNS-based user@host addresses as a "user-friendly" mechanism to let people know where you are, specifically on a named host with a given username, and communication will be carried out to DNS entities using TCP and the web.
+
+But the underlying protocol will provide an abstraction layer on top of this, so that a communications node (e.g. "identity") can move to an alternate DNS location and (to the best of our ability) gracefully recover from site re-locations and/or maintain pre-existing communication relationships. A side effect of this requirement is the ability to communicate from alternate/multiple DNS locations and service providers and yet maintain a single online identity.
+
+We will call this overlay network the "grid". Servers attached to this network are known as "hubs" and may support any number of individual identities.
+
+An identity does not necessarily correspond to a person. It is just something which requires the ability to communicate within the grid.
+
+The ability to recover will be accomplished by communication to the original location when creating a new or replacement identity, or as a fallback from a stored file describing the identity and their contacts in the case where the old location no longer responds.
+
+At least on the short term, the mobility of existing content is not a top priority. This may or may not take place at a later stage. The most important things we want to keep are your identity and your friends.
+
+Addresses which are shared amongst people are user@host, and which describe the [b]current[/b] local account credentials for a given identity. These are DNS based addresses and used as a seed to locate a given identity within the grid. The machine communications will bind this address to a globally unique ID. A single globally unique ID may be attached or bound to any number of DNS locations. Once an identity has been mapped or bound to a DNS location, communications will consist of just knowing the globally unique address, and what DNS (url) is being used currently (in order to call back and verify/complete the current communication). These concepts will be specified in better detail.
+
+In order for an identity to persist across locations, one must be able to provide or recover
+
+[list]
+[*] the globally unique ID for that identity
+[*] the private key assigned to that identity
+[*] (if the original server no longer exists) an address book of contacts for that identity.
+[/list]
+This information will be exportable from the original server via API, and/or downloadable to disk or thumb-drive.
+
+We may also attempt to recover with even less information, but doing so is prone to account hijacking and will require that your contacts confirm the change.
+
+In order to implement high performance communications, the data transfer format for all aspects of Zot is JSON. XML communications require way too much overhead.
+
+Bi-directional encryption is based on RSA 4096-bit keys expressed in DER/ASN.1 format using the PKCS#8 encoding variant, with AES encryption of variable length or large items. The precise encryption algorithms are negotiable between sites.
+
+Some aspects of well known "federation protocols" (webfinger, salmon, activitystreams, portablecontacts, etc.) may be used in zot, but we are not tied to them and will not be bound by them. $Projectname project is attempting some rather novel developments in decentralised communications and if there is any need to diverge from such "standard protocols" we will do so without question or hesitation.
+
+In order to create a globally unique ID, we will base it on a whirlpool hash of the identity URL of the origination node and a psuedo-random number, which should provide us with a 256 bit ID with an extremely low probability of collision (256 bits represents approximately 115 quattuorviginitillion or 1.16 X 10^77 unique numbers). This will be represented in communications as a base64url-encoded string. We will not depend on probabilities however and the ID must also be attached to a public key with public key cryptography used to provide an assurance of identity which has not been copied or somehow collided in whirlpool hash space.
+
+Basing this ID on DNS provides a globally unique seed, which would not be the case if it was based completely on psuedo-random number generation.
+
+We will refer to the encoded globally unique uid string as zot_uid
+
+As there may be more than one DNS location attached/bound to a given zot_uid identity, delivery processes should deliver to all of them - as we do not know for sure which hub instance may be accessed at any given time. However we will designate one DNS location as "primary" and which will be the preferred location to view web profile information.
+
+We must also provide the ability to change the primary to a new location. A look-up of information on the current primary location may provide a "forwarding pointer" which will tell us to update our records and move everything to the new location. There is also the possibility that the primary location is defunct and no longer responding. In that case, a location which has already been mapped to this zot_uid can seize control, and declare itself to be primary. In both cases the primary designation is automatically approved and moved. A request can also be made from a primary location which requests that another location be removed.
+
+In order to map a zot_uid to a second (or tertiary) location, we require a secure exchange which verifies that the new location is in possession of the private key for this zot_uid. Security of the private key is thus essential to avoid hijacking of identities.
+
+Communications will then require
+[list]
+[*] zot_uid (string)
+[*] uid_sig
+[*] callback (current location Zot endpoint url)
+[*] callback_sig
+[*] spec (int)
+[/list]
+passed with every communique. The spec is a revision number of the applicable Zot spec so that communications can be maintained with hubs using older and perhaps incompatible protocol specifications. Communications are verified using a stored public key which was copied when the connection to this zot_uid was first established.
+
+Key revocation and replacement must take place from the primary hub. The exact form for this is still being worked out, but will likely be a notification to all other bound hubs to "phone home" (to the primary hub) and request a copy of the new key. This communique should be verified using a site or hub key; as the original identity key may have been compromised and cannot be trusted.
+
+In order to eliminate confusion, there should be exactly one canonical url for any hub, so that these can be indexed and referenced without ambiguity.
+
+So as to avoid ambiguity of scheme, it is strongly encouraged that all addresses to be https with a "browser valid" cert and a single valid host component (either www.domain.ext or domain.ext, but not both), which is used in all communications. Multiple URLs may be provided locally, but only one unique URL should be used for all Zot communications within the grid.
+
+Test installation which do not connect to the public grid may use non-SSL, but all traffic flowing over public networks should be safe from session-hijacking, preferably with a "browser recognised" cert.
+
+Where possible, Zot encourages the use of "batching" to minimise network traffic between two hubs. This means that site 'A' can send multiple messages to site 'B' in a single transaction, and also consolidate deliveries of identical messages to multiple recipients on the same hub.
+
+Messages themselves may or may not be encrypted in transit, depending on the private nature of the messages. SSL (strongly encouraged) provides unconditional encryption of the data stream, however there is little point in encrypting public communications which have been designated as having unrestricted visibility. The encryption of data storage and so-called "end-to-end encryption" is outside the scope of zot. It is presumed that hub operators will take adequate safeguards to ensure the security of their data stores and these are functions of application and site integrity as opposed to protocol integrity.
+
+
+[h4]Messages[/h4]
+
+Given the constraints listed previously, a Zot communique should therefore be a json array of individual messages. These can be mixed and combined within the same transmission.
+
+Each message then requires:
+[list]
+[*] type
+[*] (optional) recipient list
+[/list]
+Lack of a recipient list would indicate an unencrypted public or site level message. The recipient list would contain an array of zot_uid with an individual decryption key, and a common iv. The decryption key is encoded with the recipient identity's public key. The iv is encrypted with the sender's private key.
+
+All messages should be digitally signed by the sender.
+
+The type can be one of (this list is extensible):
+[list]
+[*] post (or activity)
+[*] mail
+[*] identity
+[*] authenticate
+[/list]
+Identity messages have no recipients and notify the system social graph of an identity update, which could be a new or deleted identity, a new or deleted location, or a change in primary hub. The signature for these messages uses system keys as opposed to identity-specific keys.
+
+Posts include many different types of activities, such as top-level posts, likes/dislikes, comments, tagging activities, etc. These types are indicated within the message sturcture.
+
+authenticate messages result in mutual authentication and browser redirect to protected resources on the remote hub such as the ability to post wall-to-wall messages and view private photo albums and events, etc.
+
+[h4]Discovery[/h4]
+
+A well-known url is used to probe a hub for Zot capabilities and identity lookups, including the discovery of public keys, profile locations, profile photos, and primary hub location.
+
+The location for this service is /.well-known/zot-info - and must be available at the root of the chosen domain.
+
+To perform a lookup, a POST request is made to the discovery location with the following parameters:
+
+Required:
+
+address => an address on the target system such as "john"
+
+Optional
+
+target => the Zot "guid" of the observer for evaluating permissions
+
+target_sig => an RSA signature (base64url encoded) of the guid
+
+key => The public key needed to verify the signature
+
+token => a string (possibly random) chosen by the requesting service. If provided, an entry in the discovered packet will be provided called 'signed_token' which consists of the base64url_encoded RSA signature of the concatenation of the string 'token.' and the provided token using the private key of the discovered channel. This can be verified using the provided 'key' entry, and provides assurance that the server is in possession of the private key for the discovered identity. After 2017-01-01 it is [b]required[/b] that a server provide a signed_token [i]if[/i] a token was provided in the request.
+
+With no target provided, the permissions returned will be generic permissions
+for unknown or unauthenticated observers
+
+Example of discovery packet for 'mike@zothub.com'
+[code nowrap]
+ {
+
+ "success": true,
+ "signed_token": "KBJrKTq1qrctNuxF3GwVh3GAGRqmgkirlXANPcJZAeWlvSt_9TMV097slR4AYnYCBEushbVqHEJ9Rb5wHTa0HzMbfRo8cRdl2yAirvvv5d98dtwHddQgX1jB0xEypXtmIYMdPGDLvhI1RNdIBhHkkrRcNreRzoy4xD--HM6m1W0-A8PJJJ9BcNxmGPcBtLzW08wzoP9trJ3M7DQ6Gkk6j7iwVsyApw1ZBaDvabGTdc_SFV-Iegtqw3rjzT_xXWsfzMlKBy-019MYn_KS-gu23YzjvGu5tS_zDfkQb8DMUlPLz5yyxM0yOMlUDtG2qQgIJAU2O0X6T5xDdJ6mtolNyhepg845PvFDEqBQGMIH1nc47CNumeudDi8IWymEALhjG_U8KAK7JVlQTJj2EKUb0au1g6fpiBFab5mmxCMtZEX3Jreyak5GOcFFz-WpxuXJD9TdSoIvaBfBFOoJnXkg2zE4RHXeQzZ2FotmrbBG5dm8B-_6byYGoHBc08ZsWze1K96JIeRnLpBaj6ifUDcVHxZMPcGHHT27dvU2PNbgLiBjlAsxhYqkhN5qOHN8XBcg2KRjcMBaI3V0YMxlzXz5MztmZq3fcB1p-ccIoIyMPMzSj3yMB7J9CEU2LYPSTHMdPkIeDE6GaCkQKviaQQJQde346tK_YjA2k7_SOBmvPYE",
+ "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg",
+ "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4",
+ "key": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "name": "Mike Macgirvin",
+ "name_updated": "2012-12-06 04:59:13",
+ "address": "mike@zothub.com",
+ "photo_mimetype": "image/jpeg",
+ "photo": "https://zothub.com/photo/profile/l/1",
+ "photo_updated": "2012-12-06 05:06:11",
+ "url": "https://zothub.com/channel/mike",
+ "connections_url": "https://zothub.com/poco/mike",
+ "target": "",
+ "target_sig": "",
+ "searchable": false,
+ "permissions": {
+ "view_stream": true,
+ "view_profile": true,
+ "view_photos": true,
+ "view_contacts": true,
+ "view_storage": true,
+ "view_pages": true,
+ "send_stream": false,
+ "post_wall": false,
+ "post_comments": false,
+ "post_mail": false,
+ "post_photos": false,
+ "tag_deliver": false,
+ "chat": false,
+ "write_storage": false,
+ "write_pages": false,
+ "delegate": false
+ },
+ "profile": {
+ "description": "Freedom Fighter",
+ "birthday": "0000-05-14",
+ "next_birthday": "2013-05-14 00:00:00",
+ "gender": "Male",
+ "marital": "It's complicated",
+ "sexual": "Females",
+ "locale": "",
+ "region": "",
+ "postcode": "",
+ "country": "Australia"
+ },
+ "locations": [
+ {
+ "host": "zothub.com",
+ "address": "mike@zothub.com",
+ "primary": true,
+ "url": "https://zothub.com",
+ "url_sig": "eqkB_9Z8nduBYyyhaSQPPDN1AhSm5I4R0yfcFxPeFpuu17SYk7jKD7QzvmsyahM5Kq7vDW6VE8nx8kdFYpcNaurqw0_IKI2SWg15pGrhkZfrCnM-g6A6qbCv_gKCYqXvwpSMO8SMIO2mjQItbBrramSbWClUd2yO0ZAceq3Z_zhirCK1gNm6mGRJaDOCuuTQNb6D66TF80G8kGLklv0o8gBfxQTE12Gd0ThpUb5g6_1L3eDHcsArW_RWM2XnNPi_atGNyl9bS_eLI2TYq0fuxkEdcjjYx9Ka0-Ws-lXMGpTnynQNCaSFqy-Fe1aYF7X1JJVJIO01LX6cCs-kfSoz29ywnntj1I8ueYldLB6bUtu4t7eeo__4t2CUWd2PCZkY3PKcoOrrnm3TJP5_yVFV_VpjkcBCRj3skjoCwISPcGYrXDufJxfp6bayGKwgaCO6QoLPtqqjPGLFm-fbn8sVv3fYUDGilaR3sFNxdo9mQ3utxM291XE2Pd0jGgeUtpxZSRzBuhYeOybu9DPusID320QbgNcbEbEImO8DuGIxuVRartzEXQF4WSYRdraZzbOqCzmU0O55P836JAfrWjgxTQkXlYCic-DBk-iE75JeT72smCtZ4AOtoFWCjZAABCw42J7JELY9APixZXWriKtjy6JI0G9d3fs6r7SrXr1JMy0",
+ "callback": "https://zothub.com/post",
+ "sitekey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1IWXwd/BZuevq8jzNFoR\n3VkenduQH2RpR3Wy9n4+ZDpbrUKGJddUGm/zUeWEdKMVkgyllVA/xHdB7jdyKs1X\nuIet9mIdnzvhdLO/JFD5hgbNG2wpSBIUY6aSNeCFTzszqXmuSXMW5U0Ef5pCbzEA\nnhoCoGL1KAgPqyxnGKUlj7q2aDwC9IRNtAqNyFQL67oT91vOQxuMThjlDhbR/29Q\ncYR4i1RzyahgEPCnHCPkT2GbRrkAPjNZAdlnk9UesgP16o8QB3tE2j50TVrbVc/d\nYRbzC56QMPP9UgUsapNeSJBHji75Ip/E5Eg/kfJC/HEQgyCqjCGfb7XeUaeQ7lLO\nqc7CGuMP+Jqr/cE54/aSHg8boTwxkMp11Ykb+ng17fl57MHTM2RJ99qZ1KBkXezR\nuH1lyvjzeJPxEFr9rkUqc4GH74/AgfbgaFvQc8TS7ovEa5I/7Pg04m7vLSEYc6UF\nYJYxXKrzmZT2TDoKeJzaBBx5MFLhW19l68h9dQ8hJXIpTP0hJrpI+Sr6VUAEfFQC\ndIDRiFcgjz6j7T/x8anqh63/hpsyf2PMYph1+4/fxtSCWJdvf+9jCRM8F1IDfluX\n87gm+88KBNaklYpchmGIohbjivJyru41CsSLe0uinQFvA741W00w6JrcrOAX+hkS\nRQuK1dDVwGKoIY85KtTUiMcCAwEAAQ==\n-----END PUBLIC KEY-----\n"
+ }
+ ],
+ "site": {
+ "url": "https://zothub.com",
+ "directory_mode": "primary",
+ "directory_url": "https://zothub.com/dirsearch"
+ }
+
+ }
+[/code]
+
+
+Discovery returns a JSON array with the following components:
+
+'success' => (true or false) Operation was successful if true. Otherwise an optional 'message' may be present indicating the source of error.
+
+'signed_token' => If a token parameter was provided in the request, it is prepended with the text 'token.' and then RSA signed with the channel private key and base64url encoded and returned as 'signed_token'.
+
+'guid' => the guid of the address on the target system
+
+'guid_sig' => the base64url encoded RSA signature of the guid, signed with the private key associated with that guid.
+
+'key' => the public key associated with that guid
+
+'name' => channel name
+
+'name_updated' => MySQL style timestamp '2012-01-01 00:00:00' when the name was last changed (UTC)
+
+'address' => "webbie" or user@host address associated with this channel
+
+'photo' => URL of a profile photo for this channel (ideally 175x175)
+
+'photo_mimetype' => content-type of the profile photo
+
+'photo_updated' => MySQL style timestamp when photo was last updated (UTC)
+
+'url' => location of channel homepage
+
+'connections_url' => location of Portable Contacts (extended for zot) URL for this channel
+
+'target' => if a permissions target was specified, it is mirrored
+
+'target_sig' => if a permissions target was specified, the signature is mirrored.
+
+'searchable' => (true or false) true indicates this entry can be searched in a directory
+
+[h5]Permissions[/h5]
+
+'permissions' => extensible array of permissions appropriate to this target, values are true or false
+
+ Permissions may include:
+[list]
+[*] view_stream
+[*] view_profile
+[*] view_photos
+[*] view_contacts
+[*] view_storage
+[*] view_pages
+[*] send_stream
+[*] post_wall
+[*] post_comments
+[*] post_mail
+[*] post_photos
+[*] tag_deliver
+[*] chat
+[*] write_storage
+[*] write_pages
+[*] delegate
+[/list]
+
+
+[h5]Profile[/h5]
+
+
+'profile' => array of important profile fields
+[list]
+[*] description
+[*] birthday YYYY-MM-DD , all fields are optional, any field (such as year) may be zero
+[*] next_birthday => MySQL datetime string representing the next upcoming birthday, converted from the channel's default timezone to UTC.
+[*] gender (free form)
+[*] marital (marital status)
+[*] sexual (preference)
+[*] locale (city)
+[*] region (state)
+[*] postcode
+[*] country
+[/list]
+
+[h5]Locations[/h5]
+
+
+'locations' => array of registered locations (DNS locations) this channel may be visible or may be posting from
+
+Each location is an array of
+
+'host' => DNS hostname, e.g. example.com
+
+'address' => the webbie or user@host identifier associated with this location
+
+'primary' => (true or false) whether or not this is the primary location for this channel where files and web pages are generally found
+
+'url' => url of the root of this DNS location e.g. https://example.com
+
+'url_sig' => base64url encoded RSA signature of the URL, signed with the channel private key
+
+'callback' => Zot communications endpoint on this site, usually https://example.com/post
+
+'sitekey' => public key of this site/host
+
+
+[h5]Site[/h5]
+
+
+'site' => array providing the directory role of the site responding to this request
+
+'url' => url of this site e.g. https://example.com
+
+'directory_mode' => one of 'primary', 'secondary', 'normal', or 'standalone'
+
+'directory_url' => if this is a directory server or standalone, the URL for the directory search module
+
+
+
+[h3]Magic Auth[/h3]
+
+So-called "magic auth" takes place by a special exchange. On the remote computer, a redirection is made to the Zot endpoint with special GET parameters.
+
+Endpoint: https://example.com/post/name
+
+where 'name' is the left hand side of the channel webbie, for instance 'mike' where the webbie is 'mike@zothub.com'
+
+Additionally four parameters are supplied:
+[list]
+[*] auth => the webbie of the person requesting access
+[*] dest => the desired destination URL (urlencoded)
+[*] sec => a random string which is also stored locally for use during the verification phase.
+[*] version => the Zot revision
+[/list]
+When this packet is received, a Zot message is initiated to the auth identity:
+
+[code nowrap]
+ {
+ "type":"auth_check",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ },
+ "recipients":{
+ {
+ "guid":"ZHSqb3yGar3TYV_o9S-JkD-6o_V4DhUcxtv0VeyX8Kj_ENHPI_M3SyAUucU835-mIayGMmTpqJz3ujPkcavVhA",
+ "guid_sig":"JsAAXigNghTkkbq8beGMJjj9LBKZn28hZ-pHSsoQuwYWvBJ2lSnfc4r9l--WgO6sucH-SR6RiBo78eWn1cZrh_cRMu3x3LLx4y-tjixg-oOOgtZakkBg4vmOhkKPkci0mFtzvUrpY4YHySqsWTuPwRx_vOlIYIGEY5bRXpnkNCoC8J4EJnRucDrgSARJvA8QQeQQL0H4mWEdGL7wlsZp_2VTC6nEMQ48Piu6Czu5ThvLggGPDbr7PEMUD2cZ0jE4SeaC040REYASq8IdXIEDMm6btSlGPuskNh3cD0AGzH2dMciFtWSjmMVuxBU59U1I6gHwcxYEV6BubWt_jQSfmA3EBiPhKLyu02cBMMiOvYIdJ3xmpGoMY1Cn__vhHnx_vEofFOIErb6nRzbD-pY49C28AOdBA5ffzLW3ss99d0A-6GxZmjsyYhgJu4tFUAa7JUl84tMbq28Tib0HW6qYo6QWw8K1HffxcTpHtwSL5Ifx0PAoGMJsGDZDD1y_r9a4vH5pjqmGrjL3RXJJUy-m4eLV5r7xMWXsxjqu3D8r04_dcw4hwwexpMT1Nwf8CTB0TKb8ElgeOpDFjYVgrqMYWP0XdhatcFtAJI7gsS-JtzsIwON9Kij66-VAkqy_z1IXI0ziyqV1yapSVYoUV1vMScRZ_nMqwiB5rEDx-XLfzko"
+ }
+ }
+ "callback":"\/post",
+ "version":1,
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467",
+ "secret_sig":"eKV968b1sDkOVdSMi0tLRtOhQw4otA8yFKaVg6cA4I46_zlAQGbFptS-ODiZlSAqR7RiiZQv4E2uXCKar52dHo0vvNKbpOp_ezWYcwKRu1shvAlYytsflH5acnDWL-FKOOgz5zqLLZ6cKXFMoR1VJGG_Od-DKjSwajyV9uVzTry58Hz_w0W2pjxwQ-Xv11rab5R2O4kKSW77YzPG2R5E6Q7HN38FrLtyWD_ai3K9wlsFOpwdYC064dk66X7BZtcIbKtM6zKwMywcfJzvS5_0U5yc5GGbIY_lY6SViSfx9shOKyxkEKHfS29Ynk9ATYGnwO-jnlMqkJC7t149H-sI9hYWMkLuCzaeLP56k2B2TmtnYvE_vHNQjzVhTwuHCIRVr-p6nplQn_P3SkOpYqPi3k_tnnOLa2d3Wtga8ClEY90oLWFJC3j2UkBf_VEOBNcg-t5XO3T-j9O4Sbk96k1Qoalc-QlznbGx4bOVsGkRBBMiH4YUqiiWB_OkFHtdqv7dqGeC-u-B4u9IxzYst46vvmyA3O-Q4APSZ1RY8ITUH0jLTbh6EAV7Oki8pIbOg0t56p-8RlanOZqmFvR-grVSc7Ak1ZcD8NACmvidUpa1B7WEvRcOeffx9lype0bt5XenDnMyx6szevwxZIiM8qGM2lsSk4fu8HI9cW0mLywzZT0"
+ }
+[/code]
+
+auth_check messages MUST be encrypted. This message is sent to the origination site, which checks the 'secret' to see if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the destination channel's private key and base64url encoded. If everything checks out, a json packet is returned:
+[code nowrap]
+ {
+ "success":1,
+ "confirm":"q0Ysovd1uQRsur2xG9Tg6bC23ynzw0191SkVd7CJcYoaePy6e_v0vnmPg2xBUtIaHpx_aSuhgAkd3aVjPeaVBmts6aakT6a_yAEy7l2rBydntu2tvrHhoVqRNOmw0Q1tI6hwobk1BgK9Pm0lwOeAo8Q98BqIJxf47yO9pATa0wktOg6a7LMogC2zkkhwOV5oEqjJfeHeo27TiHr1e2WaphfCusjmk27V_FAYTzw05HvW4SPCx55EeeTJYIwDfQwjLfP4aKV-I8HQCINt-2yxJvzH7Izy9AW-7rYU0Il_gW5hrhIS5MTM12GBXLVs2Ij1CCLXIs4cO0x6e8KEIKwIjf7iAu60JPmnb_fx4QgBlF2HLw9vXMwZokor8yktESoGl1nvf5VV5GHWSIKAur3KPS2Tb0ekNh-tIk9u-xob4d9eIf6tge_d3aq1LcAtrDBDLk8AD0bho5zrVuTmZ9k-lBVPr_DRHSV_dlpu088j3ThaBsuV1olHK3vLFRhYCDIO0CqqK5IuhqtRNnRaqhlNN6fQUHpXk2SwHiJ2W36RCYMTnno6ezFk_tN-RA2ly-FomNZoC5FPA9gFwoJR7ZmVFDmUeK3bW-zYTA5vu15lpBPnt7Up_5rZKkr0WQVbhWJmylqOuwuNWbn3SrMQ8rYFZ23Tv300cOfKVgRBaePWQb4"
+ }
+[/code]
+'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the base64url encoded whirlpool hash of the source guid and guid_sig; signed with the source channel private key. This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login.
+
+[h3]Zot Structures[/h3]
+[h4]Zot Signatures[/h4]
+All signed data in Zot is accomplished by performing an RSA sign operation using the private key of the initiator. The binary result is then base64url encoded for transport.
+[h4]Zot Encryption[/h4]
+Encryption is currently provided by AES256CTR. Additional algorithms MAY be supported. A 32-octet key and 16-octet initialisation vector are randomly generated. The desired data is then encrypted using these generated strings and the result base64url encoded. Then we build an array:
+
+[dl terms="b"]
+[*= data]The base64url encoded encrypted data
+[*= alg]The chosen algorithm, in this case the string 'aes256ctr'.
+[*= key]The randomly generated key, RSA encrypted using the recipients public key, and the result base64url encoded
+[*= iv]The randomly generated initialization vector, RSA encrypted using the recipient's public key, and the result base64url encoded
+[/dl]
+
+[h4]Basic Zot Packet[/h4]
+Used for initiating a dialogue with another Zot site. This packet MAY be encrypted. The presence of an array element 'iv' indicates encryption has been applied. When sending an 'auth_check' packet type, this packet MUST be encrypted, using the public key of the destination site (the site key, as opposed to a sender key).
+
+[code nowrap]
+ {
+ "type":"notify",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ "sitekey":"-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxTeIwXZWrw/S+Ju6gewh
+LgkKnNNe2uCUqCqMZoYgJar3T5sHCDhvXc4dDCbDkxVIaA/+V1mURtBV60a3IGjn
+OAO0W0XGGLe2ED7G5o9U8T9mVGq8Mauv0v1oQ5wIR1gEAhBavkQ2OUGuF/YKn2nj
+HlKsv9HzUAHpcDMUe3Uklc2RhQbMcnJxEgkyjCkDyrTtCZzISkTAocHvpCG1KSog
+njUZdiz9UWxvM4rCFkCJvQU4RwRZJb7GA9ul+9JrF7NvUQTx8csRP2weBk1E9yyj
+wbe187E0eVj9RXX2Mx3mYhgrTdodxLOVMSXZLg1/SMpeFFl7QBhuM0SiOPg8a7Et
+e2iNA/RD4WiUFqCDfafasRa1TOozOm7LA+08lkAh5PeQPJsJbrX0wVVft++Y+5/z
+BvcUOP73vcbz7j5hJ7HLsbQtye/UUCfODBFybuDqRM84Aet8rjZohX7vukXdMD4I
+2HuB7pjR4uIfyYr0J63ANkvbsn8LR+RnirmHrK5H/OgxxjXcfYbGEQgFxvxhF6lA
+FpMu6Do4dx3CIb6pRmZ8bjSImXexJ0BSo9n3gtrz0XYLecsYFlQ9+QQjm83qxyLb
+M23in0xqMVsyQvzjNkpImrO/QdbEFRIIMee83IHq+adbyjQR49Z2hNEIZhkLPc3U
+2cJJ2HkzkOoF2K37qwIzk68CAwEAAQ==
+-----END PUBLIC KEY-----
+"
+ },
+ "recipients":{
+ {
+ "guid":"lql-1VnxtiO4-WF0h72wLX1Fu8szzHDOXgQaTbELwXW77k8AKFfh-hYr70vqMrc3SSvWN-Flrc5HFhRTWB7ICw",
+ "guid_sig":"PafvEL0VpKfxATxlCqDjfOeSIMdmpr3iU7X-Sysa1h5LzDpjSXsjO37tYZL-accb1M5itLlfnW5epkTa5I4flsW21zSY1A2jCuBQUTLLGV7rNyyBy7lgqJUFvAMRx0TfXzP9lcaPqlM9T1tA6jfWOsOmkdzwofGeXBnsjGfjsO2xdGYe6vwjOU0DSavukvzDMnOayB9DekpvDnaNBTxeGLM45Skzr7ZEMcNF7TeXMbnvpfLaALYEKeQs9bGH-UgAG8fBWgzVAzeBfx_XSR1rdixjyiZGP0kq0h35SlmMPcEjliodOBFwMXqpXFB7Ibp4F6o6te2p2ErViJccQVG8VNKB6SbKNXY6bhP5zVcVsJ-vR-p4xXoYJJvzTN7yTDsGAXHOLF4ZrXbo5yi5gFAlIrTLAF2EdWQwxSGyLRWKxG8PrDkzEzX6cJJ0VRcLh5z6OI5QqQNdeghPZbshMFMJSc_ApCPi9_hI4ZfctCIOi3T6bdgTNKryLm5fhy_eqjwLAZTGP-aUBgLZpb1mf2UojBn6Ey9cCyq-0T2RWyk-FcIcbV4qJ-p_8oODqw13Qs5FYkjLr1bGBq82SuolkYrXEwQClxnrfKa4KYc2_eHAXPL01iS9zVnI1ySOCNJshB97Odpooc4wk7Nb2Fo-Q6THU9zuu0uK_-JbK7IIl6go2qA"
+ },
+ },
+ "callback":"\/post",
+ "version":"1.2",
+ "encryption":{
+ "aes256ctr"
+ },
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467",
+ "secret_sig":"0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q"
+ }
+[/code]
+
+[dl terms="b"]
+[*= type] The message type: [b]notify, purge, refresh, force_refresh, auth_check, ping[/b] or [b]pickup[/b]. The packet contents vary by message type. Here we will describe the [b]notify[/b] packet.
+[*= callback]A string to be appended onto the url which identifies the Zot communications endpoint on this system. It is typically the string "/post".
+[*= version]The Zot protocol identifier, to allow future protocol revisions to co-exist.
+[*= encryption] array of supported encryption algorithms, order by decreasing preference. If no compatible encryption methods are provided, applications MUST use 'aes256cbc'.
+[*= secret]A 64-char string which is randomly generated by the sending site.
+[*= secret_sig]The RSA signature of the secret, signed with the sender's private key.
+[*= sender] An array of four components that provide a portable identity. We can contact the URL provided and download a Zot info packet to obtain the public key of the sender, and use that to verify the sender guid and the posting URL signatures.
+ [dl terms="b"]
+ [*= guid]Typically a 64 character base64url encoded string. This is generated when an identity is created and an attempt is made that it be unique; though this isn't required.
+ [*= guid_sig]The RSA signature of the guid, signed by the sender's private key and base64url encoded.
+ [*= url]The base url of the location this post is originating from.
+ [*= url_sig]The RSA signature of url, signed by the sender's private key and base64url encoded.
+ [*= sitekey]The public key of the website specified in the url
+ [/dl]
+[*= recipients] Only used for private messages. An array of envelope recipients. Each recipient is represented by an array of guid and guid_sig. When recipients are specified, the entire packet is also encapsulated using a negotiated cryptographic algorithm or 'aes256cbc' if none could be negotiated.
+ [dl terms="b"]
+ [*= guid]The guid of a private recipient.
+ [*= guid_sig]The RSA signature of the guid, signed by the recipient's private key and base64url encoded
+ [/dl]
+[/dl]
diff --git a/doc/en/developer_function_primer.bb b/doc/en/developer_function_primer.bb
new file mode 100644
index 000000000..f39954d73
--- /dev/null
+++ b/doc/en/developer_function_primer.bb
@@ -0,0 +1,47 @@
+[b]$Projectname development - some useful basic functions[/b]
+
+[b]get_account_id()[/b]
+
+Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel.
+
+[b]local_channel()[/b]
+
+Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code.
+
+[b]remote_channel()[/b]
+
+Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
+
+[b]App::get_observer()[/b]
+
+returns an xchan structure representing the current viewer if authenticated (locally or remotely).
+
+[b]get_config($family,$key), get_pconfig($uid,$family,$key), get_xconfig($xchan_hash,$family,$key)[/b]
+
+Returns the config setting for $family and $key or false if unset.
+
+Deprecated: Use Zotlabs\Lib\Config::Get instead.
+
+[b] set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)[/b]
+
+Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id). The xconfig version get/sets the value for a specific xchan hash - generally used for remote users.
+
+Deprecated: Use Zotlabs\Lib\Config::Set instead.
+
+[b]dbesc()[/b]
+
+Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval()
+
+[b]q($sql,$var1...)[/b]
+
+Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't.
+
+[b]t($string)[/b]
+
+Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist.
+
+[b]x($var), $x($array,$key)[/b]
+
+Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set. If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0;
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/developers.bb b/doc/en/developers.bb
new file mode 100644
index 000000000..22dc82d7e
--- /dev/null
+++ b/doc/en/developers.bb
@@ -0,0 +1,71 @@
+[b]$Projectname Developer Guide[/b]
+
+We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. All developers are expected to abide by our [zrl=[baseurl]/help/contributor/covenant]code of conduct[/zrl]. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
+
+[b]Here is how you can join us.[/b]
+
+First, get yourself a working git package on the system where you will be
+doing development.
+
+Create your own github account.
+
+You may fork/clone the project repository from [url=https://framagit.org/hubzilla/core.git]https://framagit.org/hubzilla/core.git[/url]
+
+Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url]
+to create and use your own tracking fork on framagit
+
+Then go to your framagit page and create a &quot;Pull request&quot; when you are ready
+to notify us to merge your work.
+
+[b]Translations[/b]
+
+Our translations are managed through Transifex. If you wish to help out translating $Projectname to another language, sign up on transifex.com, visit [url=https://www.transifex.com/projects/p/hubzilla/]https://www.transifex.com/projects/p/hubzilla/[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'hmessages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+[zrl=[baseurl]/help/Translations]Translations - More Info[/zrl]
+
+[b]Important[/b]
+
+Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+
+[b]Licensing[/b]
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+[b]Concensus Building[/b]
+
+Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.
+
+We encourage consensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to the [url=https://project.hubzilla.org/channel/hubzilla]Hubzilla Development[/url] forum. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.
+
+There are places where opposition cannot be resolved. In these cases, please consider making your feature [b]optional[/b] or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.
+
+If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.
+
+
+[b]Coding Style[/b]
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+
+[li] All comments should be in English.[/li]
+
+[li] We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.[/li]
+
+[li] Indentation is accomplished primarily with tabs using a tab-width of 4.[/li]
+
+[li] String concatenation and operators should be separated by whitespace. e.g. &quot;$foo = $bar . 'abc';&quot; instead of &quot;$foo=$bar.'abc';&quot;[/li]
+
+[li] Generally speaking, we use single quotes for string variables and double quotes for SQL statements. &quot;Here documents&quot; should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.[/li]
+
+[li] Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.[/li]
+
+[li] Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves. [/li]
+
+[li] Some functions take arguments in argc/argv style like main() in C or function args in bash or Perl. Urls are broken up within a module. e.g, given "http://example.com/module/arg1/arg2", then $this->argc will be 3 (integer) and $this->argv will contain: [0] => 'module', [1] => 'arg1', [2] => 'arg2'. There will always be one argument. If provided a naked domain URL, $this->argv[0] is set to "home".[/li]
+
+[b]See Also[/b]
+[zrl=[baseurl]/help/sql_conventions]SQL Conventions[/zrl]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/diaspora_compat.bb b/doc/en/diaspora_compat.bb
new file mode 100644
index 000000000..f27a63b9d
--- /dev/null
+++ b/doc/en/diaspora_compat.bb
@@ -0,0 +1,68 @@
+[h3]Diaspora Compatibility[/h3]
+
+The Diaspora Protocol addon allows a site to communicate using the Diaspora protocol, which allows communications and connections to be made with Diaspora members (and also Friendica members, since that network also provides the Diaspora Protocol).
+
+This addon is available in the 'basic' and 'standard' server configurations. It is not available with and the plugin is disabled completely when you are using the 'pro' server configuration. The reason for this is that the Diaspora protocol is not very sophisticated and many $projectname features do not work well with it.
+
+Members will have to be aware of limitations of the protocol or limit their own activities to those which are compatible with Diaspora. The 'pro' server configuration is free from these limitations and you may use all of the project features and abilities without regard for how they translate to other networks. Many features are unique to $Projectname and are supported by the &quot;Zot&quot; protocol, which is our native communications language between servers/hubs.
+
+If you are using a configuration which allows direct Diaspora communications you should be aware of the limitations presented here.
+
+[ul]
+[*]Private mail retraction (unsend) is not possible for Diaspora connections.
+
+[*]Private posts and their associated comments are sent in plaintext email notifications in Diaspora and Friendica. This is a major privacy issue and affects any private communications you have where *any* member of the conversation is on another network. Be aware of it.
+
+[*]Access control only works on posts and comments. Diaspora members will get permission denied trying to access any other access controlled hubzilla objects such as files, photos, webpages, chatrooms, etc. In the case of private photos that are linked to posts, they will see a "prohibited sign" instead of the photo. Diaspora has no concept of private media and provides an illusion of photo privacy by using obscured URLs rather than protecting the photo from snooping by unauthorised viewers.
+
+There is no workaround except to make your media resources public (to everybody on the internet).
+
+
+[*]Edited posts will not be delivered. Diaspora members will see the original post/comment without edits. There is no mechanism in the protocol to update an existing post. We cannot delete it and submit another invisibly because the message-id will change and we need to keep the same message-id on our own network. The only workaround is to delete the post/comment and do it over. (If this is a post, this will delete any existing likes/comments). We may eventually provide a way to delete the out of date copy only from Diaspora and keep it intact on networks that can handle edits.
+
+[*]Nomadic identity ($projectname 'standard' only) will not work with Diaspora. We may eventually provide an **option** which will allow you to "start sharing" from all of your clones when you make the first connection. The Diaspora person does not have to accept this, but it will allow your communications to continue if they accept this connection. Without this option, if you go to another server from where you made the connection originally or you make the connection before creating the clone, you will need to connect with them again from the new location.
+
+[*]Post expiration is not supported on Diaspora. We may provide you an option to not send expiring posts to that network. In the future this may be provided with a remote delete request.
+
+[*]End-to-end encryption is not supported. We will translate these posts into a lock icon, which can never be unlocked from the Diaspora side.
+
+[*]Message verification will eventually be supported.
+
+[*]Multiple profiles are not supported. Diaspora members can only see your default profile.
+
+[*]Birthday events will not appear in Diaspora. Other events will be translated and sent as a post, but all times will either be in the origination channel's timezone or in GMT. We do not know the recipient's timezone because Diaspora doesn't have this concept.
+
+[*]We currently allow tags to be hijacked by default. An option is provided to allow you to prevent the other end of the network from hijacking your tags and point them at its own resources.
+
+[*]Community tags will not work. We will send a tagging activity as a comment. It won't do anything.
+
+[*]Privacy tags (@!somebody) will not be available to Diaspora members. These tags may have to be stripped or obscured to prevent them from being hijacked - which could result in privacy issues.
+
+[*]Plus-tagged hubzilla forums should work from Diaspora.
+
+
+[*]You cannot use Diaspora channels as channel sources.
+
+
+[*]Dislikes of posts will be converted to comments and you will have the option to send these as comments or not send them to Diaspora (which does not provide dislike). Currently they are not sent.
+
+[*]We will do the same for both likes and dislikes of [b][i]comments[/i][/b]. They can either be sent as comments or you will have the ability to prevent them from being transmitted to Diaspora. Currently they are not sent.
+
+[*]Emojis are currently untranslated.
+
+[*]"observer tags" will be converted to empty text.
+
+
+[*]Embedded apps will be translated into links.
+
+
+[*]Embedded page design elements (work in progress) will be either stripped or converted to an error message.
+
+[*]Diaspora members will not appear in the directory.
+
+
+[*]There are differences in oembed compatibility between the networks. Some embedded resources will turn into a link on one side or the other.
+
+[/ul]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/directories.bb b/doc/en/directories.bb
new file mode 100644
index 000000000..60a0b624d
--- /dev/null
+++ b/doc/en/directories.bb
@@ -0,0 +1,95 @@
+[h3]Directory Configuration[/h3]
+
+Directories in $Projectname serve the purpose of searching and locating members anywhere in the network. They are also used to store and query "ratings" of members and sites. The directory services are distributed and mirrored so that a failure of one will not take down or disrupt the entire network.
+
+[b]Standard Configuration[/b]
+
+New sites operating as directory clients will automatically select from a hard-coded list of directory servers during their first directory access. You may examine or over-ride this decision using
+
+[code]
+util/config system directory_server
+[/code]
+
+To set a different server,
+
+[code]
+util/config system directory_server https://newdirectory.something
+[/code]
+
+
+[b]Standalone configuration[/b]
+
+Some sites may wish to operate in 'standalone' mode and not connect to any external directory services. This is useful for isolated sites ("off the gird") and test sites, but can also be useful for small organisations who do not wish to connect with other sites in the network.
+
+To configure this, please look in your .htconfig.php file for the following text and set the configuration accordingly.
+
+[code]
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+App::$config['system']['directory_mode'] = DIRECTORY_MODE_STANDALONE;
+[/code]
+
+
+[b]Secondary server configuration[/b]
+
+You may also configure your site as a secondary server. This operates as a mirror of the primary directory and allows disitribution of the load amongst available servers. There is very little functional difference between a primary and secondary sever, however there may only be *one* primary directory server per realm (realms are discussed later in this document).
+
+Before choosing to be a directory server, please be advised that you should be an active member of the network and have the resources and time available to manage these services. They don't typically require management, but the requirement is more for stability as losing a directory server can cause issues to directory clients which are reliant on it.
+
+
+[b]Changing the directory server[/b]
+
+If a directory server indicates that it is no longer a directory server, this should be detected by the software and the configuration for that server will be removed (blanked). If it goes offline permanently without warning, you will only know if site members report that directory services are unavailable. Currently this can only be repaired manually by the site administrator by selecting a new directory and performing:
+
+[code]
+util/config system directory_server https://newdirectory.something
+[/code]
+
+Eventually we hope to make this a selectable box from the site admin panel.
+
+
+[h2]Directory realms[/h2]
+
+Large organisations may wish to use directory 'realms' rather than a single standalone directory. The standard and default realm is known as RED_GLOBAL. By creating a new realm, your organisation has the ability to create its own hierarchy of primary and secondary servers and clients.
+
+[code]
+util/config system directory_realm MY_REALM
+[/code]
+
+Your realm *must* have a primary directory. Create this first. Then set the realm the same on all sites within your directory realm (servers and clients).
+
+You may also provide a "sub-realm" that operates indepently from the RED_GLOBAL realm (or any other realm) but allows cross membership and some ability to lookup members of the entire directory space. This has only undergone light testing so be prepared to help out and fix any issues that may arise. A sub-realm contains its parent realm within the realm name.
+
+
+[code]
+util/config system directory_realm RED_GLOBAL:MY_REALM
+[/code]
+
+
+[b]Realm access[/b]
+
+You may wish that your directory servers and services are only used by members of your realm. To do this a token or password must be supplied to access the realm directory services. This token is not encrypted during transit, but is sufficient to prevent casual access to your directory servers. The following must be configured for all sites (clients and directory servers) within the realm:
+
+[code]
+util/config system realm_token my-secret-realm-password
+[/code]
+
+
+
+[h2]Directory mirrors[/h2]
+
+Mirroring occurs with a daily transaction log of activities which are shared between directory servers. In the case of directory and profile updates, the channel address performing the update is transmitted, and the other directory servers probe that channel at its source for changes. We do not and should not trust any information given us by other directory servers. We always check the information at the source.
+
+Ratings are handled slightly differently - an encrypted packet (signed by the channel that created the rating) is passed between the servers. This signature needs to be verified before the rating is accepted. Ratings are always published to the primary directory server and propagated to all other directory servers from there. For this reason there can only be one primary server in a realm. If a misconfigured site claims to be a primary directory, it is ignored in the RED_GLOBAL realm. For other realms there is currently no such protection. Be aware of this when working with alternate realms.
+
+Newly created directory servers are not provided a "full dump", but for performance reasons and minimal disruption to the other servers in the network, they are brought online slowly. It may take up to a month for a new secondary directory server to provide a full view of the network. Please do not add any secondary servers to the hard-coded list of fallback directory servers until it has been operating as a directory for at least a month.
+
+All channels are configured to "ping" their directory server once a month, at somewhat random times during the month. This gives the ability for the directory to discover dead channels and sites (they stop pinging). Subsequently they are marked dead or unreachable and over time will be removed from the directory results.
+
+Channels may be configured to be "hidden" from the directory. These channels may still exist in the directory but will be un-searchable and some "sensitive" personal information will not be stored at all.
+
+ \ No newline at end of file
diff --git a/doc/en/dnt-policy.txt b/doc/en/dnt-policy.txt
new file mode 100644
index 000000000..ad946d1f8
--- /dev/null
+++ b/doc/en/dnt-policy.txt
@@ -0,0 +1,218 @@
+Do Not Track Compliance Policy
+
+Version 1.0
+
+This domain complies with user opt-outs from tracking via the "Do Not Track"
+or "DNT" header [http://www.w3.org/TR/tracking-dnt/]. This file will always
+be posted via HTTPS at https://example-domain.com/.well-known/dnt-policy.txt
+to indicate this fact.
+
+SCOPE
+
+This policy document allows an operator of a Fully Qualified Domain Name
+("domain") to declare that it respects Do Not Track as a meaningful privacy
+opt-out of tracking, so that privacy-protecting software can better determine
+whether to block or anonymize communications with this domain. This policy is
+intended first and foremost to be posted on domains that publish ads, widgets,
+images, scripts and other third-party embedded hypertext (for instance on
+widgets.example.com), but it can be posted on any domain, including those users
+visit directly (such as www.example.com). The policy may be applied to some
+domains used by a company, site, or service, and not to others. Do Not Track
+may be sent by any client that uses the HTTP protocol, including websites,
+mobile apps, and smart devices like TVs. Do Not Track also works with all
+protocols able to read HTTP headers, including SPDY.
+
+NOTE: This policy contains both Requirements and Exceptions. Where possible
+terms are defined in the text, but a few additional definitions are included
+at the end.
+
+REQUIREMENTS
+
+When this domain receives Web requests from a user who enables DNT by actively
+choosing an opt-out setting in their browser or by installing software that is
+primarily designed to protect privacy ("DNT User"), we will take the following
+measures with respect to those users' data, subject to the Exceptions, also
+listed below:
+
+1. END USER IDENTIFIERS:
+
+ a. If a DNT User has logged in to our service, all user identifiers, such as
+ unique or nearly unique cookies, "supercookies" and fingerprints are
+ discarded as soon as the HTTP(S) response is issued.
+
+ Data structures which associate user identifiers with accounts may be
+ employed to recognize logged in users per Exception 4 below, but may not
+ be associated with records of the user's activities unless otherwise
+ excepted.
+
+ b. If a DNT User is not logged in to our service, we will take steps to ensure
+ that no user identifiers are transmitted to us at all.
+
+2. LOG RETENTION:
+
+ a. Logs with DNT Users' identifiers removed (but including IP addresses and
+ User Agent strings) may be retained for a period of 10 days or less,
+ unless an Exception (below) applies. This period of time balances privacy
+ concerns with the need to ensure that log processing systems have time to
+ operate; that operations engineers have time to monitor and fix technical
+ and performance problems; and that security and data aggregation systems
+ have time to operate.
+
+ b. These logs will not be used for any other purposes.
+
+3. OTHER DOMAINS:
+
+ a. If this domain transfers identifiable user data about DNT Users to
+ contractors, affiliates or other parties, or embeds from or posts data to
+ other domains, we will either:
+
+ b. ensure that the operators of those domains abide by this policy overall
+ by posting it at /.well-known/dnt-policy.txt via HTTPS on the domains in
+ question,
+
+ OR
+
+ ensure that the recipient's policies and practices require the recipient
+ to respect the policy for our DNT Users' data.
+
+ OR
+
+ obtain a contractual commitment from the recipient to respect this policy
+ for our DNT Users' data.
+
+ NOTE: if an “Other Domain” does not receive identifiable user information
+ from the domain because such information has been removed, because the
+ Other Domain does not log that information, or for some other reason, these
+ requirements do not apply.
+
+ c. "Identifiable" means any records which are not Anonymized or otherwise
+ covered by the Exceptions below.
+
+4. PERIODIC REASSERTION OF COMPLIANCE:
+
+ At least once every 12 months, we will take reasonable steps commensurate
+ with the size of our organization and the nature of our service to confirm
+ our ongoing compliance with this document, and we will publicly reassert our
+ compliance.
+
+5. USER NOTIFICATION:
+
+ a. If we are required by law to retain or disclose user identifiers, we will
+ attempt to provide the users with notice (unless we are prohibited or it
+ would be futile) that a request for their information has been made in
+ order to give the users an opportunity to object to the retention or
+ disclosure.
+
+ b. We will attempt to provide this notice by email, if the users have given
+ us an email address, and by postal mail if the users have provided a
+ postal address.
+
+ c. If the users do not challenge the disclosure request, we may be legally
+ required to turn over their information.
+
+ d. We may delay notice if we, in good faith, believe that an emergency
+ involving danger of death or serious physical injury to any person
+ requires disclosure without delay of information relating to the
+ emergency.
+
+EXCEPTIONS
+
+Data from DNT Users collected by this domain may be logged or retained only in
+the following specific situations:
+
+1. CONSENT / "OPT BACK IN"
+
+ a. DNT Users are opting out from tracking across the Web. It is possible
+ that for some feature or functionality, we will need to ask a DNT User to
+ "opt back in" to be tracked by us across the entire Web.
+
+ b. If we do that, we will take reasonable steps to verify that the users who
+ select this option have genuinely intended to opt back in to tracking.
+ One way to do this is by performing scientifically reasonable user
+ studies with a representative sample of our users, but smaller
+ organizations can satisfy this requirement by other means.
+
+ c. Where we believe that we have opt back in consent, our server will
+ send a tracking value status header "Tk: C" as described in section 6.2
+ of the W3C Tracking Preference Expression draft:
+
+ http://www.w3.org/TR/tracking-dnt/#tracking-status-value
+
+2. TRANSACTIONS
+
+ If a DNT User actively and knowingly enters a transaction with our
+ services (for instance, clicking on a clearly-labeled advertisement,
+ posting content to a widget, or purchasing an item), we will retain
+ necessary data for as long as required to perform the transaction. This
+ may for example include keeping auditing information for clicks on
+ advertising links; keeping a copy of posted content and the name of the
+ posting user; keeping server-side session IDs to recognize logged in
+ users; or keeping a copy of the physical address to which a purchased
+ item will be shipped. By their nature, some transactions will require data
+ to be retained indefinitely.
+
+3. TECHNICAL AND SECURITY LOGGING:
+
+ a. If, during the processing of the initial request (for unique identifiers)
+ or during the subsequent 10 days (for IP addresses and User Agent strings),
+ we obtain specific information that causes our employees or systems to
+ believe that a request is, or is likely to be, part of a security attack,
+ spam submission, or fraudulent transaction, then logs of those requests
+ are not subject to this policy.
+
+ b. If we encounter technical problems with our site, then, in rare
+ circumstances, we may retain logs for longer than 10 days, if that is
+ necessary to diagnose and fix those problems, but this practice will not be
+ routinized and we will strive to delete such logs as soon as possible.
+
+4. AGGREGATION:
+
+ a. We may retain and share anonymized datasets, such as aggregate records of
+ readership patterns; statistical models of user behavior; graphs of system
+ variables; data structures to count active users on monthly or yearly
+ bases; database tables mapping authentication cookies to logged in
+ accounts; non-unique data structures constructed within browsers for tasks
+ such as ad frequency capping or conversion tracking; or logs with truncated
+ and/or encrypted IP addresses and simplified User Agent strings.
+
+ b. "Anonymized" means we have conducted risk mitigation to ensure
+ that the dataset, plus any additional information that is in our
+ possession or likely to be available to us, does not allow the
+ reconstruction of reading habits, online or offline activity of groups of
+ fewer than 5000 individuals or devices.
+
+ c. If we generate anonymized datasets under this exception we will publicly
+ document our anonymization methods in sufficient detail to allow outside
+ experts to evaluate the effectiveness of those methods.
+
+5. ERRORS:
+
+From time to time, there may be errors by which user data is temporarily
+logged or retained in violation of this policy. If such errors are
+inadvertent, rare, and made in good faith, they do not constitute a breach
+of this policy. We will delete such data as soon as practicable after we
+become aware of any error and take steps to ensure that it is deleted by any
+third-party who may have had access to the data.
+
+ADDITIONAL DEFINITIONS
+
+"Fully Qualified Domain Name" means a domain name that addresses a computer
+connected to the Internet. For instance, example1.com; www.example1.com;
+ads.example1.com; and widgets.example2.com are all distinct FQDNs.
+
+"Supercookie" means any technology other than an HTTP Cookie which can be used
+by a server to associate identifiers with the clients that visit it. Examples
+of supercookies include Flash LSO cookies, DOM storage, HTML5 storage, or
+tricks to store information in caches or etags.
+
+"Risk mitigation" means an engineering process that evaluates the possibility
+and likelihood of various adverse outcomes, considers the available methods of
+making those adverse outcomes less likely, and deploys sufficient mitigations
+to bring the probability and harm from adverse outcomes below an acceptable
+threshold.
+
+"Reading habits" includes amongst other things lists of visited DNS names, if
+those domains pertain to specific topics or activities, but records of visited
+DNS names are not reading habits if those domain names serve content of a very
+diverse and general nature, thereby revealing minimal information about the
+opinions, interests or activities of the user.
diff --git a/doc/en/doco.bb b/doc/en/doco.bb
new file mode 100644
index 000000000..7ca64cfea
--- /dev/null
+++ b/doc/en/doco.bb
@@ -0,0 +1,33 @@
+[b]Creating Documentation[/b]
+
+To contribute documentation, simply put some words in a cunning order, and make their existence known to a developer. You can do this literally anywhere as long as a developer can see it. Once made aware, somebody will check it in for you. You should try to avoid proprietary formats, or locations that require authentication with methods other than Zot in order to make it easy for a developer to access, but even this is not a strict requirement.
+
+If you wish to contribute directly, that's fine too. To contribute directly, documentation should be in one of the following formats:
+
+[li]Markdown[/li]
+[li]BBCode[/li]
+[li]HTML[/li]
+[li]Plain Text[/li]
+
+Other formats are also allowed, but support for the format must be added to mod/help.php first.
+
+If editing a plain text file, please keep column width to 80. This is because plain text is used in instances where we may not have a working installation - the installation documentation, for example - and it should be easy to read these from a CLI text editor.
+
+The advantage of Markdown is that it is human readable.
+
+The advantage of BBCode is that it is identity aware.
+
+Therefore, if using BBCode, try to make the most of it:
+[li]Use ZRL links where appropriate to ensure a link to another site retains authentication and keeps identity based documentation working[/li]
+[li]Use baseurl or observer.baseurl tags where appropriate instead of example.com for authenticated viewers.[/li]
+[li]Support non-authenticated users with observer=0 tags. We presently do not do this due to historical oversights. This needs adding everywhere[/li]
+
+[b]Translations[/b]
+
+To translate documentation, or provided documentation in languages other than English:
+[li]Create a directory in doc/ with your two letter country code if it doesn't already exist (eg, doc/de/ for German or doc/fr/ for French)[/li]
+[li]Create a document with the same filename as the English version, but with content in your own language. This allows us to fallback to the English if the translation for a particular page is not provided[/li]
+
+To create documentation that has no equivalent file in English, you can create a new file with a name of your choosing - but you'll also need to provide a localised version of the index page (main.bb in English) to make it accessible from the menu.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/encryption.bb b/doc/en/encryption.bb
new file mode 100644
index 000000000..9985f4b33
--- /dev/null
+++ b/doc/en/encryption.bb
@@ -0,0 +1,18 @@
+[size=large]Builtin Automatic Encryption[/size]
+
+Full disclosure: The encryption $Projectname uses per default is not absolutely waterproof. There [i]are[/i] known procedures to circumvent it. [i]But[/i] this takes a lot of effort and needs to be done individually for each channel. And to make this clear: Other services store your messages in plaintext, therefore we regard this approach as a [i]significant[/i] improvement for your privacy. Plus you are always free to use further encryption and password protection if you so desire.
+
+
+To explain this in more detail:
+
+- each channel has its key pair
+- every non-public post is automatically encrypted
+- optional password protect content via crypto-javascript browser-to-browser encryption (needs to be enabled in settings) Full disclosure: A rogue hub admin could injects malicious javascript-code (e.g. keylogging-abilities) into the code. Encrypt our stuff out of band with GPG, become a hub administrator yourself or use other means of communication if this worries you.
+
+So what is the scope of security? Full disclosure: This might be great, but it is not perfect.
+- every non-public post is automatically encrypted but persons who have access to the site's database and files [i]may[/i] be able to decrypt everything by using these keys which obviously need to be stored on the server. To be clear: The encrypion keys are different for every channel and it is [i]quite an effort[/i] to do this. And again: Other services store your messages in plain text unencrypted. So this [i]is[/i] quite a significant win for your privacy.
+
+We believe that the NSA-level dragnet plaintext extracting mass surveillance is probably not possible due to the design of the zot protocol. Dedicated attacks including hacking into one hub to obtain the server logs and database only partly reveal what is going on between people communication between different hubs. We believe that this makes it much more expensive for state-level attackers to access your content in $Projectname.
+
+
+We gladly accept help improving the security of the system and auditing it as well.
diff --git a/doc/en/external-resource-links.bb b/doc/en/external-resource-links.bb
new file mode 100644
index 000000000..338db8023
--- /dev/null
+++ b/doc/en/external-resource-links.bb
@@ -0,0 +1,21 @@
+[h2]External resource links[/h2]
+[h3]Third-Party Themes[/h3]
+[ul]
+[*][url=https://github.com/omigeot/redstrap3]Redstrap[/url]
+[*][url=https://bitbucket.org/tobiasd/red-clean]Clean[/url]
+[*][url=https://github.com/tonybaldwin/redmatrixthemes/]nubasic[/url]
+[*][url=https://github.com/deadsuperhero/redmatrix-themes]Sean Tilley's themes[/url]
+[/ul]
+[h3]Third-Party addons[/h3]
+[ul]
+[*][url=https://abcentric.net/git/abcjsplugin.git]ABCjs integration - display scores in posts (WIP)[/url]
+[/ul]
+[h3]Related projects[/h3]
+[ul]
+[*][url=https://addons.mozilla.org/en-US/firefox/addon/redshare/]Redshare for Firefox[/url]
+[*][url=https://github.com/cvogeley/red-for-android]Red for Android[/url]
+[*][url=https://github.com/zzottel/feed2red]feed2red.pl (posts Atom/RSS feeds to channel)[/url]
+[*][url=https://wordpress.org/plugins/hubzilla-wp/]WordPress gateway (combine with wppost addon for full features)[/url]
+[/ul]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/extra_features.bb b/doc/en/extra_features.bb
new file mode 100644
index 000000000..17d85228e
--- /dev/null
+++ b/doc/en/extra_features.bb
@@ -0,0 +1,98 @@
+// multiple of these have been enabled by default. should we note this here somewhere, move it or remove them from this file?
+[b]Features[/b]
+
+The default interface of $Projectname was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the Extra Features link of your Settings page.
+
+[b]Content Expiration[/b]
+
+Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in &quot;yyyy-mm-dd hh:mm&quot; format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as &quot;next Thursday&quot; or &quot;+1 day&quot;. At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed.
+
+[b]Multiple Profiles[/b]
+
+The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned.
+
+[b]Web Pages[/b]
+
+Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks.
+
+[b]Private Notes[/b]
+
+On pages where it is available (your matrix page and personal web pages) provide a &quot;widget&quot; to create and store personal reminders and notes.
+
+[b]Extended Identity Sharing[/b]
+
+By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix.
+
+[b]Expert Mode[/b]
+
+This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking.
+
+[b]Premium Channel[/b]
+
+This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect.
+
+[b]Post Preview[/b]
+
+Allows previewing posts and comments exactly as they would look on the page before publishing them.
+
+[b]Channel Sources[/b]
+
+Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel.
+
+[b]Even More Encryption[/b]
+
+Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content &quot;end-to-end&quot; with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as &quot;the name of aunt Claire's first dog&quot;.
+
+[b]Search by Date[/b]
+
+This provides the ability to select posts by date ranges
+
+[b]Privacy Group Filter[/b]
+
+Enable widget to display stream posts only from selected privacy groups. This also toggles the outbound permissions while you are viewing a group. This is analogous to Google &quot;circles&quot; or Disapora &quot;aspects&quot;.
+
+[b]Saved Searches[/b]
+
+Provides a search widget on your matrix page which can save selected search terms for re-use.
+
+[b]Personal Tab[/b]
+
+Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation.
+
+[b]New Tab[/b]
+
+Enables a tab to display all new matrix activity as a firehose or timeline.
+
+[b]Affinity Tool[/b]
+
+Filter matrix stream activity by the depth of your relationships
+
+[b]Edit Sent Posts[/b]
+
+Edit and correct posts and comments after sending
+
+[b]Tagging[/b]
+
+Ability to tag existing posts, including those written by others.
+
+[b]Post Categories[/b]
+
+Add categories to your channel posts
+
+[b]Saved Folders[/b]
+
+Ability to file posts under folders or tags for later recall
+
+[b]Dislike Posts[/b]
+
+Ability to dislike posts/comments
+
+[b]Star Posts[/b]
+
+Ability to mark special posts with a star indicator
+
+[b]Tag Cloud[/b]
+
+Provide a personal tag cloud on your channel page
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/faq_admins.bb b/doc/en/faq_admins.bb
new file mode 100644
index 000000000..0b54a41de
--- /dev/null
+++ b/doc/en/faq_admins.bb
@@ -0,0 +1,78 @@
+[size=large][b]$Projectname FAQ[/b][/size]
+
+[toc]
+
+[h3]Is there a way to change the Admin account?[/h3]
+[h3]Is there a way to have multiple administrators?[/h3]
+Yes, but it's a bit messy at the moment as it is not yet exposed in the UI. To make an account an administrative account,
+one needs to add 4096 to the account_roles entry in the account table of the database. Likewise, to remove administrative permissions,
+one must subtract 4096 from the account roles.
+
+[h3]I can log in, but there are no posts or webpages[/h3]
+
+Most likely, your item table has crashed. Run the MySQL command [code]repair table item;[/code]
+
+[h3]Login doesn't work, immediately after login, the page reloads and I'm logged out[/h3]
+
+Most likely, your session table has crashed. Run the MySQL command [code]repair table session;[/code]
+
+[h3]When I switch theme, I sometimes get elements of one theme superimposed on top of the other[/h3]
+
+a) store/[data]/smarty3 isn't writeable by the webserver. Make it so.
+
+b) You're using Midori, or with certain themes, Konqueror in KHTML mode.
+
+[b]My network tab won't load, it appears to be caused by a photo or video[/h3]
+
+Your PHP memory limit is too low. Increase the size of the memory_limit directive in your php.ini
+
+Contrary to popular belief, the number of users on a hub doesn't make any difference to the required memory limit, rather, the content
+of an individuals matrix counts. Streams with lots of photos and video require more memory than streams with lots of text.
+
+[h3]I have no communication with anybody[/h3]
+
+You're listening on port 443, but do not have a valid SSL certificate. Note this applies even if your baseurl is http.
+Don't listen on port 443 if you cannot use it. It is strongly recommended to solve this problem by installing a browser
+valid SSL certificate rather than disabling port 443.
+
+[h3]How do I update a non-Git install?[/h3]
+1) Backup .htconfig.php
+2) Backup everything in store/
+3) Backup any custom changes in mod/site/ and view/site
+3) Delete your existing installation
+4) Upload the new version.
+5) Upload the new version of themes and addons.
+6) Restore everything backed up earlier.
+
+[h3]What do I need to do when moving my hub to a different server[/h3]
+
+1) Git clone on the new server. Repeat the process for any custom themes, and addons.
+2) Rsync .htconfig.php
+3) Rsync everything in store/
+4) Rsync everything in mod/site/ and view/site (these will only exist if you have custom modules)
+5) Dump and restore DB.
+
+[h3]How do I reinstall an existing hub on the same server?[/h3]
+
+1) [code]git reset --hard HEAD[/code] will reset all files to their upstream defaults. This will not reset any local files that do not also exist upstream. Eg, if you have local changes to mod/channel.php, this will reset them - but will not reset any changes in mod/site/channel.php
+2) If you absolutely must reinstall - for example, if you need to upgrade operating system - follow the steps for moving to a different server, but instead of using rsync, backup and restore some other way.
+
+Do not reinstall a hub with a fresh database and fresh .htconfig.php unless as a very last resort. Creating a temporary account and ask for help via a support channel for non-trivial reinstalls is preferable to reinstalling fresh.
+
+[h3]How do I set the default homepage for logged out viewers?[/h3]
+
+Use the custom_home addon available in the main addons repository.
+
+[h3]What do the different directory mode settings mean?[/h3]
+[code]// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory (all of your member's queries will be directed elsewhere)
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror (keeps in sync with realm primary [adds significant cron execution time])
+// DIRECTORY_MODE_PRIMARY = main directory server (you do not want this unless you are operating your own realm. one per realm.)
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services (only local site members in directory)
+[/code]
+- The default is NORMAL. This off-loads most directory services to a different server. The server used is the config:system/directory_server. This setting MAY be updated by the code to one of the project secondaries if the current server is unreachable. You should either be in control of this other server, or should trust it to use this setting.
+- SECONDARY. This allows your local site to act as a directory server without exposing your member's queries to another server. It requires extra processing time during the cron polling, and is not recommended to be run on a shared web host.
+- PRIMARY. This allows you to run a completely separate 'Network' of directory servers with your own Realm. By default, all servers are on the RED_GLOBAL realm unless the config:system/directory_realm setting is overridden. [i]Do not use this unless you have your own directory_realm.[/i]
+- STANDALONE. This is like primary, except it's a 'Network' all on it's own without talking to any other servers. Use this if you have only one server and want to be segregated from the Red#Matrix directory listings.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/feature/access_tokens.bb b/doc/en/feature/access_tokens.bb
new file mode 100644
index 000000000..eb5c03717
--- /dev/null
+++ b/doc/en/feature/access_tokens.bb
@@ -0,0 +1,47 @@
+Feature: Zot Access Tokens
+Status: Draft
+Date: 15 July 2016
+
+
+Purpose:
+
+In order to facilitate sharing of private resources with non-members or members of federation nodes with limited identification discovery, Hubzilla should provide members with a mechanism to create and manage temporary ("throwaway") logins, aka "Zot Access Tokens". These tokens/credentials may be used to authenticate to a hubzilla site for the sole purpose of accessing privileged or access controlled resources (files, photos, posts, webpages, chatrooms, etc.).
+
+
+Scope:
+
+Zot Access Tokens do not convey membership in the site or network. In particular, they do not provide an account or channel; which may be necessary to interact with the hub owner or with others in the network or federation of networks. In most cases they can only be used to consume restricted resources and do not have an ability to create those resources, however this ability may be provided by custom configurations or in future releases or addons.
+
+For instance the ability for a temporary login to access a chatroom may provide suitable permission to create chat messages inside that chatroom.
+
+
+Implementation:
+
+Zot Access Tokens are managed through a "tab" of the settings page. Access to this tab may be controlled by site configuration. On this page, channels may create, edit, list, and remove any access tokens under their control.
+
+The form to create/edit accepts three parameters, a human readable name, a password or access token, and an optional expiration. Once expired, the access token is no longer valid, may no longer be used, and will be automatically purged from the list of temporary accounts. The password field in the create/edit forms displays the text of the access token and not an obscured password. By default we will create a token using the autoname() function, which generally produces a random character sequence which is "pronounceable", hence easy to convey or remember. This can be changed to any other character sequence which is acceptable to the site password complexity policy. (In most Hubzilla installations this imposes a minimum of three characters, but may be extended by plugin or site policy).
+
+
+Usage:
+
+We do not specify mechanisms for sharing these tokens with others. Any communication method may be used. Any tokens you have created are added to the Access Control List selector and may be used anywhere that Access Control Lists are provided.
+
+ Example: A visitor arrives at your site. She has an access token you have provided, and attempts to visit one of your photo albums (which is restricted to be viewed only by yourself and one temporary identity). Permission is denied.
+
+The visitor now selects "Login" from the menu navigation bar. This presents a login page. She enters the name and password you have provided her, and she can now view the restricted photo album.
+
+
+Alternatively, you may share a link to a protected file by adding a parameter "&zat=abc123" to the URL, where the string "abc123" is the access token or password for the temporary login. No further negotiation is required, and the file is presented.
+
+Zot Acess Tokens are represented internally as an authenticated "observer". Querying the observer in code should return a pseudo or system generated xchan with an unknown protocol and a default profile photo. It will match (successfully) any access control rule which allows authenticated observers.
+
+Security Considerations:
+
+The URL form of authentication is inherently less secure than using a login, but may be preferable for some uses of this feature. It probably should not be transmitted over non-SSL links.
+
+
+Future development:
+
+It might be desirable for future implementations to provide an options for single-use, where the access token is removed promptly following first use.
+
+ \ No newline at end of file
diff --git a/doc/en/feature/additional/access.md b/doc/en/feature/additional/access.md
new file mode 100644
index 000000000..b7f0df717
--- /dev/null
+++ b/doc/en/feature/additional/access.md
@@ -0,0 +1,41 @@
+## Access Control and Permissions
+
+
+### Privacy Groups
+
+Enable management and selection of privacy groups.
+<!-- TODO: full description for Privacy Groups -->
+
+Minimum required technical skill level to see this feature: 0
+
+
+### Multiple Profiles
+
+Ability to create multiple profiles.
+<!-- TODO: full description for Multiple Profiles -->
+
+Minimum required technical skill level to see this feature: 3
+
+
+### Permission Categories
+
+Provide alternate connection permission limits.
+<!-- TODO: full description for Permission Categories -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### OAuth Clients
+
+Manage authenticatication tokens for mobile and remote apps.
+<!-- TODO: full description for OAuth Clients -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Access Tokens
+
+Create access tokens so that non-members can access private content.
+<!-- TODO: full description for Access Tokens -->
+
+Minimum required technical skill level to see this feature: 2
diff --git a/doc/en/feature/additional/composition.md b/doc/en/feature/additional/composition.md
new file mode 100644
index 000000000..1256f7501
--- /dev/null
+++ b/doc/en/feature/additional/composition.md
@@ -0,0 +1,67 @@
+## Post Composition Features
+
+
+### Large Photos
+
+Include large (1024px) photo thumbnails in posts.
+If not enabled, use small (640px) photo thumbnails
+<!-- TODO: full description for Large Photos -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Channel Sources
+
+Automatically import channel content from other channels or feeds
+<!-- TODO: full description for Channel Sources -->
+
+Minimum required technical skill level to see this feature: 3
+
+
+### Even More Encryption
+
+Allow optional encryption of content end-to-end with a shared secret key
+<!-- TODO: full description for Even More Encryption -->
+
+Minimum required technical skill level to see this feature: 3
+
+
+### Enable Voting Tools
+
+Provide a class of post which others can vote on
+<!-- TODO: full description for Enable Voting Tools -->
+
+Minimum required technical skill level to see this feature: 3
+
+
+### Disable Comments
+
+Provide the option to disable comments for a post
+<!-- TODO: full description for Disable Comments -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Delayed Posting
+
+Allow posts to be published at a later date
+<!-- TODO: full description for Delayed Posting -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Content Expiration
+
+Remove posts/comments and/or private messages at a future time
+<!-- TODO: full description for Content Expiration -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Suppress Duplicate Posts/Comments
+
+Prevent posts with identical content to be published
+with less than two minutes in between submissions.
+<!-- TODO: full description for Suppress Duplicate Posts/Comments -->
+
+Minimum required technical skill level to see this feature: 1
diff --git a/doc/en/feature/additional/filtering.md b/doc/en/feature/additional/filtering.md
new file mode 100644
index 000000000..ba8e1e29f
--- /dev/null
+++ b/doc/en/feature/additional/filtering.md
@@ -0,0 +1,57 @@
+## Network and Stream Filtering
+
+
+### Search by Date
+
+Ability to select posts by date ranges
+<!-- TODO: full description for Search by Date -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Saved Searches
+
+Save search terms for re-use
+<!-- TODO: full description for Saved Searches -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Network Personal Tab
+
+Enable tab to display only Network posts that you've interacted on
+<!-- TODO: full description for Network Personal Tab -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Network New Tab
+
+Enable tab to display all new Network activity
+<!-- TODO: full description for Network New Tab -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Affinity Tool
+
+Filter stream activity by depth of relationships
+<!-- TODO: full description for Affinity Tool -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Suggest Channels
+
+Show friend and connection suggestions
+<!-- TODO: full description for Suggest Channels -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Connection Filtering
+
+Filter incoming posts from connections based on keywords/content
+<!-- TODO: full description for Connection Filtering -->
+
+Minimum required technical skill level to see this feature: 3
diff --git a/doc/en/feature/additional/general.md b/doc/en/feature/additional/general.md
new file mode 100644
index 000000000..a1b712b12
--- /dev/null
+++ b/doc/en/feature/additional/general.md
@@ -0,0 +1,130 @@
+## General Features
+
+
+### New Member Links
+
+Display new member quick links menu.
+<!-- TODO: full description for New Member Links -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Advanced Profiles
+
+Additional profile sections and selections
+<!-- TODO: full description for Advanced Profiles -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Profile Import/Export
+
+Save and load profile details across sites/channels
+<!-- TODO: full description for Profile Import/Export -->
+
+Minimum required technical skill level to see this feature: 3
+
+
+### Web Pages
+
+Provide managed web pages on your channel
+<!-- TODO: full description for Web Pages -->
+
+Minimum required technical skill level to see this feature: 3
+
+
+### Wiki
+
+Provide a wiki for your channel
+<!-- TODO: full description for Wiki -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Private Notes
+
+Enables a tool to store notes and reminders (note: not encrypted)
+<!-- TODO: full description for Private Notes -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Cards
+
+Create personal planning cards
+<!-- TODO: full description for Cards -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Articles
+
+Create interactive articles
+<!-- TODO: full description for Articles -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Navigation Channel Select
+
+Change channels directly from within the navigation dropdown menu
+<!-- TODO: full description for Navigation Channel Select -->
+
+Minimum required technical skill level to see this feature: 3
+
+
+### Photo Location
+
+If location data is available on uploaded photos, link this to a map.
+<!-- TODO: full description for Photo Location -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Access Controlled Chatrooms
+
+Provide chatrooms and chat services with access control.
+<!-- TODO: full description for Access Controlled Chatrooms -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Smart Birthdays
+
+Make birthday events timezone aware in case your friends are scattered across the planet.
+<!-- TODO: full description for Smart Birthdays -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Event Timezone Selection
+
+Allow event creation in timezones other than your own.
+<!-- TODO: full description for Event Timezone Selection -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Premium Channel
+
+Allows you to set restrictions and terms
+on those that connect with your channel
+<!-- TODO: full description for Premium Channel -->
+
+Minimum required technical skill level to see this feature: 4
+
+
+### Advanced Directory Search
+
+Allows creation of complex directory search queries
+<!-- TODO: full description for Advanced Directory Search -->
+
+Minimum required technical skill level to see this feature: 4
+
+
+### Advanced Theme and Layout Settings
+
+Allows fine tuning of themes and page layouts
+<!-- TODO: full description for Advanced Theme and Layout Settings -->
+
+Minimum required technical skill level to see this feature: 4
diff --git a/doc/en/feature/additional/overview.md b/doc/en/feature/additional/overview.md
new file mode 100644
index 000000000..b51f60bcd
--- /dev/null
+++ b/doc/en/feature/additional/overview.md
@@ -0,0 +1,33 @@
+[chset]: /settings "Channel Settings"
+[ftset]: /settings/features "Additional Features Settings"
+[ftgen]: /help/feature/additional/general "General Features"
+[ftacc]: /help/feature/additional/access "Access Control and Permissions"
+[ftcom]: /help/feature/additional/composition "Post Composition Features"
+[ftfil]: /help/feature/additional/filtering "Network and Stream Filtering"
+[ftpos]: /help/feature/additional/posts "Post/Comment Tools"
+
+
+# Additional Features
+
+<!-- TODO: Introduction to additional features -->
+
+<!-- TODO: Short info and crosslink on techlevels -->
+
+You can switch the features on and off from the
+[Additional Features][ftset] link in the [Channel Settings][chset].
+
+<!-- TODO: Infos about feature visibility and causes/dependencies -->
+
+The following pages decribe all the available features
+grouped in the same way as they are with the accordion tabs on the
+[Additional Features][ftset] settings page:
+
+[General Features][ftgen]
+
+[Access Control and Permissions][ftacc]
+
+[Post Composition Features][ftcom]
+
+[Network and Stream Filtering][ftfil]
+
+[Post/Comment Tools][ftpos]
diff --git a/doc/en/feature/additional/posts.md b/doc/en/feature/additional/posts.md
new file mode 100644
index 000000000..d3f6b37db
--- /dev/null
+++ b/doc/en/feature/additional/posts.md
@@ -0,0 +1,57 @@
+## Post/Comment Tools
+
+
+### Community Tagging
+
+Ability to tag existing posts
+<!-- TODO: full description for Community Tagging -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Post Categories
+
+Add categories to your posts
+<!-- TODO: full description for Post Categories -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Emoji Reactions
+
+Add emoji reaction ability to posts
+<!-- TODO: full description for Emoji Reactions -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Saved Folders
+
+Ability to file posts under folders
+<!-- TODO: full description for Saved Folders -->
+
+Minimum required technical skill level to see this feature: 2
+
+
+### Dislike Posts
+
+Ability to dislike posts/comments
+<!-- TODO: full description for Dislike Posts -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Star Posts
+
+Ability to mark special posts with a star indicator
+<!-- TODO: full description for Star Posts -->
+
+Minimum required technical skill level to see this feature: 1
+
+
+### Tag Cloud
+
+Provide a personal tag cloud on your channel page
+<!-- TODO: full description for Tag Cloud -->
+
+Minimum required technical skill level to see this feature: 2
diff --git a/doc/en/federate.bb b/doc/en/federate.bb
new file mode 100644
index 000000000..9137ec160
--- /dev/null
+++ b/doc/en/federate.bb
@@ -0,0 +1,71 @@
+[h2]Creating protocol federation services[/h2]
+
+There are three main components to writing federation plugins. These are:
+
+[1] Channel discovery and making connections
+[2] Sending posts/messages
+[3] Receiving posts/messages
+
+In addition, federation drivers must handle
+
+[4] differences in privacy policies (and content formats)
+
+
+[h3]Making connections[/h3]
+
+The core application provides channel discovery in the following sequence:
+
+[1] Zot channel discovery
+[2] Webfinger (channel@hub) lookup
+ [2.1] RFC7033 webfinger
+ [2.2] XRD based webfinger (old style)
+[3] URL discovery (currently only used to discover RSS feeds)
+[4] If all of these fail, the network is "unknown" and we are unable to communicate with or connect with the channel. An 'xchan' record [i]may[/i] still be created [b]if[/b] there is enough information known to identify a unique channel.
+
+Any of the lookup services may be bound to a plugin and extended. When a channel is discovered, we create an 'xchan' record which is a platform neutral representation of the channel identity. If we need to send information to the channel, a 'hubloc' (hub location) record is also generally required. A 'follow' plugin hook is provided to bypass webfinger and this discovery sequence completely.
+
+The final step in gluing this together is to create an 'abook' record, which attaches an xchan in a relationship to a local channel with a given set of permissions.
+
+For networks which do not support nomadic identity, your plugin must also set "abook_instance" which is a comma-separated list of local URLs that the remote channel is connected with. For instance if your member was connected to my channel clone at https://example.com, the abook_instance for that connection would read 'https://example.com'. If you also connected to my clone at https://abc.example.com, the string would be changed to 'https://example.com,https://abc.example.com'. This allows local channels to differentiate which instance a given remote channel is connected with and avoid delivery failures to those channels from other clone instances.
+
+A federation plugin for a webfinger based system needs only to examine the webfinger or XRD results and identify a protocol stack which can be used to connect or communicate. Then create an xchan record with the given 'xchan_network' type and a hubloc record with the same 'hubloc_network' with the information given. Currently the plugin will need to create the entire record, but in the future this will be extended so that the plugin only need identify a network name and the record will be populated with all other known values.
+
+An xchan record is always required in order to connect. To connect, create an abook record with the desired permissions.
+
+Additional information that your plugin requires for communication can be stored in the xconfig table and/or abconfig table if there is no convenient or appropriate table column in the xchan or hubloc tables.
+
+When a connection is made, we generally call the notifier (include/notifier.php) to send a message to the remote channel. This is bound to the hook 'permissions_create'. Your plugin will need to handle this in order to send a "follow" or "make friends" message to the other network.
+
+Notes: The first stage zot lookup will be replaced with a webfinger lookup. This work is in progress. A separate lookup was required initially as webfinger does not allow non-SSL connections. We will provide non-SSL zot lookups (usually test and development sites) via the "old" XRD based webfinger to avoid this limitation.
+
+The core application will attempt to create xchan records for projects identified as members of the "open web"; currently Hubzilla, Friendica, Diaspora, GNU-Social and Pump.io. This is so that comments can be passed amongst project sites and the network correctly identified. A federation plugin is required to fully federate with other networks, but comments may be passed to sites without such a plugin installed so that there are no unexplained holes in conversations.
+
+The core application must also provide signing ability for Diaspora comments since they require a special signing format and must be signed by the comment author regardless of whether that channel federates with Diaspora. The owner of the conversation may federate with Diaspora so the comments must be signed. This is unfortunate but necessary.
+
+
+[h3]Sending Messages[/h3]
+
+Whenever any message is sent (with the sole exception of directory communications), we invoke the notifier (include/notifier.php), and pass it the type of message and generally an identifier to lookup the information being sent from the database (items or conversational things, private mail, permissions updates, etc.).
+
+The notifier has several hooks which may be used by plugins in different ways, depending on how their delivery loop works. For different message types and complex delivery situations you may need to tie into multiple hooks. The 'permissions_create' hook was mentioned in the first section. There is also a 'permissions_update' message if permissions have changed and the other end of the link needs to be advised. Few services will provide or handle this (as their permissions are static), but it is also used for instance to send profile and profile photo update messages and you may wish to handle this.
+
+The next plugin hook is 'notifier_process'. It is passed an array providing the complete state of the notifier and is called once per notifier invocation. It contains the complete list of recipients (with xchan_network set for each).
+
+There is also 'notifier_hub' which like 'notifier_process' is passed the complete state of the notifier, but the difference is that it is called for each individual hub or distinct URL delivery and may be matched on the hubloc_network type. Hub delivery is much more efficient than recipient delivery but may not be suitable for all protocol stacks.
+
+
+Your plugin will be required to understand the message state and recipients and translate the sent item to the desired format. You will also be required to check privacy and block communication to anybody but the intended recipients - *if* it is a private communication. The plugin will often at this point stick the message into the queue and return the queue id to the notifier.
+
+
+Queue handlers exist already for simple posted data. If you create a queue entry with 'post' type we'll open an HTTP POST request and post the data provided and acknowledge success or failure. You can create other forms of communication by providing a different outq_driver type and handling the processing of queue requests yourself. Delivery reporting is available if you wish to acknowledge different error conditions, or anything beyond success/failure. Advanced delivery reporting will also require a custom queue type. The basic 'post' type only deals with success (communication successful with the remote site) and failure.
+
+
+
+[h3]Receiving Messages[/h3]
+
+
+Receiving messages from the remote network will probably require a 'receive' endpoint or module dedicated to your network communication protocol. This is a URL route that your plugin may need to register with the'module_loaded' hook. You module will then take responsibility for importing any data which arrives at that endpoint and translating it to the format required for this project and storing the resulting data. The basic structure we use is an extensible activitystream item but with slightly different field names and several optional fields. It can be easily mapped to an activitystream. Additional data can be stored in the "iconfig" table. item_store() and item_store_update() are generally used to store the data and send appropriate notifications. Similiar facilities are available for private mail and profile information.
+
+
+
+
diff --git a/doc/en/filesync.md b/doc/en/filesync.md
new file mode 100644
index 000000000..4c64bdb09
--- /dev/null
+++ b/doc/en/filesync.md
@@ -0,0 +1,61 @@
+File Sync and Clone
+===================
+
+
+
+File cloning across multiple instances of a channel is a very hard problem, due to the nature of PHP memory allocation. This needs to be handled dramatically differently than cloning or syncing of other information. (Processing one large video file or 40-50 photos could exhaust memory). Therefore we can't easily just dump all the data to a dump file and sequentially process it. Loading the dump file itself is likely to exhaust memory.
+
+There are also two primary operations we are considering. The first is the hardest - saving and then importing all your channel information into a new channel clone. The second is synchronising file changes as they occur across two or more "active" clones.
+
+For the first cut at this tool we will concentrate on the second case, while trying to maintain some measure of compatibility with the first case so that we can re-use the same tools.
+
+Meta Data
+=========
+
+
+First we need the metadata for the file in order to precisely re-construct its structure on another site. This requires the following information:
+
+'attach' structure (without file contents - which is the default) for the file itself **and** its parent directories so that we can re-create its precise place in the file system, since we do not know if the parent directory has been imported previously or ever.
+
+'photo' structure for any photo elements which were created as a result of uploading this file into the system. This typically contains several different 'scales' or thumbnail images, some of which may be cropped for profile photo use or cover photo use. We need to retain the cropping information which is not present in the metadata, but only in the stored data. The actual thumbnail image data may or may not be included in the metadata. A cover photo of large scale (scale #7) could potentially cause memory issues. Not as bad as a 100M video, but if you have several of these they could add up.
+
+'item' entries which are linked to this file. These can be file share activities, the "parent item" linked to photos, and any attached conversation items (photo likes, comments, etc.)
+
+All of these items will require URL replacement and re-signing of the item as they are relocated to another site.
+
+
+File Data
+=========
+
+Then we have the actual file data we need to reconstruct the file. This needs to be stored separately from the meta-data to avoid memory exhaustion when processing. The actual file data can be used to reconstruct the attach structure and the first four photo scales. If this is a photo, we need access to the "#4 scale" (profile photo) and the #7 scale (cover photo) as they were originally cropped. All other thumbnails can be generated from these.
+
+
+
+File Sync
+=========
+
+
+We will consider this operation first because it is probably the most straightforward to implement. When a photo is added to or removed or changed from the source system, we will send a clone sync packet to all known clones containing the metadata - but **no file data** . We can only send one sync packet per file operation that needs to be synced.
+
+The receiving end will create and perform URL translation on all the metadata structures and store them. Then it will need to fetch the actual data. Assuming CURL supports streaming, an authenticated request is sent to the original site and the original file is requested and streamed directly to disk (bypassing all processing). If photo scale #4 or scale #7 is required, these are requested and stored into their respective structures. We're assuming in this case that the cover photo large scale will not exhaust memory. If CURL cannot be made to support streaming, request packets need to be queued and sent to the origination site to obtain "chunks" of the file and re-assembled once all chunks have been retrieved.
+
+The authenticated request depends on the mechanism. For CURL streaming, some signed secret with a timestamp will probably need to be generated and posted to the file origination site. Then the data can be retrieved with minimal internal processing and dumped directly to disk using stdio buffering. In the case of a zot request, the zot request packet will be validated, however scheduling chunk batches and re-assembling them could be tricky.
+
+
+File Backup/Restore
+===================
+
+This is much more complicated as we do not have an authenticate web server to request data from. The metadata can be mostly the same, but we need some form of signalling that we will not be fetching the file via the web. This will likely require a client side process to parse each metadata file and locate a file on disk which it is associated with. Then the data would need to be streamed to the destination server with a special endpoint designed for this task. A java app might be the best option here to retain platform neutrality.
+
+Another option would be to use WebDAV for this step. The metadata files would be uploaded first, and then the data files. If a data file corresponded to an existing metadata file, the metadata would be processed; the file stored appropriately, and the metadata file then removed. In this case, photos of scales 4 and 7 would need to be provided in the metadata.
+
+
+Optionally, this step could also be performed with a filesystem local to the destination server. This would be the highest performance, and a suite of shell-based tools (in the case of Linux) could perform the "client-side" of the task.
+
+The complexity of this task mandates careful planning into how the data is organised and stored and if necessary backed up remotely or transmitted for backup by the source website.
+
+
+Backward Compatibility
+======================
+
+There are some obvious issues with making data available for backup or cloning which existed on the system prior to the existence of restore/sync tools. To keep the tools themselves relatively uncomplicated (to the extent possible given the constraints) backward compatibility may have to be preformed by dedicated plugin or addon. \ No newline at end of file
diff --git a/doc/en/first-post.bb b/doc/en/first-post.bb
new file mode 100644
index 000000000..cf6ed5b49
--- /dev/null
+++ b/doc/en/first-post.bb
@@ -0,0 +1,3 @@
+[size=large]Your first posting[/size]
+
+... to be written ...
diff --git a/doc/en/gdpr1.md b/doc/en/gdpr1.md
new file mode 100644
index 000000000..daa401a3d
--- /dev/null
+++ b/doc/en/gdpr1.md
@@ -0,0 +1,114 @@
+
+Privacy Notice May 2018
+
+How your information will be used
+=================================
+
+Information you provide to this website may be stored and used to provide services to you.
+
+We require an email address to idenitfy the account holder. This will not be shared with
+any other website or service. It is used to send you notifications about your account and
+perform administrative tasks such as resetting your password. You have the option to
+opt-out of all email notifications through your settings.
+
+Communication channels created on this website require a name and a photo or avatar. A
+default avatar will be chosen if you do not supply one. The name, avatar, and a link to
+the channel webpage will be shared with other servers and services in order to refer to
+this identity. The name does not need to be your real name and the photo or avatar does
+not need to resemble you.
+
+All other information you supply to this website is optional.
+
+As a social communication and cloud storage service, you will usually be using this website
+to share information with others. We provide a range of privacy options to allow you to
+restrict this sharing to only those you choose.
+
+
+Processing of your information
+==============================
+
+Our processing of your information is limited to storing it for you to use. We MAY keep logs
+of activity to help diagnose software issues and to maintain security of the system against
+intrusion. These logs are routinely deleted after a few days.
+
+We MAY (if you have provided this permission) try to suggest frendships or connections based
+on analysing publicly available information about your connections. This is currently the most
+advanced data "processing" performed at this website. You may restrict access to this information
+if this processing is undesired.
+
+If supplied, we MAY use your gender to formulate text messages in your native language, for
+instance "Bob commented on HIS post."
+
+In all other cases, your data is stored under your desired privacy policy and to the best
+of our ability is only shared with those who you have elected to share it with.
+
+We do not share your private information with third parties or analyse your behaviour or personal
+characteristics. We have no advertisements or business relationships with advertisers.
+
+We MAY be asked or forced to divulge information provided by you in response to legitimate
+criminal and legal proceedings. Where possible we will notify you if this happens.
+
+
+Access to your information
+==========================
+
+Some communications are shared with other websites. Those using the same software will usually
+have similar privacy policies.
+
+
+You may be shown embedded videos and provided links to visit other websites as part of your
+day-to-day activities using this website. This MAY expose you to monitoring by external services, such
+as (but not limited to) Facebook, Twitter, and Google. Each website operator is allowed to configure
+whether or not embedded content is permitted.
+
+Further access to your personal data and stored files is under your control.
+
+Our storage of your data is provided under your implied consent through your continued use of
+the service. You may withdraw this consent at any time and on account deletion we will remove
+all data which belongs to you. The process of deletion may take several days as we also make a good faith
+effort to delete it from any internetworked websites that have been provided a copy.
+
+
+All data and files stored for a communications channel are available for you to
+download for either archival puposes or to transfer to another compatible website.
+
+
+
+Your rights
+===========
+
+Under the General Data Protection Regulation
+(GDPR) and The Data Protection Act 2018
+(DPA) you have a number of rights with regard to your personal data.
+You have the right to request from us access to and rectification or erasure of your personal data,
+the right to restrict processing, object to processing as well as in certain circumstances the right
+to data portability.
+
+If you have provided consent for the processing of your data you have the right (in certain
+circumstances) to withdraw that consent at any time which will not affect the lawfulness of
+the processing before your consent was withdrawn.
+
+You have the right to lodge a complaint to the Information Commissioners’ Office if you
+believe that we have not complied with the requirements of the GDPR or DPA 18 with regard
+to your personal data.
+
+Identity and contact details of controller and data protection officer
+
+[NAME OF COMPANY]
+is the controller
+[and processor]
+of data for the purposes of the DPA 18 and GDPR. 3
+
+If you have any concerns as to how your data is processed you can contact:
+
+[
+[NAME]
+Data Protection Offer at
+[EMAIL ADDRESS]
+]
+[NAME] [JOB TITLE]
+at
+[EMAIL ADDRESS]
+or you can write to these
+individuals using the address of
+[]
diff --git a/doc/en/general.bb b/doc/en/general.bb
new file mode 100644
index 000000000..0b80db756
--- /dev/null
+++ b/doc/en/general.bb
@@ -0,0 +1,18 @@
+[h2]Project and site information[/h2]
+[h3]$Projectname[/h3]
+[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl]
+[zrl=[baseurl]/help/project/governance]Project Governance[/zrl]
+[zrl=[baseurl]/help/contributor/convenant]Project Covenant and Code of Conduct[/zrl]
+
+[h3]External resources[/h3]
+[zrl=[baseurl]/help/external-resource-links]List of external resources[/zrl]
+[url=https://framagit.org/hubzilla/core/]Main Website[/url]
+[url=https://framagit.org/hubzilla/addons]Addon Website[/url]
+[url=[baseurl]/help/credits]$Projectname Credits[/url]
+[h3]About this $Projectname hub[/h3]
+[zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl]
+[zrl=[baseurl]/siteinfo]Hub Information (/siteinfo)[/zrl]
+[zrl=[baseurl]/siteinfo/json]Detailed Technical Hub Information in JSON format(/siteinfo/json)[/zrl]
+
+#include doc/macros/main_footer.bb;
+
diff --git a/doc/en/git_for_non_developers.bb b/doc/en/git_for_non_developers.bb
new file mode 100644
index 000000000..5fba17439
--- /dev/null
+++ b/doc/en/git_for_non_developers.bb
@@ -0,0 +1,71 @@
+[b]Git For Non-Developers[/b]
+
+So you're handling a translation, or you're contributing to a theme, and every time you make a pull request you have to talk to one of the developers before your changes can be merged in?
+
+Chances are, you just haven't found a quick how-to explaining how to keep things in sync on your end. It's really very easy.
+
+After you've created a fork of the repo (just click &quot;fork&quot; at github), you need to clone your own copy.
+
+For the sake of examples, we'll assume you're working on a theme called redexample (which does not exist).
+
+[code]git clone https://github.com/username/red.git[/code]
+
+Once you've done that, cd into the directory, and add an upstream.
+
+[code]
+cd red
+git remote add upstream https://framagit.org/hubzilla/core/
+[/code]
+
+From now on, you can pull upstream changes with the command
+[code]git fetch upstream[/code]
+
+Before your changes can be merged automatically, you will often need to merge upstream changes.
+
+[code]
+git merge upstream/master
+[/code]
+
+You should always merge upstream before pushing any changes, and [i]must[/i] merge upstream with any pull requests to make them automatically mergeable.
+
+99% of the time, this will all go well. The only time it won't is if somebody else has been editing the same files as you - and often, only if they have been editing the same lines of the same files. If that happens, that would be a good time to request help until you get the hang of handling your own merge conflicts.
+
+Then you just need to add your changes [code]git add view/theme/redexample/[/code]
+
+This will add all the files in view/theme/redexample and any subdirectories. If your particular files are mixed throughout the code, you should add one at a time. Try not to do git add -a, as this will add everything, including temporary files (we mostly, but not always catch those with a .gitignore) and any local changes you have, but did not intend to commit.
+
+Once you have added all the files you have changed, you need to commit them. [code]git commit[/code]
+
+This will open up an editor where you can describe the changes you have made. Save this file, and exit the editor.
+
+Finally, push the changes to your own git
+[code]git push[/code]
+
+And that's it, your repo is up to date!
+
+All you need to do now is actually create the pull request. There are two ways to do this.
+
+The easy way, if you're using Github is to simply click the green button at the top of your own copy of the repository, enter a description of the changes, and click 'create pull request'. The
+main repository, themes, and addons all have their main branch at Github, so this method can be used most of the time.
+
+Most people can stop here.
+
+Some projects in the extended RedMatrix ecosphere have no Github presence, to pull request these is a bit different - you'll have to create your pull request manually. Fortunately, this isn't
+much harder.
+
+[code]git request-pull -p <start> <url>[/code]
+
+Start is the name of a commit to start at. This must exist upstream. Normally, you just want master.
+
+URL is the URL of [i]your[/i] repo.
+
+One can also specify <end>. This defaults to HEAD.
+
+Example:
+[code]
+git request-pull master https://example.com/project
+[/code]
+
+And simply send the output to the project maintainer.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/hidden_configs.bb b/doc/en/hidden_configs.bb
new file mode 100644
index 000000000..4eac1aa6e
--- /dev/null
+++ b/doc/en/hidden_configs.bb
@@ -0,0 +1,127 @@
+[h1]Advanced Configurations for Administrators[/h1]
+
+[i]This document assumes you're an administrator.[/i]
+
+$Projectname contains many configuration options hidden from the main admin panel. These are generally options considered too niche, advanced or prone do confusion.
+
+These settings can be modified through the shell, from the the top level web directory, with the syntax:
+
+[code]util/config cat key value[/code]
+for a site configuration, or
+
+[code]util/pconfig channel_id cat key value[/code]
+for a member configuration.
+
+For a site configuration, another option is to add a line to .htconfig.php, with the syntax:
+[code]App::$config['cat']['key'] = 'value';[/code]
+
+
+[h2]Member configuration (pconfig)[/h2]
+
+[dl terms="mb"]
+ [*= system.always_my_theme ] Always use your own theme when viewing channels on the same hub. This will break in some quite imaginative ways when viewing channels with theme dependent Comanche.
+ [*= system.blocked ] An array of xchans blocked by this channel. Technically, this is a hidden config and does belong here, however, addons (notably superblock) have made this available in the UI.
+ [*= system.default_cipher ] Set the default cipher used for E2EE items.
+ [*= system.display_friend_count ] Set the number of connections to display in the connections profile widget.
+ [*= system.do_not_track ] As the browser header. This will break many identity based features. You should really just set permissions that make sense.
+ [*= system.forcepublicuploads ] Force uploaded photos to be public when uploaded as wall items. It makes far more sense to just set your permissions properly in the first place. Do that instead.
+ [*= system.network_page_default ] Set default params when viewing the network page. This should contain the same querystring as manual filtering.
+ [*= system.paranoia ] Sets the security level of IP checking. If the IP address of a logged-in session changes apply this level to determine if the account should be logged out as a security breach.
+Options are:
+ 0 &mdash; no IP checking
+ 1 &mdash; check 3 octets
+ 2 &mdash; check 2 octets
+ 3 &mdash; check for any difference at all
+
+ [*= system.prevent_tag_hijacking ] Prevent foreign networks hijacking hashtags in your posts and directing them at its own resources.
+ [*= system.startpage ] Another of those technically hidden configs made available by addons. Sets the default page to view when logging in. This is exposed to the UI by the startpage addon.
+ [*= system.taganyone ] Requires the config of the same name to be enabled. Allow the @mention tagging of anyone, whether you are connected or not. This doesn't scale.
+ [*= system.anonymous_comments ] By default or if set to 1, custom permissions can be set to allow anonymous (moderated) comments like WordPress, moderated by the channel owner. If set to 0, no member of your site can select or enable this.
+ [*= system.user_scalable ] Determine if the app is scalable on touch screens. Defaults to on, to disable, set to zero - real zero, not just false.
+[/dl]
+
+[h2]Site configuration[/h2]
+
+[dl terms="mb"]
+ [*= randprofile.check ] When requesting a random profile, check that it actually exists first
+ [*= randprofile.retry ] Number of times to retry getting a random profile
+ [*= system.admin_email ] Specifies the administrator's email for this site. This is initially set during install.
+ [*= system.authlog ] Logfile to use for logging auth errors. Used to plug in to server side software such as fail2ban. Auth failures are still logged to the main logs as well.
+ [*= system.auto_channel_create ] Add the necessary form elements to create the first channel on the account registration page, and create it (possibly following email validation or administrator approval). This precludes the ability to import a channel from another site as the first channel created on this site for a new account. Use with system.default_permissions_role to streamline registration.
+ [*= system.auto_follow ] Make the first channel of an account auto-follow channels listed here - comma separated list of webbies (member@hub addresses).
+ [*= system.blacklisted_sites ] An array of specific hubs to block from this hub completely.
+ [*= system.block_public_search ] Similar to block_public, except only blocks public access to search features. Useful for sites that want to be public, but keep getting hammered by search engines.
+ [*= system.cron_hour ] Specify an hour in which to run cron_daily. By default with no config, this will run at midnight UTC.
+ [*= system.default_permissions_role ] If set to a valid permissions role name, use that role for the first channel created by a new account and don't ask for the "Channel Type" on the channel creation form. Examples of valid names are: 'social', 'social_restricted', 'social_private', 'forum', 'forum_restricted' and 'forum_private'. Read more about permissions roles [zrl=[baseurl]/help/roles]here[/zrl].
+ [*= system.default_profile_photo ] Set the profile photo that new channels start with. This should contain the name of a directory located under [font=courier]images/default_profile_photos/[/font], or be left unset. If not set then 'rainbow_man' is assumed.
+ [*= system.directorytags ] Set the number of keyword tags displayed on the directory page. Default is 50 unless set to a positive integer.
+ [*= system.disable_directory_keywords ] If '1', do not show directory keywords. If the hub is a directory server, prevent returning tags to any directory clients. Please do not set this for directory servers in the RED_GLOBAL realm.
+ [*= system.disable_discover_tab ] This allows you to completely disable the ability to discover public content from external sites.
+ [*= system.disable_dreport ] If '1', don't store or link to delivery reports
+ [*= system.dlogfile ] Logfile to use for logging development errors. Exactly the same as logger otherwise. This isn't magic, and requires your own logging statements. Developer tool.
+ [*= system.email_notify_icon_url ] URL of image (32x32) to display in email notifications (HTML bodies).
+ [*= system.expire_delivery_reports ] Expiration in days for delivery reports - default 10
+ [*= system.expire_limit ] Don't expire any more than this number of posts per channel per expiration run to keep from exhausting memory. Default 5000.
+ [*= system.photo_storage_type] If '1', use filesystem instead SQL database to store thumbnails. Default is '0'. Introduced in 4.2
+ [*= system.hidden_version_siteinfo ] If true, do not report the software version on siteinfo pages (system.hide_version also hides the version on these pages, this setting *only* hides the version on siteinfo pages).
+ [*= system.hide_help ] Don't display help documentation link in nav bar
+ [*= system.hide_in_statistics ] Tell the red statistics servers to completely hide this hub in hub lists.
+ [*= system.hide_version ] If true, do not report the software version on webpages and tools. (*) Must be set in .htconfig.php
+ [*= system.ignore_imagick ] Ignore imagick and use GD, even if imagick is installed on the server. Prevents some issues with PNG files in older versions of imagick.
+ [*= system.max_daily_registrations ] Set the maximum number of new registrations allowed on any day. Useful to prevent oversubscription after a bout of publicity for the project.
+ [*= system.max_import_size ] If configured, the maximum length of an imported text message. This is normally left at 200Kbytes or more to accomodate Friendica private photos, which are embedded.
+ [*= system.max_tagged_forums ] Spam prevention. Limits the number of tagged forums which are recognised in any post. Default is 2. Only the first 'n' tags will be delivered as forums, the others will not cause any delivery.
+ [*= system.minimum_feedcheck_minutes ] The minimum interval between polling RSS feeds. If this is lower than the cron interval, feeds will be polled with each cronjob. Defaults to 60 if not set. The site setting can also be over-ridden on a channel by channel basis by a service class setting aptly named 'minimum_feedcheck_minutes'.
+ [*= system.no_age_restriction ] Do not restrict registration to people over the age of 13. This carries legal responsibilities in many countries to require that age be provided and to block all personal information from minors, so please check your local laws before changing.
+ [*= system.object_cache_days] Set how long is cached embedded content can be used without refetching. Default is 30 days.
+ [*= system.openssl_conf_file ] Specify a file containing OpenSSL configuration. Needed in some Windows installations to locate the openssl configuration file on the system. Read the code first. If you can't read the code, don't play with it.
+ [*= system.openssl_encrypt ] Use openssl encryption engine, default is false (uses mcrypt for AES encryption)
+ [*= system.optimize_items ] Runs optimise_table during some tasks to keep your database nice and defragmented. This comes at a performance cost while the operations are running, but also keeps things a bit faster while it's not. There also exist CLI utilities for performing this operation, which you may prefer, especially if you're a large site.
+ [*= system.override_poll_lockfile ] Ignore the lock file in the poller process to allow more than one process to run at a time.
+ [*= system.paranoia ] As the pconfig, but on a site-wide basis. Can be overwritten by member settings.
+ [*= system.pin_types ] Array of allowed item types for pinning. Defaults depend on module but can be redifined here.
+ [*= system.photo_cache_time ] How long to cache photos, in seconds. Default is 86400 (1 day). Longer time increases performance, but it also means it takes longer for changed permissions to apply.
+ [*= system.platform_name ] What to report as the platform name in webpages and statistics. (*) Must be set in .htconfig.php
+ [*= system.rating_enabled ] Distributed reputation reporting and data collection. This feature is currently being re-worked.
+ [*= system.poke_basic ] Reduce the number of poke verbs to exactly 1 ("poke"). Disable other verbs.
+ [*= system.proc_run_use_exec ] If 1, use the exec system call in proc_run to run background tasks. By default we use proc_open and proc_close. On some (currently rare) systems this does not work well.
+ [*= system.projecthome ] Display the project page on your home page for logged out viewers.
+ [*= system.projecthome ] Set the project homepage as the homepage of your hub. (Obsolete)
+ [*= system.pubstream_ordering ] Set pubstream ordering. Possible values 'commented' (default), 'created' and 'edited'.
+ [*= system.register_link ] path to direct to from the "register" link on the login form. On closed sites this will direct to 'pubsites'. For open sites it will normally redirect to 'register' but you may change this to a custom site page offering subscriptions or whatever.
+ [*= system.reserved_channels ] Don't allow members to register channels with this comma separated list of names (no spaces)
+ [*= system.sellpage ] A URL shown in the public sites list to sell your hub - display service classes, etc.
+ [*= system.startpage ] Set the default page to be taken to after a login for all channels at this website. Can be overwritten by user settings.
+ [*= system.sys_expire_days ] How many days to keep discovered public content from other sites
+ [*= system.taganyone ] Allow the @mention tagging of anyone whether you are connected or not.
+ [*= system.tempdir ] Place to store temporary files (currently unused), default is defined in the PHP configuration.
+ [*= system.tos_url ] Set an alternative link for the ToS location.
+ [*= system.transport_security_header ] if non-zero and SSL is being used, include a strict-transport-security header on webpages
+ [*= system.uploaddir ] Location to upload files (default is system.tempdir, currently used only by js_upload plugin)
+ [*= system.workflow_channel_next ] The page to direct new members to immediately after creating a channel.
+ [*= system.workflow_register_next ] The page to direct members to immediately after creating an account (only when auto_channel_create or UNO is enabled).
+[/dl]
+
+
+[h3]Directory config[/h3]
+
+[h4]Directory search defaults[/h4]
+
+[dl terms="mb"]
+ [*= directory.globaldir ] 0 or 1. Default 0. If you visit the directory on a site you'll just see the members of that site by default. You have to go through an extra step to see the people in the rest of the network; and by doing so there's a clear delineation that these people *aren't* members of that site but of a larger network.
+ [*= directory.pubforums ] 0 or 1. Public forums [i]should[/i] be default 0.
+ [*= directory.safemode ] 0 or 1.
+[/dl]
+
+[h4]Directory server configuration[/h4][i](see [zrl=[baseurl]/help/directories]help/directories[/zrl])[/i]
+
+[dl terms="mb"]
+ [*= system.directory_mode ]
+ [*= system.directory_primary ]
+ [*= system.directory_realm ]
+ [*= system.directory_server ]
+ [*= system.realm_token ]
+[/dl]
+
+#include doc/macros/main_footer.bb;
+
diff --git a/doc/en/hook/about_hook.bb b/doc/en/hook/about_hook.bb
new file mode 100644
index 000000000..22b60d786
--- /dev/null
+++ b/doc/en/hook/about_hook.bb
@@ -0,0 +1 @@
+[h2]about_hook[/h2]
diff --git a/doc/en/hook/accept_follow.bb b/doc/en/hook/accept_follow.bb
new file mode 100644
index 000000000..e8b1ed0c4
--- /dev/null
+++ b/doc/en/hook/accept_follow.bb
@@ -0,0 +1 @@
+[h2]accept_follow[/h2]
diff --git a/doc/en/hook/account_downgrade.bb b/doc/en/hook/account_downgrade.bb
new file mode 100644
index 000000000..63bae0a58
--- /dev/null
+++ b/doc/en/hook/account_downgrade.bb
@@ -0,0 +1 @@
+[h2]account_downgrade[/h2]
diff --git a/doc/en/hook/account_settings.bb b/doc/en/hook/account_settings.bb
new file mode 100644
index 000000000..91b3a8385
--- /dev/null
+++ b/doc/en/hook/account_settings.bb
@@ -0,0 +1 @@
+[h2]account_settings[/h2]
diff --git a/doc/en/hook/account_settings_post.bb b/doc/en/hook/account_settings_post.bb
new file mode 100644
index 000000000..bbd7a57a8
--- /dev/null
+++ b/doc/en/hook/account_settings_post.bb
@@ -0,0 +1 @@
+[h2]account_settings_post[/h2]
diff --git a/doc/en/hook/activity_decode_mapper.bb b/doc/en/hook/activity_decode_mapper.bb
new file mode 100644
index 000000000..43d08a136
--- /dev/null
+++ b/doc/en/hook/activity_decode_mapper.bb
@@ -0,0 +1 @@
+[h2]activity_decode_mapper[/h2]
diff --git a/doc/en/hook/activity_filter.bb b/doc/en/hook/activity_filter.bb
new file mode 100644
index 000000000..9d0768577
--- /dev/null
+++ b/doc/en/hook/activity_filter.bb
@@ -0,0 +1 @@
+[h2]activity_filter[/h2]
diff --git a/doc/en/hook/activity_mapper.bb b/doc/en/hook/activity_mapper.bb
new file mode 100644
index 000000000..db65fadc4
--- /dev/null
+++ b/doc/en/hook/activity_mapper.bb
@@ -0,0 +1 @@
+[h2]activity_mapper[/h2]
diff --git a/doc/en/hook/activity_obj_decode_mapper.bb b/doc/en/hook/activity_obj_decode_mapper.bb
new file mode 100644
index 000000000..a96b32eee
--- /dev/null
+++ b/doc/en/hook/activity_obj_decode_mapper.bb
@@ -0,0 +1 @@
+[h2]activity_obj_decode_mapper[/h2]
diff --git a/doc/en/hook/activity_obj_mapper.bb b/doc/en/hook/activity_obj_mapper.bb
new file mode 100644
index 000000000..7c14a1b81
--- /dev/null
+++ b/doc/en/hook/activity_obj_mapper.bb
@@ -0,0 +1 @@
+[h2]activity_obj_mapper[/h2]
diff --git a/doc/en/hook/activity_order.bb b/doc/en/hook/activity_order.bb
new file mode 100644
index 000000000..4a4670d03
--- /dev/null
+++ b/doc/en/hook/activity_order.bb
@@ -0,0 +1 @@
+[h2]activity_order[/h2]
diff --git a/doc/en/hook/activity_received.bb b/doc/en/hook/activity_received.bb
new file mode 100644
index 000000000..2e9d68bf3
--- /dev/null
+++ b/doc/en/hook/activity_received.bb
@@ -0,0 +1 @@
+[h2]activity_received[/h2]
diff --git a/doc/en/hook/addon_app_installed_filter.bb b/doc/en/hook/addon_app_installed_filter.bb
new file mode 100644
index 000000000..e610b3205
--- /dev/null
+++ b/doc/en/hook/addon_app_installed_filter.bb
@@ -0,0 +1,18 @@
+[h2]addon_app_installed_filter[/h2]
+
+Allow plugins to filter the result of addon_app_installed.
+
+Code excerpt:
+
+[code]
+ $filter_arr = [
+ 'uid'=>$uid,
+ 'app'=>$app,
+ 'installed'=>$r
+ ];
+ call_hooks('addon_app_installed_filter',$filter_arr);
+ $r = $filter_arr['installed'];
+[/code]
+
+cxref: Zotlabs/Lib/Apps.php
+
diff --git a/doc/en/hook/affinity_labels.bb b/doc/en/hook/affinity_labels.bb
new file mode 100644
index 000000000..7234b7632
--- /dev/null
+++ b/doc/en/hook/affinity_labels.bb
@@ -0,0 +1 @@
+[h2]affinity_labels[/h2]
diff --git a/doc/en/hook/api_perm_is_allowed.bb b/doc/en/hook/api_perm_is_allowed.bb
new file mode 100644
index 000000000..862cbd653
--- /dev/null
+++ b/doc/en/hook/api_perm_is_allowed.bb
@@ -0,0 +1 @@
+[h2]api_perm_is_allowed[/h2]
diff --git a/doc/en/hook/app_destroy.bb b/doc/en/hook/app_destroy.bb
new file mode 100644
index 000000000..386d7af16
--- /dev/null
+++ b/doc/en/hook/app_destroy.bb
@@ -0,0 +1,4 @@
+[h2]app_destroy[/h2]
+
+Allows addons to perform some post delete actions.
+
diff --git a/doc/en/hook/app_installed_filter.bb b/doc/en/hook/app_installed_filter.bb
new file mode 100644
index 000000000..f0d91d6f0
--- /dev/null
+++ b/doc/en/hook/app_installed_filter.bb
@@ -0,0 +1,17 @@
+[h2]app_installed_filter[/h2]
+
+Allow plugins to filter the result of app_installed.
+
+Code excerpt:
+
+[code]
+ $filter_arr = [
+ 'uid'=>$uid,
+ 'app'=>$app,
+ 'installed'=>$r
+ ];
+ call_hooks('app_installed_filter',$filter_arr);
+ $r = $filter_arr['installed'];
+[/code]
+
+cxref: Zotlabs/Lib/Apps.php
diff --git a/doc/en/hook/atom_author.bb b/doc/en/hook/atom_author.bb
new file mode 100644
index 000000000..c9d05a593
--- /dev/null
+++ b/doc/en/hook/atom_author.bb
@@ -0,0 +1 @@
+[h2]atom_author[/h2]
diff --git a/doc/en/hook/atom_entry.bb b/doc/en/hook/atom_entry.bb
new file mode 100644
index 000000000..0aec89f16
--- /dev/null
+++ b/doc/en/hook/atom_entry.bb
@@ -0,0 +1 @@
+[h2]atom_entry[/h2]
diff --git a/doc/en/hook/atom_feed.bb b/doc/en/hook/atom_feed.bb
new file mode 100644
index 000000000..69775ca5e
--- /dev/null
+++ b/doc/en/hook/atom_feed.bb
@@ -0,0 +1 @@
+[h2]atom_feed[/h2]
diff --git a/doc/en/hook/atom_feed_end.bb b/doc/en/hook/atom_feed_end.bb
new file mode 100644
index 000000000..4f019fc8f
--- /dev/null
+++ b/doc/en/hook/atom_feed_end.bb
@@ -0,0 +1 @@
+[h2]atom_feed_end[/h2]
diff --git a/doc/en/hook/attach_delete.bb b/doc/en/hook/attach_delete.bb
new file mode 100644
index 000000000..3b63f28d3
--- /dev/null
+++ b/doc/en/hook/attach_delete.bb
@@ -0,0 +1,11 @@
+[h2]attach_delete[/h2]
+
+Invoked when an attachment is deleted using attach_delete().
+
+[code]
+$arr = ['channel_id' => $channel_id, 'resource' => $resource, 'is_photo'=>$is_photo];
+call_hooks("attach_delete",$arr);
+[/code]
+
+
+See include/attach.php
diff --git a/doc/en/hook/attach_upload_file.bb b/doc/en/hook/attach_upload_file.bb
new file mode 100644
index 000000000..1f8056caa
--- /dev/null
+++ b/doc/en/hook/attach_upload_file.bb
@@ -0,0 +1 @@
+[h2]attach_upload_file[/h2]
diff --git a/doc/en/hook/authenticate.bb b/doc/en/hook/authenticate.bb
new file mode 100644
index 000000000..eb8071e73
--- /dev/null
+++ b/doc/en/hook/authenticate.bb
@@ -0,0 +1,29 @@
+[h2]authenticate[/h2]
+
+Invoked when a POST request is made with non-null $_POST['auth-params'] such as from the login form.
+If the hook handler does not set the 'authenticated' parameter of the passed array, normal login functions continue;
+
+The 'user_record' is in fact an account DB record. To provide automatic provisioning of accounts from other authentication realms, this record should be generated and stored during the verification phase.
+
+
+[code]
+ $addon_auth = array(
+ 'username' => trim($_POST['username']),
+ 'password' => trim($_POST['password']),
+ 'authenticated' => 0,
+ 'user_record' => null
+ );
+
+ /**
+ *
+ * A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record
+ * Plugins should never set 'authenticated' except to indicate success - as hooks may be chained
+ * and later plugins should not interfere with an earlier one that succeeded.
+ *
+ */
+
+ call_hooks('authenticate', $addon_auth);
+[/code]
+
+
+See include/auth.php
diff --git a/doc/en/hook/author_is_pmable.bb b/doc/en/hook/author_is_pmable.bb
new file mode 100644
index 000000000..11d1185f3
--- /dev/null
+++ b/doc/en/hook/author_is_pmable.bb
@@ -0,0 +1,14 @@
+[h2]author_is_pmable[/h2]
+
+Called from thread action menu before returning a 'send mail' link for the post author. Not all authors will be able to receive private mail, for instance those on other networks with incompatible mail systems.
+
+By default author_is_pmable() returns true for 'zot' xchans, and false for all others.
+
+The plugin is passed an array
+
+ [ 'xchan' => $author_xchan, 'abook' => abook record, 'result' => 'unset' ]
+
+A plugin which sets the 'result' to something besides 'unset' will over-ride the default behaviour. A value of true will enable the 'send mail' link and the private mail recipient will be set to the author's xchan_hash. A value of false will disable the 'send mail' link.
+
+
+
diff --git a/doc/en/hook/bb2diaspora.bb b/doc/en/hook/bb2diaspora.bb
new file mode 100644
index 000000000..c28f1883e
--- /dev/null
+++ b/doc/en/hook/bb2diaspora.bb
@@ -0,0 +1 @@
+[h2]bb2diaspora[/h2]
diff --git a/doc/en/hook/bbcode.bb b/doc/en/hook/bbcode.bb
new file mode 100644
index 000000000..f6b8711b0
--- /dev/null
+++ b/doc/en/hook/bbcode.bb
@@ -0,0 +1,6 @@
+[h2]bbcode[/h2]
+
+
+Called at end of bbcode to html conversion.
+
+Hook argument contains the converted text string.
diff --git a/doc/en/hook/bbcode_filter.bb b/doc/en/hook/bbcode_filter.bb
new file mode 100644
index 000000000..efeb2e1b0
--- /dev/null
+++ b/doc/en/hook/bbcode_filter.bb
@@ -0,0 +1,7 @@
+[h2]bbcode_filter[/h2]
+
+
+Called at beginning of bbcode to html conversion.
+
+Hook argument contains the text string to be converted.
+
diff --git a/doc/en/hook/build_pagehead.bb b/doc/en/hook/build_pagehead.bb
new file mode 100644
index 000000000..8fc3486c7
--- /dev/null
+++ b/doc/en/hook/build_pagehead.bb
@@ -0,0 +1,2 @@
+[b]build_pagehead[/b]
+
diff --git a/doc/en/hook/can_comment_on_post.bb b/doc/en/hook/can_comment_on_post.bb
new file mode 100644
index 000000000..2cfd3b2da
--- /dev/null
+++ b/doc/en/hook/can_comment_on_post.bb
@@ -0,0 +1,13 @@
+[h3]can_comment_on_post[/h3]
+
+Called when deciding whether or not to display a comment box for a post.
+
+
+Hook data (array):
+ observer_hash => xchan_hash of current observer
+ item => posted item
+ allowed => 'unset'
+
+
+To over-ride the default behaviour, change allowed to true or false
+
diff --git a/doc/en/hook/change_channel.bb b/doc/en/hook/change_channel.bb
new file mode 100644
index 000000000..4514b9265
--- /dev/null
+++ b/doc/en/hook/change_channel.bb
@@ -0,0 +1,11 @@
+[h2]change_channel[/h2]
+
+Called when entering a logged in state in a channel context (as opposed to an account context).
+The hook array provides two arguments, 'channel_id' and 'chanx'. 'chanx' is a union of the channel
+and xchan records for the now active channel.
+
+Use this to capture what would traditionally be known as 'login events'. In this platform, login is
+a separate authentication activity and doesn't necessarily require "connecting to an identity", which
+is what the change_channel activity represents.
+
+
diff --git a/doc/en/hook/channel_links.bb b/doc/en/hook/channel_links.bb
new file mode 100644
index 000000000..c0243dac6
--- /dev/null
+++ b/doc/en/hook/channel_links.bb
@@ -0,0 +1,12 @@
+[h2]channel_links[/h2]
+
+Called when generating the Link HTTP header for the channel page. Different protocol stacks can add links to this header.
+
+Hook data = array
+ 'channel_address' => channel nickname, no checking is done to see if it is valid
+ 'channel_links' => array of channel links in the format
+ 'url' => url of resource
+ 'rel' => link relation
+ 'type' => MIME type
+
+All fields are required \ No newline at end of file
diff --git a/doc/en/hook/channel_remove.bb b/doc/en/hook/channel_remove.bb
new file mode 100644
index 000000000..db9e9dd82
--- /dev/null
+++ b/doc/en/hook/channel_remove.bb
@@ -0,0 +1 @@
+[h2]channel_remove[/h2]
diff --git a/doc/en/hook/chat_message.bb b/doc/en/hook/chat_message.bb
new file mode 100644
index 000000000..ccc93bb2c
--- /dev/null
+++ b/doc/en/hook/chat_message.bb
@@ -0,0 +1 @@
+[h2]chat_message[/h2]
diff --git a/doc/en/hook/chat_post.bb b/doc/en/hook/chat_post.bb
new file mode 100644
index 000000000..7cb3c9fa1
--- /dev/null
+++ b/doc/en/hook/chat_post.bb
@@ -0,0 +1 @@
+[h2]chat_post[/h2]
diff --git a/doc/en/hook/check_account_email.bb b/doc/en/hook/check_account_email.bb
new file mode 100644
index 000000000..b309706a0
--- /dev/null
+++ b/doc/en/hook/check_account_email.bb
@@ -0,0 +1 @@
+[h2]check_account_email[/h2]
diff --git a/doc/en/hook/check_account_invite.bb b/doc/en/hook/check_account_invite.bb
new file mode 100644
index 000000000..8d4a40522
--- /dev/null
+++ b/doc/en/hook/check_account_invite.bb
@@ -0,0 +1 @@
+[h2]check_account_invite[/h2]
diff --git a/doc/en/hook/check_account_password.bb b/doc/en/hook/check_account_password.bb
new file mode 100644
index 000000000..ce5202f48
--- /dev/null
+++ b/doc/en/hook/check_account_password.bb
@@ -0,0 +1,17 @@
+[h2]check_account_password[/h2]
+Use this hook to provide additional checks or validations of the password given when
+registering and account.
+[h3]Arguments:[/h3]
+[code=php]array(
+ 'password' => $password, // The password to check
+ 'result' => array(
+ 'error' => false,
+ 'message' => ''
+ )
+)[/code]
+[h3]Results:[/h3]
+For a failed check set the [code]error[/code] member of the [code]result[/code]
+array to [code]true[/code] and the [code]message[/code] to a short message
+explaining why it failed.
+
+Otherwise, leave it alone.
diff --git a/doc/en/hook/check_channelallowed.bb b/doc/en/hook/check_channelallowed.bb
new file mode 100644
index 000000000..e7559c92f
--- /dev/null
+++ b/doc/en/hook/check_channelallowed.bb
@@ -0,0 +1,11 @@
+[h2]check_channelallowed[/h2]
+
+Called when checking the channel (xchan) black and white lists to see if a channel is blocked.
+
+Hook data
+
+ array('hash' => xchan_hash of xchan to check);
+
+ create and set array element 'allowed' to true or false to override the system checks
+
+
diff --git a/doc/en/hook/check_siteallowed.bb b/doc/en/hook/check_siteallowed.bb
new file mode 100644
index 000000000..28134cbd2
--- /dev/null
+++ b/doc/en/hook/check_siteallowed.bb
@@ -0,0 +1,10 @@
+[h2]check_siteallowed[/h2]
+
+Called when checking the site black and white lists to see if a site is blocked.
+
+Hook data
+
+ array('url' => URL of site to check);
+
+ create and set array element 'allowed' to true or false to override the system checks
+
diff --git a/doc/en/hook/collect_public_recipients.bb b/doc/en/hook/collect_public_recipients.bb
new file mode 100644
index 000000000..de3f4049e
--- /dev/null
+++ b/doc/en/hook/collect_public_recipients.bb
@@ -0,0 +1,42 @@
+[h2]collect_public_recipients[/h2]
+
+Replace the default list of public recipients (i.e., all contacts).
+
+Allow plugins to create a list of recipients for public messages instead of the default
+of all channel connections.
+
+Called with the following array:
+ [
+ 'recipients' => [],
+ 'item' => $item,
+ 'private_envelope' => $private_envelope,
+ 'include_groups' => $include_groups
+ ];
+
+[code]
+ if(array_key_exists('public_policy',$item) && $item['public_policy'] !== 'self') {
+
+ $hookinfo = [
+ 'recipients' => [],
+ 'item' => $item,
+ 'private_envelope' => $private_envelope,
+ 'include_groups' => $include_groups
+ ];
+
+ call_hooks('collect_public_recipients',$hookinfo);
+
+ if ($hookinfo['recipients']) {
+ $r = $hookinfo['recipients'];
+ } else {
+ $r = q("select abook_xchan, xchan_network from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_self = 0 and abook_pending = 0 and abook_archived = 0 ",
+ intval($item['uid'])
+ );
+ }
+
+ if($r) {
+
+ . . .
+
+[/code]
+
+see: include/item.php
diff --git a/doc/en/hook/comments_are_now_closed.bb b/doc/en/hook/comments_are_now_closed.bb
new file mode 100644
index 000000000..4d3baa95a
--- /dev/null
+++ b/doc/en/hook/comments_are_now_closed.bb
@@ -0,0 +1,11 @@
+[h3]comments_are_now_closed[/h3]
+
+Called when deciding whether or not commenting is closed for an item.
+
+
+Hook data (array):
+ item => posted item
+ closed => 'unset'
+
+
+To over-ride the default behaviour, change closed to true or false
diff --git a/doc/en/hook/connect_premium.bb b/doc/en/hook/connect_premium.bb
new file mode 100644
index 000000000..ae3aafc66
--- /dev/null
+++ b/doc/en/hook/connect_premium.bb
@@ -0,0 +1 @@
+[h2]connect_premium[/h2]
diff --git a/doc/en/hook/connection_remove.bb b/doc/en/hook/connection_remove.bb
new file mode 100644
index 000000000..bd13ae5f2
--- /dev/null
+++ b/doc/en/hook/connection_remove.bb
@@ -0,0 +1,9 @@
+[h3]connection_remove[/h3]
+
+Called when deleting a connection.
+
+
+Passed parameter array:
+
+ 'channel_id' => channel_id of the channel removing the connection
+ 'abook_id' => abook_id of the connection being removed
diff --git a/doc/en/hook/connector_settings.bb b/doc/en/hook/connector_settings.bb
new file mode 100644
index 000000000..9b59c49da
--- /dev/null
+++ b/doc/en/hook/connector_settings.bb
@@ -0,0 +1 @@
+[h2]connector_settings[/h2]
diff --git a/doc/en/hook/construct_page.bb b/doc/en/hook/construct_page.bb
new file mode 100644
index 000000000..700d9256f
--- /dev/null
+++ b/doc/en/hook/construct_page.bb
@@ -0,0 +1 @@
+[h2]construct_page[/h2]
diff --git a/doc/en/hook/contact_block_end.bb b/doc/en/hook/contact_block_end.bb
new file mode 100644
index 000000000..30a7d2d76
--- /dev/null
+++ b/doc/en/hook/contact_block_end.bb
@@ -0,0 +1 @@
+[h2]contact_block_end[/h2]
diff --git a/doc/en/hook/contact_edit.bb b/doc/en/hook/contact_edit.bb
new file mode 100644
index 000000000..5fd31fb1d
--- /dev/null
+++ b/doc/en/hook/contact_edit.bb
@@ -0,0 +1 @@
+[h2]contact_edit[/h2]
diff --git a/doc/en/hook/contact_edit_post.bb b/doc/en/hook/contact_edit_post.bb
new file mode 100644
index 000000000..bc736f8b8
--- /dev/null
+++ b/doc/en/hook/contact_edit_post.bb
@@ -0,0 +1 @@
+[h2]contact_edit_post[/h2]
diff --git a/doc/en/hook/contact_select_options.bb b/doc/en/hook/contact_select_options.bb
new file mode 100644
index 000000000..65f9154ff
--- /dev/null
+++ b/doc/en/hook/contact_select_options.bb
@@ -0,0 +1 @@
+[h2]contact_select_options[/h2]
diff --git a/doc/en/hook/content_security_policy.bb b/doc/en/hook/content_security_policy.bb
new file mode 100644
index 000000000..96b8095ae
--- /dev/null
+++ b/doc/en/hook/content_security_policy.bb
@@ -0,0 +1,39 @@
+[h2]content_security_policy[/h2]
+
+Called to modify CSP settings prior to the output of the Content-Security-Policy header.
+
+This hook permits addons to modify the content-security-policy if necessary to allow loading of foreign js libraries or css styles.
+
+[code]
+if(App::$config['system']['content_security_policy']) {
+ $cspsettings = Array (
+ 'script-src' => Array ("'self'","'unsafe-inline'","'unsafe-eval'"),
+ 'style-src' => Array ("'self'","'unsafe-inline'")
+ );
+ call_hooks('content_security_policy',$cspsettings);
+
+ // Legitimate CSP directives (cxref: https://content-security-policy.com/)
+ $validcspdirectives=Array(
+ "default-src", "script-src", "style-src",
+ "img-src", "connect-src", "font-src",
+ "object-src", "media-src", 'frame-src',
+ 'sandbox', 'report-uri', 'child-src',
+ 'form-action', 'frame-ancestors', 'plugin-types'
+ );
+ $cspheader = "Content-Security-Policy:";
+ foreach ($cspsettings as $cspdirective => $csp) {
+ if (!in_array($cspdirective,$validcspdirectives)) {
+ logger("INVALID CSP DIRECTIVE: ".$cspdirective,LOGGER_DEBUG);
+ continue;
+ }
+ $cspsettingsarray=array_unique($cspsettings[$cspdirective]);
+ $cspsetpolicy = implode(' ',$cspsettingsarray);
+ if ($cspsetpolicy) {
+ $cspheader .= " ".$cspdirective." ".$cspsetpolicy.";";
+ }
+ }
+ header($cspheader);
+}
+[/code]
+
+see: boot.php
diff --git a/doc/en/hook/conversation_start.bb b/doc/en/hook/conversation_start.bb
new file mode 100644
index 000000000..7208c8d8f
--- /dev/null
+++ b/doc/en/hook/conversation_start.bb
@@ -0,0 +1 @@
+[h2]conversation_start[/h2]
diff --git a/doc/en/hook/create_identity.bb b/doc/en/hook/create_identity.bb
new file mode 100644
index 000000000..5c1da2d43
--- /dev/null
+++ b/doc/en/hook/create_identity.bb
@@ -0,0 +1 @@
+[h2]create_identity[/h2]
diff --git a/doc/en/hook/cron.bb b/doc/en/hook/cron.bb
new file mode 100644
index 000000000..55120b6c2
--- /dev/null
+++ b/doc/en/hook/cron.bb
@@ -0,0 +1,5 @@
+[h2]cron[/h2]
+
+Called when cron task (include/poller.php) is executed. The hook data is a string representing the current time (UTC).
+
+
diff --git a/doc/en/hook/cron_daily.bb b/doc/en/hook/cron_daily.bb
new file mode 100644
index 000000000..802bea5e4
--- /dev/null
+++ b/doc/en/hook/cron_daily.bb
@@ -0,0 +1,3 @@
+[h2]cron_daily[/h2]
+
+Called when cron task (include/poller.php) performs a cron_daily operation. The hook data is a string representing the current time (UTC).
diff --git a/doc/en/hook/cron_weekly.bb b/doc/en/hook/cron_weekly.bb
new file mode 100644
index 000000000..c01bf9611
--- /dev/null
+++ b/doc/en/hook/cron_weekly.bb
@@ -0,0 +1,3 @@
+[h2]cron_weekly[/h2]
+
+Called when cron task (include/poller.php) performs a cron_weekly operation. The hook data is a string representing the current time (UTC).
diff --git a/doc/en/hook/crypto_methods.bb b/doc/en/hook/crypto_methods.bb
new file mode 100644
index 000000000..1b16f567d
--- /dev/null
+++ b/doc/en/hook/crypto_methods.bb
@@ -0,0 +1,5 @@
+[h2]crypto_mthods[/h2]
+
+Passed an array of crypto methods in local priority order.
+
+You may change the order and add new methods or disable existing methods. 'aes256cbc' is always supported as a fallback and currently removing this has no effect. \ No newline at end of file
diff --git a/doc/en/hook/daemon_addon.bb b/doc/en/hook/daemon_addon.bb
new file mode 100644
index 000000000..b60b25748
--- /dev/null
+++ b/doc/en/hook/daemon_addon.bb
@@ -0,0 +1,15 @@
+[h2]daemon_addon[/h2]
+
+
+A foreground plugin can create a background process by invoking:
+
+[code]
+\Zotlabs\Daemon\Master::Summon([ 'Addon', 'myplugin', 'something' ]);
+[/code]
+
+This starts up a background process (called 'Addon') specifically for addons to use.
+
+Then if your plugin is also catching the daemon_addon hook that handler will be called with the
+argv array of the background process. In this case [ 'myplugin', 'something' ];
+
+We recommend using this convention so that plugins can share this hook without causing conflicts; that is check to see if your plugin is the first array argument and if not, return from the hook. Otherwise you can initiate background processing. Something to remember is that during background processes there is no session. You are detached from the web page which created the background process. \ No newline at end of file
diff --git a/doc/en/hook/daemon_master_release.bb b/doc/en/hook/daemon_master_release.bb
new file mode 100644
index 000000000..a17216d48
--- /dev/null
+++ b/doc/en/hook/daemon_master_release.bb
@@ -0,0 +1,5 @@
+[h2]daemon_master_release[/h2]
+
+Permit filtering or alternate methods of processing of background processes when [code] \Zotlabs\Daemon\Master::Release() [/code] is called.
+
+Default behavior is for a new PHP process to fire immediately upon a call to Master::Summon(). This hook permits pre-emption and the ability to provide queuing or other alternatives to this procedure.
diff --git a/doc/en/hook/directory_item.bb b/doc/en/hook/directory_item.bb
new file mode 100644
index 000000000..cb710e0b4
--- /dev/null
+++ b/doc/en/hook/directory_item.bb
@@ -0,0 +1 @@
+[h2]directory_item[/h2]
diff --git a/doc/en/hook/discover_channel_webfinger.bb b/doc/en/hook/discover_channel_webfinger.bb
new file mode 100644
index 000000000..b0eb5f2c4
--- /dev/null
+++ b/doc/en/hook/discover_channel_webfinger.bb
@@ -0,0 +1,14 @@
+[h2]discover_channel_webfinger[/h2]
+
+Called after performing channel discovery using RFC7033 webfinger and where the channel is not recognised as zot.
+
+Passed an array:
+
+ address: URL or address that is being discovered
+ success: set to true if the plugin discovers something
+ webfinger: array of webfinger links (output of webfinger_rfc7033())
+
+
+ if your plugin indicates success you are expected to generate and populate an xchan (and hubloc) record prior to returning.
+
+ \ No newline at end of file
diff --git a/doc/en/hook/display_item.bb b/doc/en/hook/display_item.bb
new file mode 100644
index 000000000..a6bfd621d
--- /dev/null
+++ b/doc/en/hook/display_item.bb
@@ -0,0 +1 @@
+[h2]display_item[/h2]
diff --git a/doc/en/hook/display_settings.bb b/doc/en/hook/display_settings.bb
new file mode 100644
index 000000000..1f1e0b491
--- /dev/null
+++ b/doc/en/hook/display_settings.bb
@@ -0,0 +1 @@
+[h2]display_settings[/h2]
diff --git a/doc/en/hook/display_settings_post.bb b/doc/en/hook/display_settings_post.bb
new file mode 100644
index 000000000..d3bb39359
--- /dev/null
+++ b/doc/en/hook/display_settings_post.bb
@@ -0,0 +1 @@
+[h2]display_settings_post[/h2]
diff --git a/doc/en/hook/donate_contributors.bb b/doc/en/hook/donate_contributors.bb
new file mode 100644
index 000000000..f97c77efa
--- /dev/null
+++ b/doc/en/hook/donate_contributors.bb
@@ -0,0 +1 @@
+[h2]donate_contributors[/h2]
diff --git a/doc/en/hook/donate_plugin.bb b/doc/en/hook/donate_plugin.bb
new file mode 100644
index 000000000..db4a6f113
--- /dev/null
+++ b/doc/en/hook/donate_plugin.bb
@@ -0,0 +1 @@
+[h2]donate_plugin[/h2]
diff --git a/doc/en/hook/donate_sponsors.bb b/doc/en/hook/donate_sponsors.bb
new file mode 100644
index 000000000..3abd46d42
--- /dev/null
+++ b/doc/en/hook/donate_sponsors.bb
@@ -0,0 +1 @@
+[h2]donate_sponsors[/h2]
diff --git a/doc/en/hook/dreport_is_storable.bb b/doc/en/hook/dreport_is_storable.bb
new file mode 100644
index 000000000..9ca99b896
--- /dev/null
+++ b/doc/en/hook/dreport_is_storable.bb
@@ -0,0 +1 @@
+[h2]dreport_is_storable[/h2]
diff --git a/doc/en/hook/dreport_process.bb b/doc/en/hook/dreport_process.bb
new file mode 100644
index 000000000..3ad331f41
--- /dev/null
+++ b/doc/en/hook/dreport_process.bb
@@ -0,0 +1,7 @@
+[h2]dreport_process[/h2]
+
+Called for each delivery report received
+
+Passed a delivery_report array.
+
+see: include/zot.php
diff --git a/doc/en/hook/drop_item.bb b/doc/en/hook/drop_item.bb
new file mode 100644
index 000000000..35bb80f82
--- /dev/null
+++ b/doc/en/hook/drop_item.bb
@@ -0,0 +1 @@
+[h2]drop_item[/h2]
diff --git a/doc/en/hook/dropdown_extras.bb b/doc/en/hook/dropdown_extras.bb
new file mode 100644
index 000000000..6d7110a76
--- /dev/null
+++ b/doc/en/hook/dropdown_extras.bb
@@ -0,0 +1,17 @@
+[h2]dropdown_extras[/h2]
+
+Modify the dropdown menu available through the cog of items as displayed by conv_item.tpl
+
+This hook allows plugins to add arbitrary html to the cog dropdown of thread items displayed with the conv_item.tpl template.
+
+It is fed an array of ['item' => $item, 'dropdown_extras' => '']. Any additions to the cog menu should be prepended/appended to
+the ['dropdown_extras'] element.
+
+[code]
+$dropdown_extras_arr = [ 'item' => $item , 'dropdown_extras' => '' ];
+call_hooks('dropdown_extras',$dropdown_extras_arr);
+$dropdown_extras = $dropdown_extras_arr['dropdown_extras'];
+[/code]
+
+see: Zotlabs/Lib/ThreadItem.php
+see: view/tpl/conv_item.tpl
diff --git a/doc/en/hook/encode_object.bb b/doc/en/hook/encode_object.bb
new file mode 100644
index 000000000..0c8e86458
--- /dev/null
+++ b/doc/en/hook/encode_object.bb
@@ -0,0 +1 @@
+[h2]encode_object[/h2]
diff --git a/doc/en/hook/enotify.bb b/doc/en/hook/enotify.bb
new file mode 100644
index 000000000..703a3ffa0
--- /dev/null
+++ b/doc/en/hook/enotify.bb
@@ -0,0 +1 @@
+[h2]enotify[/h2]
diff --git a/doc/en/hook/enotify_mail.bb b/doc/en/hook/enotify_mail.bb
new file mode 100644
index 000000000..adeb8bd30
--- /dev/null
+++ b/doc/en/hook/enotify_mail.bb
@@ -0,0 +1 @@
+[h2]enotify_mail[/h2]
diff --git a/doc/en/hook/enotify_store.bb b/doc/en/hook/enotify_store.bb
new file mode 100644
index 000000000..dc44cc320
--- /dev/null
+++ b/doc/en/hook/enotify_store.bb
@@ -0,0 +1 @@
+[h2]enotify_store[/h2]
diff --git a/doc/en/hook/event_created.bb b/doc/en/hook/event_created.bb
new file mode 100644
index 000000000..222602e77
--- /dev/null
+++ b/doc/en/hook/event_created.bb
@@ -0,0 +1 @@
+[h2]event_created[/h2]
diff --git a/doc/en/hook/event_store_event.bb b/doc/en/hook/event_store_event.bb
new file mode 100644
index 000000000..7015a8322
--- /dev/null
+++ b/doc/en/hook/event_store_event.bb
@@ -0,0 +1,11 @@
+[h2]event_store_event[/h2]
+
+Called from event_store_event() when an event record is being stored.
+
+Hook info is an array
+
+'event' => the passed event details, ready for storage
+'existing_event' => If the event already exists, a copy of the original event record from the database
+'cancel' => false - set to true to cancel the operation.
+
+
diff --git a/doc/en/hook/event_updated.bb b/doc/en/hook/event_updated.bb
new file mode 100644
index 000000000..69e3c72c1
--- /dev/null
+++ b/doc/en/hook/event_updated.bb
@@ -0,0 +1 @@
+[h2]event_updated[/h2]
diff --git a/doc/en/hook/externals_url_select.bb b/doc/en/hook/externals_url_select.bb
new file mode 100644
index 000000000..a542dcb29
--- /dev/null
+++ b/doc/en/hook/externals_url_select.bb
@@ -0,0 +1 @@
+[h2]externals_url_select[/h2]
diff --git a/doc/en/hook/feature_enabled.bb b/doc/en/hook/feature_enabled.bb
new file mode 100644
index 000000000..5630cc768
--- /dev/null
+++ b/doc/en/hook/feature_enabled.bb
@@ -0,0 +1 @@
+[h2]feature_enabled[/h2]
diff --git a/doc/en/hook/feature_settings.bb b/doc/en/hook/feature_settings.bb
new file mode 100644
index 000000000..d1691eb38
--- /dev/null
+++ b/doc/en/hook/feature_settings.bb
@@ -0,0 +1 @@
+[h2]feature_settings[/h2]
diff --git a/doc/en/hook/feature_settings_post.bb b/doc/en/hook/feature_settings_post.bb
new file mode 100644
index 000000000..eecf941ff
--- /dev/null
+++ b/doc/en/hook/feature_settings_post.bb
@@ -0,0 +1 @@
+[h2]feature_settings_post[/h2]
diff --git a/doc/en/hook/fetch_and_store.bb b/doc/en/hook/fetch_and_store.bb
new file mode 100644
index 000000000..afece11a6
--- /dev/null
+++ b/doc/en/hook/fetch_and_store.bb
@@ -0,0 +1 @@
+[h2]fetch_and_store[/h2]
diff --git a/doc/en/hook/follow.bb b/doc/en/hook/follow.bb
new file mode 100644
index 000000000..a97632b06
--- /dev/null
+++ b/doc/en/hook/follow.bb
@@ -0,0 +1 @@
+[h2]follow[/h2]
diff --git a/doc/en/hook/follow_allow.bb b/doc/en/hook/follow_allow.bb
new file mode 100644
index 000000000..fdab1865c
--- /dev/null
+++ b/doc/en/hook/follow_allow.bb
@@ -0,0 +1 @@
+[h2]follow_allow[/h2]
diff --git a/doc/en/hook/gender_selector.bb b/doc/en/hook/gender_selector.bb
new file mode 100644
index 000000000..0b56b5c9b
--- /dev/null
+++ b/doc/en/hook/gender_selector.bb
@@ -0,0 +1 @@
+[h2]gender_selector[/h2]
diff --git a/doc/en/hook/gender_selector_min.bb b/doc/en/hook/gender_selector_min.bb
new file mode 100644
index 000000000..9d143855a
--- /dev/null
+++ b/doc/en/hook/gender_selector_min.bb
@@ -0,0 +1 @@
+[h2]gender_selector_min[/h2]
diff --git a/doc/en/hook/generate_map.bb b/doc/en/hook/generate_map.bb
new file mode 100644
index 000000000..33672d552
--- /dev/null
+++ b/doc/en/hook/generate_map.bb
@@ -0,0 +1 @@
+[h2]generate_map[/h2]
diff --git a/doc/en/hook/generate_named_map.bb b/doc/en/hook/generate_named_map.bb
new file mode 100644
index 000000000..5bacb846d
--- /dev/null
+++ b/doc/en/hook/generate_named_map.bb
@@ -0,0 +1 @@
+[h2]generate_named_map[/h2]
diff --git a/doc/en/hook/get_all_api_perms.bb b/doc/en/hook/get_all_api_perms.bb
new file mode 100644
index 000000000..eb41f8a02
--- /dev/null
+++ b/doc/en/hook/get_all_api_perms.bb
@@ -0,0 +1 @@
+[h2]get_all_api_perms[/h2]
diff --git a/doc/en/hook/get_all_perms.bb b/doc/en/hook/get_all_perms.bb
new file mode 100644
index 000000000..149f8c78c
--- /dev/null
+++ b/doc/en/hook/get_all_perms.bb
@@ -0,0 +1 @@
+[h2]get_all_perms[/h2]
diff --git a/doc/en/hook/get_default_export_sections b/doc/en/hook/get_default_export_sections
new file mode 100644
index 000000000..09b146643
--- /dev/null
+++ b/doc/en/hook/get_default_export_sections
@@ -0,0 +1,10 @@
+[h3]get_default_export_sections[/h3]
+
+The get_default_export_sections call returns the basic functional groups of data to export using channel_export_basic().
+
+The hook is passed an array
+ [
+ 'sections' => [ 'channel', 'connections', 'config', 'apps', 'chatrooms', 'events', 'webpages', 'mail', 'wikis' ]
+ ]
+
+If you desire the export to contain three months of items, add 'items' to the 'sections' array
diff --git a/doc/en/hook/get_features.bb b/doc/en/hook/get_features.bb
new file mode 100644
index 000000000..66e81f13c
--- /dev/null
+++ b/doc/en/hook/get_features.bb
@@ -0,0 +1 @@
+[h2]get_features[/h2]
diff --git a/doc/en/hook/get_photo.bb b/doc/en/hook/get_photo.bb
new file mode 100644
index 000000000..eaf3beffb
--- /dev/null
+++ b/doc/en/hook/get_photo.bb
@@ -0,0 +1,14 @@
+[h2]get_photo[/h2]
+
+Called when fetching the content of photos (except for profile photos) in mod_photo.
+
+
+Hook arguments:
+
+'imgscale' => integer resolution requested
+'resource_id' => resource_id of requested photo
+'photo' => array of matching photo table rows after querying for the photo
+'allowed' => whether or not access to this resource is allowed
+
+
+
diff --git a/doc/en/hook/get_profile_photo.bb b/doc/en/hook/get_profile_photo.bb
new file mode 100644
index 000000000..ab07179ae
--- /dev/null
+++ b/doc/en/hook/get_profile_photo.bb
@@ -0,0 +1,18 @@
+[h2]get_profile_photo[/h2]
+
+Called when fetching the content of the default profile photo for a local channel in mod_photo.
+
+
+Hook arguments:
+
+'imgscale' => integer resolution requested (4, 5, or 6)
+'channel_id' => channel_id of requested profile photo
+'default' => filename of default profile photo of this imgscale
+'data' => empty string
+'mimetype' => empty string
+
+
+If 'data' is set, this data will be used instead of the data obtained from the database search for the profile photo.
+If 'mimetype' is set, this mimetype will be used instead of the mimetype obtained from the database or the default profile photo mimetype.
+
+
diff --git a/doc/en/hook/get_role_perms.bb b/doc/en/hook/get_role_perms.bb
new file mode 100644
index 000000000..87830f8e3
--- /dev/null
+++ b/doc/en/hook/get_role_perms.bb
@@ -0,0 +1 @@
+[h2]get_role_perms[/h2]
diff --git a/doc/en/hook/global_permissions.bb b/doc/en/hook/global_permissions.bb
new file mode 100644
index 000000000..fe998ee9c
--- /dev/null
+++ b/doc/en/hook/global_permissions.bb
@@ -0,0 +1 @@
+[h2]global_permissions[/h2]
diff --git a/doc/en/hook/home_content.bb b/doc/en/hook/home_content.bb
new file mode 100644
index 000000000..7f32b3547
--- /dev/null
+++ b/doc/en/hook/home_content.bb
@@ -0,0 +1 @@
+[h2]home_content[/h2]
diff --git a/doc/en/hook/home_init.bb b/doc/en/hook/home_init.bb
new file mode 100644
index 000000000..25dd72792
--- /dev/null
+++ b/doc/en/hook/home_init.bb
@@ -0,0 +1 @@
+[h2]home_init[/h2]
diff --git a/doc/en/hook/hostxrd.bb b/doc/en/hook/hostxrd.bb
new file mode 100644
index 000000000..2b67320cf
--- /dev/null
+++ b/doc/en/hook/hostxrd.bb
@@ -0,0 +1 @@
+[h2]hostxrd[/h2]
diff --git a/doc/en/hook/html2bbcode.bb b/doc/en/hook/html2bbcode.bb
new file mode 100644
index 000000000..3061f05f0
--- /dev/null
+++ b/doc/en/hook/html2bbcode.bb
@@ -0,0 +1 @@
+[h2]html2bbcode[/h2]
diff --git a/doc/en/hook/identity_basic_export.bb b/doc/en/hook/identity_basic_export.bb
new file mode 100644
index 000000000..71329ba1e
--- /dev/null
+++ b/doc/en/hook/identity_basic_export.bb
@@ -0,0 +1,10 @@
+[h2]identity_basic_export[/h2]
+
+Called when exporting data for a channel
+Passed array contains
+
+ [
+ 'channel_id' => channel_id being exported
+ 'sections' => array of functional export sections which are being exported
+ 'data' => the export data array which has been generated
+ ]
diff --git a/doc/en/hook/import_author_xchan.bb b/doc/en/hook/import_author_xchan.bb
new file mode 100644
index 000000000..e2340469d
--- /dev/null
+++ b/doc/en/hook/import_author_xchan.bb
@@ -0,0 +1 @@
+[h2]import_author_xchan[/h2]
diff --git a/doc/en/hook/import_channel.bb b/doc/en/hook/import_channel.bb
new file mode 100644
index 000000000..b220b7415
--- /dev/null
+++ b/doc/en/hook/import_channel.bb
@@ -0,0 +1 @@
+[h2]import_channel[/h2]
diff --git a/doc/en/hook/import_directory_profile.bb b/doc/en/hook/import_directory_profile.bb
new file mode 100644
index 000000000..e2fac59bc
--- /dev/null
+++ b/doc/en/hook/import_directory_profile.bb
@@ -0,0 +1 @@
+[h2]import_directory_profile[/h2]
diff --git a/doc/en/hook/import_xchan.bb b/doc/en/hook/import_xchan.bb
new file mode 100644
index 000000000..40e0783ce
--- /dev/null
+++ b/doc/en/hook/import_xchan.bb
@@ -0,0 +1 @@
+[h2]import_xchan[/h2]
diff --git a/doc/en/hook/item_custom.bb b/doc/en/hook/item_custom.bb
new file mode 100644
index 000000000..d20c7d76c
--- /dev/null
+++ b/doc/en/hook/item_custom.bb
@@ -0,0 +1,24 @@
+[h2]item_custom[/h2]
+
+Allow addons to create and process custom item types.
+
+Addon authors will need to use iconfig meta data (with sharing on) or some other method
+to specify and determine whether the custom item is destined for their addon.
+
+It is fed an array of ['item' => ${item_array}, 'allow_exec' => {true/false}]
+
+By default $arr['item']['cancel'] is set to TRUE which will abort storage of the
+custom item in the item table unless the addon unsets it or sets it to false.
+
+[code]
+ if ($arr['item_type']==ITEM_TYPE_CUSTOM) {
+ /* Custom items are not stored by default
+ because they require an addon to process. */
+ $d['item']['cancel']=true;
+
+ call_hooks('item_custom',$d);
+ }
+
+[/code]
+
+see: include/items.php
diff --git a/doc/en/hook/item_photo_menu.bb b/doc/en/hook/item_photo_menu.bb
new file mode 100644
index 000000000..8f9860a90
--- /dev/null
+++ b/doc/en/hook/item_photo_menu.bb
@@ -0,0 +1 @@
+[h2]item_photo_menu[/h2]
diff --git a/doc/en/hook/item_store.bb b/doc/en/hook/item_store.bb
new file mode 100644
index 000000000..5d49b725c
--- /dev/null
+++ b/doc/en/hook/item_store.bb
@@ -0,0 +1 @@
+[h2]item_store[/h2]
diff --git a/doc/en/hook/item_store_update.bb b/doc/en/hook/item_store_update.bb
new file mode 100644
index 000000000..a7c58939a
--- /dev/null
+++ b/doc/en/hook/item_store_update.bb
@@ -0,0 +1 @@
+[h2]item_store_update[/h2]
diff --git a/doc/en/hook/item_stored.bb b/doc/en/hook/item_stored.bb
new file mode 100644
index 000000000..8d706cb4e
--- /dev/null
+++ b/doc/en/hook/item_stored.bb
@@ -0,0 +1,18 @@
+[h2]item_stored[/h2]
+
+Allow addons to continue processing after an item has been stored in the event
+that they need access to the item_id or other data that gets assigned during
+the storage process.
+
+It is fed an array of type item (including terms and iconfig data).
+
+[code]
+ /**
+ * @hooks item_stored
+ * Called after new item is stored in the database.
+ * (By this time we have an item_id and other frequently needed info.)
+ */
+ call_hooks('item_stored',$arr);
+[/code]
+
+see: include/items.php
diff --git a/doc/en/hook/item_stored_update.bb b/doc/en/hook/item_stored_update.bb
new file mode 100644
index 000000000..4532a347c
--- /dev/null
+++ b/doc/en/hook/item_stored_update.bb
@@ -0,0 +1,15 @@
+[h2]item_stored_update[/h2]
+
+Allow addons to continue processing after an item update has been stored
+
+It is fed an array of type item (including terms and iconfig data).
+
+[code]
+ /**
+ * @hooks item_stored_update
+ * Called after updated item is stored in the database.
+ */
+ call_hooks('item_stored_update',$arr);
+[/code]
+
+see: include/items.php
diff --git a/doc/en/hook/item_translate.bb b/doc/en/hook/item_translate.bb
new file mode 100644
index 000000000..695494b9c
--- /dev/null
+++ b/doc/en/hook/item_translate.bb
@@ -0,0 +1 @@
+[h2]item_translate[/h2]
diff --git a/doc/en/hook/jot_header_tpl_filter.bb b/doc/en/hook/jot_header_tpl_filter.bb
new file mode 100644
index 000000000..b17d81d03
--- /dev/null
+++ b/doc/en/hook/jot_header_tpl_filter.bb
@@ -0,0 +1,5 @@
+[h2]jot_header_tpl_filter[/h2]
+
+Allows addon developers to modify the values of replacements fed into jot-header.tpl
+
+cxref: include/conversation.php
diff --git a/doc/en/hook/jot_networks.bb b/doc/en/hook/jot_networks.bb
new file mode 100644
index 000000000..4c1629ba7
--- /dev/null
+++ b/doc/en/hook/jot_networks.bb
@@ -0,0 +1 @@
+[h2]jot_networks[/h2]
diff --git a/doc/en/hook/jot_tool.bb b/doc/en/hook/jot_tool.bb
new file mode 100644
index 000000000..22ba9701e
--- /dev/null
+++ b/doc/en/hook/jot_tool.bb
@@ -0,0 +1 @@
+[h2]jot_tool[/h2]
diff --git a/doc/en/hook/jot_tpl_filter.bb b/doc/en/hook/jot_tpl_filter.bb
new file mode 100644
index 000000000..426da3c56
--- /dev/null
+++ b/doc/en/hook/jot_tpl_filter.bb
@@ -0,0 +1,5 @@
+[h2]jot_tpl_filter[/h2]
+
+Allows addon developers to alter the macro replacements prior to being fed into jot.tpl
+
+cxref: include/conversation.php
diff --git a/doc/en/hook/legal_webbie.bb b/doc/en/hook/legal_webbie.bb
new file mode 100644
index 000000000..8c7d32d56
--- /dev/null
+++ b/doc/en/hook/legal_webbie.bb
@@ -0,0 +1,10 @@
+[h2]legal_webbie[/h2]
+
+Called when validating a channel address. By default the valid characters are
+a-z,0-9,-,_, and . Uppercase ASCII characters are folded to lower and any invalid characters are stripped.
+
+Some federated networks require more restrictive rules.
+
+The hook is called with an array [ 'input' => (supplied text), 'output' => (validated text) ]
+
+A plugin will generally perform a regex filter or text operation on 'input' and provide the results in 'output'. \ No newline at end of file
diff --git a/doc/en/hook/legal_webbie_text.bb b/doc/en/hook/legal_webbie_text.bb
new file mode 100644
index 000000000..32c74c93b
--- /dev/null
+++ b/doc/en/hook/legal_webbie_text.bb
@@ -0,0 +1,7 @@
+[h2]legal_webbie_text[/h2]
+
+Returns a string describing the text rules applied to legal_webbie().
+
+Called with an array [ 'text' => (descriptive text describing text character limitations) ]
+
+A plugin should return the description of the allowed characters and operation performed in the 'legal_webbie' hook to assist people when creating a new channel. \ No newline at end of file
diff --git a/doc/en/hook/load_pdl.bb b/doc/en/hook/load_pdl.bb
new file mode 100644
index 000000000..149a3e766
--- /dev/null
+++ b/doc/en/hook/load_pdl.bb
@@ -0,0 +1 @@
+[h2]load_pdl[/h2]
diff --git a/doc/en/hook/local_dir_update.bb b/doc/en/hook/local_dir_update.bb
new file mode 100644
index 000000000..d0b0f8ac1
--- /dev/null
+++ b/doc/en/hook/local_dir_update.bb
@@ -0,0 +1 @@
+[h2]local_dir_update[/h2]
diff --git a/doc/en/hook/logged_in.bb b/doc/en/hook/logged_in.bb
new file mode 100644
index 000000000..b01041576
--- /dev/null
+++ b/doc/en/hook/logged_in.bb
@@ -0,0 +1 @@
+[h2]logged_in[/h2]
diff --git a/doc/en/hook/logger.bb b/doc/en/hook/logger.bb
new file mode 100644
index 000000000..8fe989abd
--- /dev/null
+++ b/doc/en/hook/logger.bb
@@ -0,0 +1,16 @@
+[h2]logger[/h2]
+
+Called when making an entry to the application logfile
+
+Hook data:
+
+ array(
+ 'filename' => name of logfile relative to application basedir. String.
+ 'loglevel' => the log level of this log entry, if this is higher than the configured maximum loglevel
+ this hook will not be called. Integer.
+ 'message' => The formatted log message, ready for logging. String.
+ 'logged' => boolean, default is false. Set to true to prevent the normal logfile entry to be made
+ (e.g. if the plugin is configured to handle this aspect of the function, or if it is determined
+ that this log entry should not be made)
+ )
+
diff --git a/doc/en/hook/logging_out.bb b/doc/en/hook/logging_out.bb
new file mode 100644
index 000000000..d47b9f1df
--- /dev/null
+++ b/doc/en/hook/logging_out.bb
@@ -0,0 +1 @@
+[h2]logging_out[/h2]
diff --git a/doc/en/hook/login_hook.bb b/doc/en/hook/login_hook.bb
new file mode 100644
index 000000000..156a0afcd
--- /dev/null
+++ b/doc/en/hook/login_hook.bb
@@ -0,0 +1 @@
+[h2]login_hook[/h2]
diff --git a/doc/en/hook/magic_auth.bb b/doc/en/hook/magic_auth.bb
new file mode 100644
index 000000000..80d6edb27
--- /dev/null
+++ b/doc/en/hook/magic_auth.bb
@@ -0,0 +1 @@
+[h2]magic_auth[/h2]
diff --git a/doc/en/hook/magic_auth_openid_success.bb b/doc/en/hook/magic_auth_openid_success.bb
new file mode 100644
index 000000000..810f2e06d
--- /dev/null
+++ b/doc/en/hook/magic_auth_openid_success.bb
@@ -0,0 +1 @@
+[h2]magic_auth_openid_success[/h2]
diff --git a/doc/en/hook/magic_auth_success.bb b/doc/en/hook/magic_auth_success.bb
new file mode 100644
index 000000000..d795e43e5
--- /dev/null
+++ b/doc/en/hook/magic_auth_success.bb
@@ -0,0 +1 @@
+[h2]magic_auth_success[/h2]
diff --git a/doc/en/hook/main_slider.bb b/doc/en/hook/main_slider.bb
new file mode 100644
index 000000000..a63c2170a
--- /dev/null
+++ b/doc/en/hook/main_slider.bb
@@ -0,0 +1 @@
+[h2]main_slider[/h2]
diff --git a/doc/en/hook/marital_selector.bb b/doc/en/hook/marital_selector.bb
new file mode 100644
index 000000000..0f76c3f5a
--- /dev/null
+++ b/doc/en/hook/marital_selector.bb
@@ -0,0 +1 @@
+[h2]marital_selector[/h2]
diff --git a/doc/en/hook/marital_selector_min.bb b/doc/en/hook/marital_selector_min.bb
new file mode 100644
index 000000000..f02d21f20
--- /dev/null
+++ b/doc/en/hook/marital_selector_min.bb
@@ -0,0 +1 @@
+[h2]marital_selector_min[/h2]
diff --git a/doc/en/hook/markdown_to_bb.bb b/doc/en/hook/markdown_to_bb.bb
new file mode 100644
index 000000000..8af637c8c
--- /dev/null
+++ b/doc/en/hook/markdown_to_bb.bb
@@ -0,0 +1,5 @@
+[h2]markdown_to_bb[/h2]
+
+Called when processing markdown to bbcode conversion such as when importing Diaspora protocol source or other markdown sources. The plugin is called post conversion.
+
+The function takes one argument which is the string being converted. It may be additionally processed by the plugin.
diff --git a/doc/en/hook/module_loaded.bb b/doc/en/hook/module_loaded.bb
new file mode 100644
index 000000000..cb0d2302d
--- /dev/null
+++ b/doc/en/hook/module_loaded.bb
@@ -0,0 +1 @@
+[h2]module_loaded[/h2]
diff --git a/doc/en/hook/module_mod_aftercontent.bb b/doc/en/hook/module_mod_aftercontent.bb
new file mode 100644
index 000000000..04e3c8d88
--- /dev/null
+++ b/doc/en/hook/module_mod_aftercontent.bb
@@ -0,0 +1,12 @@
+[h2]module_mod_aftercontent[/h2]
+
+
+
+The hook data for this call consists of an array
+
+ $arr['content']
+
+This element contains the HTML content which was prepared for this page by calling the module_content() function. It is invoked after the content has been created. It does not contain the result of AJAX or asynchronous page load calls.
+
+ The current module may be determined by lookin at App::$module
+
diff --git a/doc/en/hook/module_mod_content.bb b/doc/en/hook/module_mod_content.bb
new file mode 100644
index 000000000..eef5b7ba5
--- /dev/null
+++ b/doc/en/hook/module_mod_content.bb
@@ -0,0 +1,10 @@
+[h2]module_mod_content[/h2]
+
+The hook data for this call consists of an array
+
+ $arr['content']
+
+This element contains the HTML content before calling the module_content() function. It is invoked before the content region has been populated. This may or may not be empty as there may be other processes or addons generating content prior to your hook handler is run. Be certain to preserve any current content. Typically anything you add here will be placed at the top of the content region of the page, but in any event prior to the main content region being generated.
+
+ The current module may be determined by lookin at App::$module
+
diff --git a/doc/en/hook/module_mod_init.bb b/doc/en/hook/module_mod_init.bb
new file mode 100644
index 000000000..52fe5a616
--- /dev/null
+++ b/doc/en/hook/module_mod_init.bb
@@ -0,0 +1 @@
+[h2]module_mod_init[/h2]
diff --git a/doc/en/hook/module_mod_post.bb b/doc/en/hook/module_mod_post.bb
new file mode 100644
index 000000000..3adb0e737
--- /dev/null
+++ b/doc/en/hook/module_mod_post.bb
@@ -0,0 +1 @@
+[h2]module_mod_post[/h2]
diff --git a/doc/en/hook/mood_verbs.bb b/doc/en/hook/mood_verbs.bb
new file mode 100644
index 000000000..67fb719dd
--- /dev/null
+++ b/doc/en/hook/mood_verbs.bb
@@ -0,0 +1 @@
+[h2]mood_verbs[/h2]
diff --git a/doc/en/hook/nav.bb b/doc/en/hook/nav.bb
new file mode 100644
index 000000000..b52f90602
--- /dev/null
+++ b/doc/en/hook/nav.bb
@@ -0,0 +1,28 @@
+[h2]nav[/h2]
+
+Called when generating the main navigation bar and menu for a page
+
+Hook data:
+
+ array(
+ 'usermenu' => array( 'icon' => photo URL, 'name' => channel name )
+ 'nav' => array(
+ 'usermenu' => usermenu (photo menu) link array
+ (channel home, profiles, photos, cloud, chats, webapges ...)
+ 'loginmenu' => login menu link array
+ 'network' => grid link and grid-notify
+ 'home' => home link and home-notify
+ 'intros' => intros link and intros-notify
+ 'notifications' => notifications link and notifications-notify
+ 'messages' => PM link and PM-notify
+ 'all_events' => events link and events notfiy
+ 'manage' => manage channels link
+ 'settings' => settings link
+ 'register' => registration link
+ 'help' => help/doc link
+ 'apps' => apps link
+ 'search' => search link and form
+ 'directory' => directory link
+ )
+
+
diff --git a/doc/en/hook/network_content_init.bb b/doc/en/hook/network_content_init.bb
new file mode 100644
index 000000000..224da393a
--- /dev/null
+++ b/doc/en/hook/network_content_init.bb
@@ -0,0 +1 @@
+[h2]network_content_init[/h2]
diff --git a/doc/en/hook/network_ping.bb b/doc/en/hook/network_ping.bb
new file mode 100644
index 000000000..78deefe78
--- /dev/null
+++ b/doc/en/hook/network_ping.bb
@@ -0,0 +1 @@
+[h2]network_ping[/h2]
diff --git a/doc/en/hook/network_to_name.bb b/doc/en/hook/network_to_name.bb
new file mode 100644
index 000000000..eea4a1841
--- /dev/null
+++ b/doc/en/hook/network_to_name.bb
@@ -0,0 +1 @@
+[h2]network_to_name[/h2]
diff --git a/doc/en/hook/notifier_end.bb b/doc/en/hook/notifier_end.bb
new file mode 100644
index 000000000..df9d852bd
--- /dev/null
+++ b/doc/en/hook/notifier_end.bb
@@ -0,0 +1 @@
+[h2]notifier_end[/h2]
diff --git a/doc/en/hook/notifier_hub.bb b/doc/en/hook/notifier_hub.bb
new file mode 100644
index 000000000..4255ce446
--- /dev/null
+++ b/doc/en/hook/notifier_hub.bb
@@ -0,0 +1 @@
+[h2]notifier_hub[/h2]
diff --git a/doc/en/hook/notifier_normal.bb b/doc/en/hook/notifier_normal.bb
new file mode 100644
index 000000000..0059baa47
--- /dev/null
+++ b/doc/en/hook/notifier_normal.bb
@@ -0,0 +1 @@
+[h2]notifier_normal[/h2]
diff --git a/doc/en/hook/obj_verbs.bb b/doc/en/hook/obj_verbs.bb
new file mode 100644
index 000000000..ca98229aa
--- /dev/null
+++ b/doc/en/hook/obj_verbs.bb
@@ -0,0 +1 @@
+[h2]obj_verbs[/h2]
diff --git a/doc/en/hook/oembed_probe.bb b/doc/en/hook/oembed_probe.bb
new file mode 100644
index 000000000..4f32ac267
--- /dev/null
+++ b/doc/en/hook/oembed_probe.bb
@@ -0,0 +1 @@
+[h2]oembed_probe[/h2]
diff --git a/doc/en/hook/other_encapsulate.bb b/doc/en/hook/other_encapsulate.bb
new file mode 100644
index 000000000..ea0cdf622
--- /dev/null
+++ b/doc/en/hook/other_encapsulate.bb
@@ -0,0 +1,7 @@
+[h2]other_encapsulate[/h2]
+
+Passed an array of 'data', 'pubkey', 'alg', 'result' when encrypting data with an algorithm (alg) which is unknown to the system. Hooks are expected to identify their algorithm, encrypt data with pubkey and place the result in 'result'.
+
+
+
+
diff --git a/doc/en/hook/other_unencapsulate.bb b/doc/en/hook/other_unencapsulate.bb
new file mode 100644
index 000000000..c8b0b617f
--- /dev/null
+++ b/doc/en/hook/other_unencapsulate.bb
@@ -0,0 +1,5 @@
+[h2]other_unencapsulate[/h2]
+
+Passed an array of 'data', 'prvkey', 'alg', 'result' when decrypting data with an algorithm (alg) which is unknown to the system. Hooks are expected to identify their algorithm, decrypt data with prvkey and place the result in 'result'.
+
+
diff --git a/doc/en/hook/page_content_top.bb b/doc/en/hook/page_content_top.bb
new file mode 100644
index 000000000..137e3abfd
--- /dev/null
+++ b/doc/en/hook/page_content_top.bb
@@ -0,0 +1 @@
+[h2]page_content_top[/h2]
diff --git a/doc/en/hook/page_end.bb b/doc/en/hook/page_end.bb
new file mode 100644
index 000000000..09293cf50
--- /dev/null
+++ b/doc/en/hook/page_end.bb
@@ -0,0 +1 @@
+[h2]page_end[/h2]
diff --git a/doc/en/hook/page_header.bb b/doc/en/hook/page_header.bb
new file mode 100644
index 000000000..ffaa791c9
--- /dev/null
+++ b/doc/en/hook/page_header.bb
@@ -0,0 +1 @@
+[h2]page_header[/h2]
diff --git a/doc/en/hook/page_meta.bb b/doc/en/hook/page_meta.bb
new file mode 100644
index 000000000..30a8f9440
--- /dev/null
+++ b/doc/en/hook/page_meta.bb
@@ -0,0 +1,13 @@
+[h2]page_meta[/h2]
+
+Called before generating the page header.
+
+[code]
+ $pagemeta = [ 'og:title' => self::$page['title'] ];
+
+ call_hooks('page_meta',$pagemeta);
+ foreach ($pagemeta as $metaproperty => $metavalue) {
+ self::$meta->set($metaproperty,$metavalue);
+ }
+
+[/code]
diff --git a/doc/en/hook/parse_atom.bb b/doc/en/hook/parse_atom.bb
new file mode 100644
index 000000000..c8037317f
--- /dev/null
+++ b/doc/en/hook/parse_atom.bb
@@ -0,0 +1 @@
+[h2]parse_atom[/h2]
diff --git a/doc/en/hook/parse_link.bb b/doc/en/hook/parse_link.bb
new file mode 100644
index 000000000..1c328059c
--- /dev/null
+++ b/doc/en/hook/parse_link.bb
@@ -0,0 +1 @@
+[h2]parse_link[/h2]
diff --git a/doc/en/hook/pdl_selector.bb b/doc/en/hook/pdl_selector.bb
new file mode 100644
index 000000000..bee01c843
--- /dev/null
+++ b/doc/en/hook/pdl_selector.bb
@@ -0,0 +1 @@
+[h2]pdl_selector[/h2]
diff --git a/doc/en/hook/perm_is_allowed.bb b/doc/en/hook/perm_is_allowed.bb
new file mode 100644
index 000000000..aac647609
--- /dev/null
+++ b/doc/en/hook/perm_is_allowed.bb
@@ -0,0 +1 @@
+[h2]perm_is_allowed[/h2]
diff --git a/doc/en/hook/permissions_create.bb b/doc/en/hook/permissions_create.bb
new file mode 100644
index 000000000..22f80a80e
--- /dev/null
+++ b/doc/en/hook/permissions_create.bb
@@ -0,0 +1 @@
+[h2]permissions_create[/h2]
diff --git a/doc/en/hook/permissions_update.bb b/doc/en/hook/permissions_update.bb
new file mode 100644
index 000000000..40366b33d
--- /dev/null
+++ b/doc/en/hook/permissions_update.bb
@@ -0,0 +1 @@
+[h2]permissions_update[/h2]
diff --git a/doc/en/hook/permit_hook.bb b/doc/en/hook/permit_hook.bb
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/doc/en/hook/permit_hook.bb
diff --git a/doc/en/hook/personal_xrd.bb b/doc/en/hook/personal_xrd.bb
new file mode 100644
index 000000000..71d4bd8dd
--- /dev/null
+++ b/doc/en/hook/personal_xrd.bb
@@ -0,0 +1 @@
+[h2]personal_xrd[/h2]
diff --git a/doc/en/hook/photo_post_end.bb b/doc/en/hook/photo_post_end.bb
new file mode 100644
index 000000000..8a3291763
--- /dev/null
+++ b/doc/en/hook/photo_post_end.bb
@@ -0,0 +1 @@
+[h2]photo_post_end[/h2]
diff --git a/doc/en/hook/photo_upload_begin.bb b/doc/en/hook/photo_upload_begin.bb
new file mode 100644
index 000000000..5e441a12a
--- /dev/null
+++ b/doc/en/hook/photo_upload_begin.bb
@@ -0,0 +1 @@
+[h2]photo_upload_begin[/h2]
diff --git a/doc/en/hook/photo_upload_end.bb b/doc/en/hook/photo_upload_end.bb
new file mode 100644
index 000000000..956175f1d
--- /dev/null
+++ b/doc/en/hook/photo_upload_end.bb
@@ -0,0 +1 @@
+[h2]photo_upload_end[/h2]
diff --git a/doc/en/hook/photo_upload_file.bb b/doc/en/hook/photo_upload_file.bb
new file mode 100644
index 000000000..726622ac0
--- /dev/null
+++ b/doc/en/hook/photo_upload_file.bb
@@ -0,0 +1 @@
+[h2]photo_upload_file[/h2]
diff --git a/doc/en/hook/photo_upload_form.bb b/doc/en/hook/photo_upload_form.bb
new file mode 100644
index 000000000..70b8318b8
--- /dev/null
+++ b/doc/en/hook/photo_upload_form.bb
@@ -0,0 +1 @@
+[h2]photo_upload_form[/h2]
diff --git a/doc/en/hook/photo_view_filter.bb b/doc/en/hook/photo_view_filter.bb
new file mode 100644
index 000000000..0780c1edc
--- /dev/null
+++ b/doc/en/hook/photo_view_filter.bb
@@ -0,0 +1 @@
+[h2]photo_view_filter[/h2]
diff --git a/doc/en/hook/poke_verbs.bb b/doc/en/hook/poke_verbs.bb
new file mode 100644
index 000000000..54d68c3a2
--- /dev/null
+++ b/doc/en/hook/poke_verbs.bb
@@ -0,0 +1 @@
+[h2]poke_verbs[/h2]
diff --git a/doc/en/hook/post_local.bb b/doc/en/hook/post_local.bb
new file mode 100644
index 000000000..5aa723cb9
--- /dev/null
+++ b/doc/en/hook/post_local.bb
@@ -0,0 +1 @@
+[h2]post_local[/h2]
diff --git a/doc/en/hook/post_local_end.bb b/doc/en/hook/post_local_end.bb
new file mode 100644
index 000000000..380166fdb
--- /dev/null
+++ b/doc/en/hook/post_local_end.bb
@@ -0,0 +1 @@
+[h2]post_local_end[/h2]
diff --git a/doc/en/hook/post_local_start.bb b/doc/en/hook/post_local_start.bb
new file mode 100644
index 000000000..2f684f67a
--- /dev/null
+++ b/doc/en/hook/post_local_start.bb
@@ -0,0 +1 @@
+[h2]post_local_start[/h2]
diff --git a/doc/en/hook/post_mail.bb b/doc/en/hook/post_mail.bb
new file mode 100644
index 000000000..8f67ad4f0
--- /dev/null
+++ b/doc/en/hook/post_mail.bb
@@ -0,0 +1 @@
+[h2]post_mail[/h2]
diff --git a/doc/en/hook/post_mail_end.bb b/doc/en/hook/post_mail_end.bb
new file mode 100644
index 000000000..7f0085773
--- /dev/null
+++ b/doc/en/hook/post_mail_end.bb
@@ -0,0 +1 @@
+[h2]post_mail_end[/h2]
diff --git a/doc/en/hook/post_remote.bb b/doc/en/hook/post_remote.bb
new file mode 100644
index 000000000..f8e087eee
--- /dev/null
+++ b/doc/en/hook/post_remote.bb
@@ -0,0 +1 @@
+[h2]post_remote[/h2]
diff --git a/doc/en/hook/post_remote_end.bb b/doc/en/hook/post_remote_end.bb
new file mode 100644
index 000000000..0fef20cbf
--- /dev/null
+++ b/doc/en/hook/post_remote_end.bb
@@ -0,0 +1 @@
+[h2]post_remote_end[/h2]
diff --git a/doc/en/hook/post_remote_update.bb b/doc/en/hook/post_remote_update.bb
new file mode 100644
index 000000000..fd358db28
--- /dev/null
+++ b/doc/en/hook/post_remote_update.bb
@@ -0,0 +1 @@
+[h2]post_remote_update[/h2]
diff --git a/doc/en/hook/post_remote_update_end.bb b/doc/en/hook/post_remote_update_end.bb
new file mode 100644
index 000000000..95f1e6f78
--- /dev/null
+++ b/doc/en/hook/post_remote_update_end.bb
@@ -0,0 +1 @@
+[h2]post_remote_update_end[/h2]
diff --git a/doc/en/hook/prepare_body.bb b/doc/en/hook/prepare_body.bb
new file mode 100644
index 000000000..3f1eaef85
--- /dev/null
+++ b/doc/en/hook/prepare_body.bb
@@ -0,0 +1 @@
+[h2]prepare_body[/h2]
diff --git a/doc/en/hook/prepare_body_final.bb b/doc/en/hook/prepare_body_final.bb
new file mode 100644
index 000000000..96d1ae389
--- /dev/null
+++ b/doc/en/hook/prepare_body_final.bb
@@ -0,0 +1 @@
+[h2]prepare_body_final[/h2]
diff --git a/doc/en/hook/prepare_body_init.bb b/doc/en/hook/prepare_body_init.bb
new file mode 100644
index 000000000..f3de79970
--- /dev/null
+++ b/doc/en/hook/prepare_body_init.bb
@@ -0,0 +1 @@
+[h2]prepare_body_init[/h2]
diff --git a/doc/en/hook/privacygroup_extras.bb b/doc/en/hook/privacygroup_extras.bb
new file mode 100644
index 000000000..bd67f2470
--- /dev/null
+++ b/doc/en/hook/privacygroup_extras.bb
@@ -0,0 +1,12 @@
+[h2]privacygroup_extras[/h2]
+
+Add items to the Privacy Group edit form
+
+[code]
+ $hookinfo = [ 'pgrp_extras' => '', 'group'=>$argv(1) ];
+ call_hooks ('privacygroup_extras',$hookinfo);
+ $pgrp_extras = $hookinfo['pgrp_extras'];
+[/code]
+
+see: Zotlabs/Module/Group.php
+see: view/tpl/privacy_groups.tpl
diff --git a/doc/en/hook/privacygroup_extras_drop.bb b/doc/en/hook/privacygroup_extras_drop.bb
new file mode 100644
index 000000000..fd27ab255
--- /dev/null
+++ b/doc/en/hook/privacygroup_extras_drop.bb
@@ -0,0 +1,11 @@
+[h2]privacygroup_extras_drop[/h2]
+
+Called after privacy group is dropped
+
+[code]
+ $hookinfo = [ 'pgrp_extras' => '', 'group'=>$argv(2) ];
+ call_hooks ('privacygroup_extras_drop',$hookinfo);
+[/code]
+
+see: Zotlabs/Module/Group.php
+see: view/tpl/privacy_groups.tpl
diff --git a/doc/en/hook/privacygroup_extras_post.bb b/doc/en/hook/privacygroup_extras_post.bb
new file mode 100644
index 000000000..704db1997
--- /dev/null
+++ b/doc/en/hook/privacygroup_extras_post.bb
@@ -0,0 +1,11 @@
+[h2]privacygroup_extras_post[/h2]
+
+Called as privacy group edit form is edited.
+
+[code]
+ $hookinfo = [ 'pgrp_extras' => '', 'group'=>$group['id'] ];
+ call_hooks ('privacygroup_extras_post',$hookinfo);
+[/code]
+
+see: Zotlabs/Module/Group.php
+see: view/tpl/privacy_groups.tpl
diff --git a/doc/en/hook/proc_run.bb b/doc/en/hook/proc_run.bb
new file mode 100644
index 000000000..a3759794a
--- /dev/null
+++ b/doc/en/hook/proc_run.bb
@@ -0,0 +1 @@
+[h2]proc_run[/h2]
diff --git a/doc/en/hook/process_channel_sync_delivery.bb b/doc/en/hook/process_channel_sync_delivery.bb
new file mode 100644
index 000000000..c0416c8cb
--- /dev/null
+++ b/doc/en/hook/process_channel_sync_delivery.bb
@@ -0,0 +1 @@
+[h2]process_channel_sync_delivery[/h2]
diff --git a/doc/en/hook/profile_advanced.bb b/doc/en/hook/profile_advanced.bb
new file mode 100644
index 000000000..65e56afd6
--- /dev/null
+++ b/doc/en/hook/profile_advanced.bb
@@ -0,0 +1 @@
+[h2]profile_advanced[/h2]
diff --git a/doc/en/hook/profile_edit.bb b/doc/en/hook/profile_edit.bb
new file mode 100644
index 000000000..e60663d4a
--- /dev/null
+++ b/doc/en/hook/profile_edit.bb
@@ -0,0 +1 @@
+[h2]profile_edit[/h2]
diff --git a/doc/en/hook/profile_photo_content_end.bb b/doc/en/hook/profile_photo_content_end.bb
new file mode 100644
index 000000000..518415c4d
--- /dev/null
+++ b/doc/en/hook/profile_photo_content_end.bb
@@ -0,0 +1 @@
+[h2]profile_photo_content_end[/h2]
diff --git a/doc/en/hook/profile_post.bb b/doc/en/hook/profile_post.bb
new file mode 100644
index 000000000..d22d8fbc7
--- /dev/null
+++ b/doc/en/hook/profile_post.bb
@@ -0,0 +1 @@
+[h2]profile_post[/h2]
diff --git a/doc/en/hook/profile_sidebar.bb b/doc/en/hook/profile_sidebar.bb
new file mode 100644
index 000000000..bfd059e4b
--- /dev/null
+++ b/doc/en/hook/profile_sidebar.bb
@@ -0,0 +1 @@
+[h2]profile_sidebar[/h2]
diff --git a/doc/en/hook/profile_sidebar_enter.bb b/doc/en/hook/profile_sidebar_enter.bb
new file mode 100644
index 000000000..9d6726a30
--- /dev/null
+++ b/doc/en/hook/profile_sidebar_enter.bb
@@ -0,0 +1 @@
+[h2]profile_sidebar_enter[/h2]
diff --git a/doc/en/hook/register_account.bb b/doc/en/hook/register_account.bb
new file mode 100644
index 000000000..df4de2b30
--- /dev/null
+++ b/doc/en/hook/register_account.bb
@@ -0,0 +1 @@
+[h2]register_account[/h2]
diff --git a/doc/en/hook/render_location.bb b/doc/en/hook/render_location.bb
new file mode 100644
index 000000000..41501c087
--- /dev/null
+++ b/doc/en/hook/render_location.bb
@@ -0,0 +1 @@
+[h2]render_location[/h2]
diff --git a/doc/en/hook/replace_macros.bb b/doc/en/hook/replace_macros.bb
new file mode 100644
index 000000000..fac39dd7b
--- /dev/null
+++ b/doc/en/hook/replace_macros.bb
@@ -0,0 +1 @@
+[h2]replace_macros[/h2]
diff --git a/doc/en/hook/reverse_magic_auth.bb b/doc/en/hook/reverse_magic_auth.bb
new file mode 100644
index 000000000..4cbd84b93
--- /dev/null
+++ b/doc/en/hook/reverse_magic_auth.bb
@@ -0,0 +1 @@
+[h2]reverse_magic_auth[/h2]
diff --git a/doc/en/hook/settings_form.bb b/doc/en/hook/settings_form.bb
new file mode 100644
index 000000000..d65341181
--- /dev/null
+++ b/doc/en/hook/settings_form.bb
@@ -0,0 +1 @@
+[h2]settings_form[/h2]
diff --git a/doc/en/hook/settings_post.bb b/doc/en/hook/settings_post.bb
new file mode 100644
index 000000000..f72546c11
--- /dev/null
+++ b/doc/en/hook/settings_post.bb
@@ -0,0 +1 @@
+[h2]settings_post[/h2]
diff --git a/doc/en/hook/sexpref_selector.bb b/doc/en/hook/sexpref_selector.bb
new file mode 100644
index 000000000..b4dad6b38
--- /dev/null
+++ b/doc/en/hook/sexpref_selector.bb
@@ -0,0 +1 @@
+[h2]sexpref_selector[/h2]
diff --git a/doc/en/hook/sexpref_selector_min.bb b/doc/en/hook/sexpref_selector_min.bb
new file mode 100644
index 000000000..6f49946af
--- /dev/null
+++ b/doc/en/hook/sexpref_selector_min.bb
@@ -0,0 +1 @@
+[h2]sexpref_selector_min[/h2]
diff --git a/doc/en/hook/smilie.bb b/doc/en/hook/smilie.bb
new file mode 100644
index 000000000..575acc178
--- /dev/null
+++ b/doc/en/hook/smilie.bb
@@ -0,0 +1,19 @@
+[h2]smilie[/h2]
+
+
+Called when processing translation of emoticons. It is passed an array containing two sub-arrays:
+
+ array(
+ 'texts' => array('text1','text2',...),
+ 'icons' => array('icon1','icon2',...)
+ );
+
+ texts is the emoticon text - for example ':-)' for a traditional smile face.
+ icons is the HTML used as a replacement. For example
+ '&lt;img class="smiley" src="https://localhost/images/smiley-smile.gif" alt=":-)" /&gt;'
+
+ If adding or removing an entry from either array, the corresponding element from the matching array must also
+ be added or removed. Emoticons less than three characters in length or not recommended as they get triggered
+ incorrectly quite often. Extended emoticons are indicated by convention using a preceding colon, for example
+
+ :walrus_kissing_a_baby \ No newline at end of file
diff --git a/doc/en/hook/status_editor.bb b/doc/en/hook/status_editor.bb
new file mode 100644
index 000000000..00e97a7c9
--- /dev/null
+++ b/doc/en/hook/status_editor.bb
@@ -0,0 +1,31 @@
+[h2]status_editor[/h2]
+
+Replace the default status_editor (jot).
+
+Allow plugins to replace the default status editor in a context dependent manner.
+
+It is fed an array of ['editor_html' => '', 'x' => $x, 'popup' => $popup, 'module' => $module].
+
+All calls to the status_editor at the time of the creation of this hook have been updated
+to set $module at invocation. This allows addon developers to have a context dependent editor
+based on the Hubzilla module/addon.
+
+Calls to status_editor() are in the form of:
+ status_editor($a, $x, $popup, $module).
+
+Future module/addon developers are encouraged to set $popup and $module when invoking the
+status_editor.
+
+
+[code]
+ $hook_info = ['editor_html' => '', 'x' => $x, 'popup' => $popup, 'module' => $module];
+ call_hooks('status_editor',$hook_info);
+ if ($hook_info['editor_html'] == '') {
+ return hz_status_editor($a, $x, $popup);
+ } else {
+ return $hook_info['editor_html'];
+ }
+
+[/code]
+
+see: include/conversation.php
diff --git a/doc/en/hook/stream_item.bb b/doc/en/hook/stream_item.bb
new file mode 100644
index 000000000..30086961d
--- /dev/null
+++ b/doc/en/hook/stream_item.bb
@@ -0,0 +1,13 @@
+[h2]stream_item[/h2]
+
+
+Called for each item processed for viewing by conversation();
+
+The hook data consists of an array
+
+ array(
+ 'mode' => current mode of conversation()
+ 'item' => item being processed
+ );
+
+ Set item['blocked'] to block the item from viewing. This action will not affect comment or sub-thread counts, so if there are three comments in a conversation and you block one, three comments will still be reported even though only two are visible.
diff --git a/doc/en/hook/system_app_installed_filter.bb b/doc/en/hook/system_app_installed_filter.bb
new file mode 100644
index 000000000..a269a79a8
--- /dev/null
+++ b/doc/en/hook/system_app_installed_filter.bb
@@ -0,0 +1,18 @@
+[h2]system_app_installed_filter[/h2]
+
+Allow plugins to filter the result of system_app_installed.
+
+Code excerpt:
+
+[code]
+ $filter_arr = [
+ 'uid'=>$uid,
+ 'app'=>$app,
+ 'installed'=>$r
+ ];
+ call_hooks('system_app_installed_filter',$filter_arr);
+ $r = $filter_arr['installed'];
+[/code]
+
+cxref: Zotlabs/Lib/Apps.php
+
diff --git a/doc/en/hook/tagged.bb b/doc/en/hook/tagged.bb
new file mode 100644
index 000000000..05d081d07
--- /dev/null
+++ b/doc/en/hook/tagged.bb
@@ -0,0 +1,16 @@
+[h2]tagged[/h2]
+
+
+This hook is called when a delivery is made which results in the recipient being tagged.
+
+The hook data is an array containing
+
+ array(
+ 'channel_id' => int,
+ 'item' => item structure of the delivered item from database,
+ 'body' => the body of the referenced item
+
+ );
+
+ Note: This hook is called before secondary delivery chains are invoked in the case of tagging a forum. This means that permissions and some item attributes will be those of the item before being re-packaged and before ownership of this item is given to the forum.
+
diff --git a/doc/en/hook/update_unseen.bb b/doc/en/hook/update_unseen.bb
new file mode 100644
index 000000000..8fb02c239
--- /dev/null
+++ b/doc/en/hook/update_unseen.bb
@@ -0,0 +1,9 @@
+[h3]update_unseen[/h3]
+
+Called prior to automatically marking items 'seen'; allowing a plugin the choice to not perform this action.
+
+hook data
+
+[ 'channel_id' => local_channel(), 'update' => 'unset' ];
+
+If 'update' is set to 0 or false on return, the update operation is not performed. \ No newline at end of file
diff --git a/doc/en/hook/validate_channelname.bb b/doc/en/hook/validate_channelname.bb
new file mode 100644
index 000000000..2ab12bbec
--- /dev/null
+++ b/doc/en/hook/validate_channelname.bb
@@ -0,0 +1,23 @@
+[h2]validate_channelname[/h2]
+
+Called when creating a new channel or changing the channel name in mod/settings.php
+
+Hook data consists of an array
+
+ array(
+ 'name' => supplied name
+ );
+
+ If the hook handler determines the name is valid, do nothing. If there is an issue with the name,
+ set $hook_data['message'] to the message text which should be displayed to the member - and the name will
+ not be accepted.
+
+
+ Example:
+ [code]
+ if(mb_strlen($hook_data['name']) < 3)
+ $hook_data['message'] = t('Name too short.');
+ [/code]
+
+
+ \ No newline at end of file
diff --git a/doc/en/hook/webfinger.bb b/doc/en/hook/webfinger.bb
new file mode 100644
index 000000000..7cc24322f
--- /dev/null
+++ b/doc/en/hook/webfinger.bb
@@ -0,0 +1 @@
+[h2]webfinger[/h2]
diff --git a/doc/en/hook/well_known.bb b/doc/en/hook/well_known.bb
new file mode 100644
index 000000000..778b27a02
--- /dev/null
+++ b/doc/en/hook/well_known.bb
@@ -0,0 +1 @@
+[h2]well_known[/h2]
diff --git a/doc/en/hook/wiki_preprocess.bb b/doc/en/hook/wiki_preprocess.bb
new file mode 100644
index 000000000..913b601ba
--- /dev/null
+++ b/doc/en/hook/wiki_preprocess.bb
@@ -0,0 +1,11 @@
+[h3]wiki_preprocess[/h3]
+
+Called before markdown/bbcode processors are run for wiki pages
+
+Passed parameter array:
+
+ 'content' => wiki page content
+ 'mimetype' => page mimetype
+
+
+see: Zotlabs/Module/Wiki.php
diff --git a/doc/en/hook/zid.bb b/doc/en/hook/zid.bb
new file mode 100644
index 000000000..2210c1342
--- /dev/null
+++ b/doc/en/hook/zid.bb
@@ -0,0 +1 @@
+[h2]zid[/h2]
diff --git a/doc/en/hook/zid_init.bb b/doc/en/hook/zid_init.bb
new file mode 100644
index 000000000..131dd8f72
--- /dev/null
+++ b/doc/en/hook/zid_init.bb
@@ -0,0 +1 @@
+[h2]zid_init[/h2]
diff --git a/doc/en/hook/zot_best_algorithm.bb b/doc/en/hook/zot_best_algorithm.bb
new file mode 100644
index 000000000..ccde505cb
--- /dev/null
+++ b/doc/en/hook/zot_best_algorithm.bb
@@ -0,0 +1,3 @@
+[h2]zot_best_algorithm[/h2]
+
+
diff --git a/doc/en/hook/zot_finger.bb b/doc/en/hook/zot_finger.bb
new file mode 100644
index 000000000..9383b4c31
--- /dev/null
+++ b/doc/en/hook/zot_finger.bb
@@ -0,0 +1 @@
+[h2]zot_finger[/h2]
diff --git a/doc/en/hooklist.bb b/doc/en/hooklist.bb
new file mode 100644
index 000000000..7231cd185
--- /dev/null
+++ b/doc/en/hooklist.bb
@@ -0,0 +1,698 @@
+[h2]Hooks[/h2]
+
+Hooks allow plugins/addons to "hook into" the code at many points and alter the behaviour or otherwise perform independent actions when an activity takes place or when certain data structures are accessed. There are many hooks which allow you to tie into the software at most any point and do something slightly different than the default thing. These hooks are passed two variables. The first is the App structure which contains details about the entire state of the page request as we build the resulting page. The second is unique to the specific hook that is called and provides specific detail about what is happening in the software at the time the hook is invoked.
+
+[zrl=[baseurl]/help/hooks]Generated index of all hooks and the files which call them[/zrl]
+
+[zrl=[baseurl]/help/hook/module_mod_aftercontent]module_mod_aftercontent[/zrl]
+ General purpose hook for any module, executed after mod_content(). Replace 'module' with module name, e.g. 'photos_mod_aftercontent'.
+
+[zrl=[baseurl]/help/hook/module_mod_content]module_mod_content[/zrl]
+ General purpose hook for any module, executed before mod_content(). Replace 'module' with module name, e.g. 'photos_mod_content'.
+
+[zrl=[baseurl]/help/hook/module_mod_init]module_mod_init[/zrl]
+ General purpose hook for any module, executed before mod_init(). Replace 'module' with module name, e.g. 'photos_mod_init'.
+
+[zrl=[baseurl]/help/hook/module_mod_post]module_mod_post[/zrl]
+ General purpose hook for any module, executed before mod_post(). Replace 'module' with module name, e.g. 'photos_mod_post'.
+
+[zrl=[baseurl]/help/hook/about_hook]about_hook[/zrl]
+ Called from the siteinfo page
+
+[zrl=[baseurl]/help/hook/accept_follow]accept_follow[/zrl]
+ Called when accepting a connection (friend request)
+
+[zrl=[baseurl]/help/hook/account_downgrade]account_downgrade[/zrl]
+ Called when an account has expired, indicating a potential downgrade to "basic" service class
+
+[zrl=[baseurl]/help/hook/account_settings]account_settings[/zrl]
+ Called when generating the account settings form
+
+[zrl=[baseurl]/help/hook/account_settings_post]account_settings_post[/zrl]
+ Called when posting from the account settings form
+
+[zrl=[baseurl]/help/hook/activity_filter]activity_filter[/zrl]
+ Called when generating the list of filters for the network page
+
+[zrl=[baseurl]/help/hook/activity_filter]activity_mapper[/zrl]
+ Called when determining the activity type for transmission.
+
+[zrl=[baseurl]/help/hook/activity_filter]activity_decode_mapper[/zrl]
+ Called when determining the activity type for transmission.
+
+[zrl=[baseurl]/help/hook/activity_filter]activity_obj_mapper[/zrl]
+ Called when determining the object type for transmission.
+
+[zrl=[baseurl]/help/hook/activity_filter]activity_obj_decode_mapper[/zrl]
+ Called when determining the object type for transmission.
+
+[zrl=[baseurl]/help/hook/activity_order]activity_order[/zrl]
+ Called when generating the list of order options for the network page
+
+[zrl=[baseurl]/help/hook/addon_app_installed_filter]addon_app_installed_filter[/zrl]
+ Called when determining whether an addon_app is installed
+
+[zrl=[baseurl]/help/hook/activity_received]activity_received[/zrl]
+ Called when an activity (post, comment, like, etc.) has been received from a zot source
+
+[zrl=[baseurl]/help/hook/admin_aside]admin_aside[/zrl]
+ Called when generating the admin page sidebar widget
+
+[zrl=[baseurl]/help/hook/affinity_labels]affinity_labels[/zrl]
+ Used to generate alternate labels for the affinity slider.
+
+[zrl=[baseurl]/help/hook/api_perm_is_allowed]api_perm_is_allowed[/zrl]
+ Called when perm_is_allowed() is executed from an API call.
+
+[zrl=[baseurl]/help/hook/app_destroy]app_destroy[/zrl]
+ Called when an app is deleted
+
+[zrl=[baseurl]/help/hook/app_installed_filter]app_installed_filter[/zrl]
+ Called when determining whether an app is installed
+
+[zrl=[baseurl]/help/hook/app_menu]app_menu[/zrl]
+ Called when generating the app_menu dropdown (may be obsolete)
+
+[zrl=[baseurl]/help/hook/attach_delete]attach_delete[/zrl]
+ Called when attachments are deleted from the attach table
+
+[zrl=[baseurl]/help/hook/atom_author]atom_author[/zrl]
+ Called when generating an author or owner element for an Atom ActivityStream feed
+
+[zrl=[baseurl]/help/hook/atom_entry]atom_entry[/zrl]
+ Called when generating each item entry of an Atom ActivityStreams feed
+
+[zrl=[baseurl]/help/hook/atom_feed]atom_feed[/zrl]
+ Called when generating an Atom ActivityStreams feed
+
+[zrl=[baseurl]/help/hook/atom_feed_end]atom_feed_end[/zrl]
+ Called when generation of an Atom ActivityStreams feed is completed
+
+[zrl=[baseurl]/help/hook/attach_upload_file]attach_upload_file[/zrl]
+ Called when uploading a file
+
+[zrl=[baseurl]/help/hook/authenticate]authenticate[/zrl]
+ Can provide alternate authentication mechanisms
+
+[zrl=[baseurl]/help/hook/author_is_pmable]author_is_pmable[/zrl]
+ Called from the thread action menu to determine if we can send private mail to the post author
+
+[zrl=[baseurl]/help/hook/bb2diaspora]bb2diaspora[/zrl]
+ called when converting bbcode to markdown
+
+[zrl=[baseurl]/help/hook/bbcode]bbcode[/zrl]
+ Called at end of converting bbcode to HTML
+
+[zrl=[baseurl]/help/hook/bbcode_filter]bbcode_filter[/zrl]
+ Called when beginning to convert bbcode to HTML
+
+[zrl=[baseurl]/help/hook/bb_translate_video]bb_translate_video[/zrl]
+ Called when extracting embedded services from bbcode video elements (rarely used)
+
+[zrl=[baseurl]/help/hook/build_pagehead]build_pagehead[/zrl]
+ Called when creating the HTML page header
+
+[zrl=[baseurl]/help/hook/can_comment_on_post]can_comment_on_post[/zrl]
+ Called when deciding whether or not to present a comment box for a post
+
+[zrl=[baseurl]/help/hook/change_channel]change_channel[/zrl]
+ Called when logging in to a channel (either during login or afterward through the channel manager)
+
+[zrl=[baseurl]/help/hook/channel_remove]channel_remove[/zrl]
+ Called when removing a channel
+
+[zrl=[baseurl]/help/hook/channel_links]channel_links[/zrl]
+ Called when generating the Link: HTTP header for a channel
+
+[zrl=[baseurl]/help/hook/channel_settings]channel_settings[/zrl]
+ Called when displaying the channel settings page
+
+[zrl=[baseurl]/help/hook/chat_message]chat_message[/zrl]
+ Called to create a chat message.
+
+[zrl=[baseurl]/help/hook/chat_post]chat_post[/zrl]
+ Called when a chat message has been posted
+
+[zrl=[baseurl]/help/hook/check_account_email]check_account_email[/zrl]
+ Validate the email provided in an account registration
+
+[zrl=[baseurl]/help/hook/check_account_invite]check_account_invite[/zrl]
+ Validate an invitation code when using site invitations
+
+[zrl=[baseurl]/help/hook/check_account_password]check_account_password[/zrl]
+ Used to provide policy control over account passwords (minimum length, character set inclusion, etc.)
+
+[zrl=[baseurl]/help/hook/check_channelallowed]check_channelallowed[/zrl]
+ Used to over-ride or bypass the channel black/white block lists
+
+[zrl=[baseurl]/help/hook/check_siteallowed]check_siteallowed[/zrl]
+ Used to over-ride or bypass the site black/white block lists
+
+[zrl=[baseurl]/help/hook/collect_public_recipients]collect_public_recipients[/zrl]
+ Used to establish a list of recipients to send a public message to.
+
+[zrl=[baseurl]/help/hook/comment_buttons]comment_buttons[/zrl]
+ Called when rendering the edit buttons for comments
+
+[zrl=[baseurl]/help/hook/comments_are_now_closed]comments_are_now_closed[/zrl]
+ Called when deciding whether or not to present a comment box for a post
+
+[zrl=[baseurl]/help/hook/connect_premium]connect_premium[/zrl]
+ Called when connecting to a premium channel
+
+[zrl=[baseurl]/help/hook/connection_remove]connection_remove[/zrl]
+ Called when deleting/removing a connection
+
+[zrl=[baseurl]/help/hook/connector_settings]connector_settings[/zrl]
+ Called when posting to the features/addon settings page
+
+[zrl=[baseurl]/help/hook/construct_page]construct_page[/zrl]
+ General purpose hook to provide content to certain page regions. Called when constructing the Comanche page.
+
+[zrl=[baseurl]/help/hook/contact_block_end]contact_block_end[/zrl]
+ Called when generating the sidebar "Connections" widget
+
+[zrl=[baseurl]/help/hook/contact_edit]contact_edit[/zrl]
+ Called when editing a connection via connedit
+
+[zrl=[baseurl]/help/hook/contact_edit_post]contact_edit_post[/zrl]
+ Called when posting to connedit
+
+[zrl=[baseurl]/help/hook/contact_select_options]contact_select_options[/zrl]
+ Deprecated/unused
+
+[zrl=[baseurl]/help/hook/content_security_policy]content_security_policy[/zrl]
+ Called prior to output of the Content-Security-Policy header
+
+[zrl=[baseurl]/help/hook/conversation_start]conversation_start[/zrl]
+ Called in the beginning of rendering a conversation (message or message collection or stream)
+
+[zrl=[baseurl]/help/hook/cover_photo_content_end]cover_photo_content_end[/zrl]
+ Called after a cover photo has been uplaoded
+
+[zrl=[baseurl]/help/hook/create_identity]create_identity[/zrl]
+ Called when creating a channel
+
+[zrl=[baseurl]/help/hook/cron]cron[/zrl]
+ Called when scheduled tasks (poller) is executed
+
+[zrl=[baseurl]/help/hook/cron_daily]cron_daily[/zrl]
+ Called when daily scheduled tasks are executed
+
+[zrl=[baseurl]/help/hook/cron_weekly]cron_weekly[/zrl]
+ Called when weekly scheduled tasks are executed
+
+[zrl=[baseurl]/help/hook/crypto_methods]crypto_methods[/zrl]
+ Called when generating a list of crypto algorithms in the locally preferred order
+
+[zrl=[baseurl]/help/hook/daemon_addon]daemon_addon[/zrl]
+ Called when invoking the extensible background daemon
+
+[zrl=[baseurl]/help/hook/daemon_master_release]daemon_master_release[/zrl]
+ Called at the start of processing \Zotlabs\Daemon\Master::Release()
+
+[zrl=[baseurl]/help/hook/directory_item]directory_item[/zrl]
+ Called when generating a directory listing for display
+
+[zrl=[baseurl]/help/hook/discover_channel_webfinger]discover_channel_webfinger[/zrl]
+ Called when performing a webfinger lookup
+
+[zrl=[baseurl]/help/hook/display_item]display_item[/zrl]
+ Called for each item being displayed in a conversation thread
+
+[zrl=[baseurl]/help/hook/display_settings]display_settings[/zrl]
+ Called from settings module when displaying the 'display settings' section
+
+[zrl=[baseurl]/help/hook/display_settings_post]display_settings_post[/zrl]
+ Called when posting from the settings module 'display settings' form
+
+[zrl=[baseurl]/help/hook/donate_contributors]donate_contributors[/zrl]
+ called by the 'donate' addon when generating a list of donation recipients
+
+[zrl=[baseurl]/help/hook/donate_plugin]donate_plugin[/zrl]
+ called by the 'donate' addon
+
+[zrl=[baseurl]/help/hook/donate_sponsors]donate_sponsors[/zrl]
+ called by the 'donate' addon
+
+[zrl=[baseurl]/help/hook/dreport_is_storable]dreport_is_storable[/zrl]
+ called before storing a dreport record to determine whether to store it
+
+[zrl=[baseurl]/help/hook/dreport_process]dreport_process[/zrl]
+ called for each valid delivery report
+
+[zrl=[baseurl]/help/hook/dropdown_extras]dropdown_extras[/zrl]
+ Add additional items to the dropdown cog when item/threads are displayed.
+
+[zrl=[baseurl]/help/hook/drop_item]drop_item[/zrl]
+ called when an 'item' is removed
+
+[zrl=[baseurl]/help/hook/encode_object]encode_object[/zrl]
+ called when encoding an object for transmission.
+
+[zrl=[baseurl]/help/hook/enotify]enotify[/zrl]
+ called before any notification
+
+[zrl=[baseurl]/help/hook/enotify_mail]enotify_mail[/zrl]
+ called when sending a notification email
+
+[zrl=[baseurl]/help/hook/enotify_store]enotify_store[/zrl]
+ called when storing a notification record
+
+[zrl=[baseurl]/help/hook/enotify_store_end]enotify_store_end[/zrl]
+ called after a notification record has been stored
+
+[zrl=[baseurl]/help/hook/event_created]event_created[/zrl]
+ called when an event record is created
+
+[zrl=[baseurl]/help/hook/event_store_event]event_store_event[/zrl]
+ called when an event record is created or updated
+
+[zrl=[baseurl]/help/hook/event_updated]event_updated[/zrl]
+ called when an event record is modified
+
+[zrl=[baseurl]/help/hook/externals_url_select]externals_url_select[/zrl]
+ called when generating a list of random sites to pull public posts from
+
+[zrl=[baseurl]/help/hook/feature_enabled]feature_enabled[/zrl]
+ called when 'feature_enabled()' is used
+
+[zrl=[baseurl]/help/hook/feature_settings]feature_settings[/zrl]
+ called from settings page when visiting 'addon/feature settings'
+
+[zrl=[baseurl]/help/hook/feature_settings_post]feature_settings_post[/zrl]
+ called from settings page when posting from 'addon/feature settings'
+
+[zrl=[baseurl]/help/hook/fetch_and_store]fetch_and_store[/zrl]
+ called to allow filtering of 'decoded' items before storage.
+
+[zrl=[baseurl]/help/hook/file_thumbnail]file_thumbnail[/zrl]
+ called when generating thumbnail images for cloud page in 'view tiles' mode
+
+[zrl=[baseurl]/help/hook/follow]follow[/zrl]
+ called when a follow operation takes place
+
+[zrl=[baseurl]/help/hook/follow_from_feed]follow_from_feed[/zrl]
+ called when a follow operation takes place on an RSS feed
+
+[zrl=[baseurl]/help/hook/follow_allow]follow_allow[/zrl]
+ called before storing the results of a follow operation
+
+[zrl=[baseurl]/help/hook/gender_selector]gender_selector[/zrl]
+ called when creating the 'gender' drop down list (advanced profile)
+
+[zrl=[baseurl]/help/hook/gender_selector_min]gender_selector_min[/zrl]
+ called when creating the 'gender' drop down list (normal profile)
+
+[zrl=[baseurl]/help/hook/generate_map]generate_map[/zrl]
+ called to generate the HTML for displaying a map location by coordinates
+
+[zrl=[baseurl]/help/hook/generate_named_map]generate_named_map[/zrl]
+ called to generate the HTML for displaying a map location by text location
+
+[zrl=[baseurl]/help/hook/get_all_api_perms]get_all_api_perms[/zrl]
+ Called when retrieving the permissions for API uses
+
+[zrl=[baseurl]/help/hook/get_all_perms]get_all_perms[/zrl]
+ called when get_all_perms() is used
+
+[zrl=[baseurl]/help/hook/get_best_language]get_best_language[/zrl]
+ called when choosing the preferred language for the page
+
+[zrl=[baseurl]/help/hook/get_default_export_sections]get_default_export_sections[/zrl]
+ Called to get the default list of functional data groups to export in identity_basic_export()
+
+[zrl=[baseurl]/help/hook/get_features]get_features[/zrl]
+ Called when get_features() is called
+
+[zrl=[baseurl]/help/hook/get_photo]get_photo[/zrl]
+ Called when photo content (except for profile photos) is fetched in mod_photo
+
+[zrl=[baseurl]/help/hook/get_profile_photo]get_profile_photo[/zrl]
+ Called when local profile photo content is fetched in mod_photo
+
+[zrl=[baseurl]/help/hook/get_role_perms]get_role_perms[/zrl]
+ Called when get_role_perms() is called to obtain permissions for named permission roles
+
+[zrl=[baseurl]/help/hook/global_permissions]global_permissions[/zrl]
+ Called when the global permissions list is generated
+
+[zrl=[baseurl]/help/hook/home_content]home_content[/zrl]
+ Called from mod_home to replace the content of the home page
+
+[zrl=[baseurl]/help/hook/home_init]home_init[/zrl]
+ Called from the home page home_init() function
+
+[zrl=[baseurl]/help/hook/hostxrd]hostxrd[/zrl]
+ Called when generating .well-known/hosts-meta for "old webfinger" (used by Diaspora protocol)
+
+[zrl=[baseurl]/help/hook/html2bb_video]html2bb_video[/zrl]
+ Called when using the html2bbcode translation to handle embedded media
+
+[zrl=[baseurl]/help/hook/html2bbcode]html2bbcode[/zrl]
+ Called when using the html2bbcode translation
+
+[zrl=[baseurl]/help/hook/identity_basic_export]identity_basic_export[/zrl]
+ Called when exporting a channel's basic information for backup or transfer
+
+[zrl=[baseurl]/help/hook/import_author_xchan]import_author_xchan[/zrl]
+ Called when looking up an author of a post by xchan_hash to ensure they have an xchan record on our site
+
+[zrl=[baseurl]/help/hook/import_channel]import_channel[/zrl]
+ Called when importing a channel from a file or API source
+
+[zrl=[baseurl]/help/hook/import_directory_profile]import_directory_profile[/zrl]
+ Called when processing delivery of a profile structure from an external source (usually for directory storage)
+
+[zrl=[baseurl]/help/hook/import_xchan]import_xchan[/zrl]
+ Called when processing the result of zot_finger() to store the result
+
+[zrl=[baseurl]/help/hook/item_photo_menu]item_photo_menu[/zrl]
+ Called when generating the list of actions associated with a displayed conversation item
+
+[zrl=[baseurl]/help/hook/item_store]item_store[/zrl]
+ Called when item_store() stores a record of type item
+
+[zrl=[baseurl]/help/hook/item_stored]item_stored[/zrl]
+ Called after item_store() has stored a record of type item in the database.
+
+[zrl=[baseurl]/help/hook/item_custom]item_custom[/zrl]
+ Called before item_store() stores a record of type item (allowing addons to process ITEM_TYPE_CUSTOM items).
+
+[zrl=[baseurl]/help/hook/item_store_update]item_store_update[/zrl]
+ Called when item_store_update() is called to update a stored item.
+
+[zrl=[baseurl]/help/hook/item_stored_update]item_stored_update[/zrl]
+ Called after item_store_update() has updated a stored item.
+
+[zrl=[baseurl]/help/hook/item_translate]item_translate[/zrl]
+ Called from item_store and item_store_update after the post language has been autodetected
+
+[zrl=[baseurl]/help/hook/jot_networks]jot_networks[/zrl]
+ Called to generate the list of additional post plugins to enable from the ACL form
+
+[zrl=[baseurl]/help/hook/jot_tool]jot_tool[/zrl]
+ Deprecated and possibly obsolete. Allows one to add action buttons to the post editor.
+
+[zrl=[baseurl]/help/hook/jot_tpl_filter]jot_tpl_filter[/zrl]
+ Called to filter template vars before replacement in jot.tpl.
+
+[zrl=[baseurl]/help/hook/jot_header_tpl_filter]jot_header_tpl_filter[/zrl]
+ Called to filter template vars before replacement in jot_header.tpl.
+
+[zrl=[baseurl]/help/hook/legal_webbie]legal_webbie[/zrl]
+ Called to validate a channel address
+
+[zrl=[baseurl]/help/hook/legal_webbie_text]legal_webbie_text[/zrl]
+ Provides an explanation of text/character restrictions for legal_webbie()
+
+[zrl=[baseurl]/help/hook/load_pdl]load_pdl[/zrl]
+ Called when we load a PDL file or description
+
+[zrl=[baseurl]/help/hook/local_dir_update]local_dir_update[/zrl]
+ Called when processing a directory update from a channel on the directory server
+
+[zrl=[baseurl]/help/hook/location_move]location_move[/zrl]
+ Called when a new location has been provided to a UNO channel (indicating a move rather than a clone)
+
+[zrl=[baseurl]/help/hook/logged_in]logged_in[/zrl]
+ Called when authentication by any means has succeeeded
+
+[zrl=[baseurl]/help/hook/logger]logger[/zrl]
+ Called when making an entry to the application logfile
+
+[zrl=[baseurl]/help/hook/logging_out]logging_out[/zrl]
+ Called when logging out
+
+[zrl=[baseurl]/help/hook/login_hook]login_hook[/zrl]
+ Called when generating the login form
+
+[zrl=[baseurl]/help/hook/magic_auth]magic_auth[/zrl]
+ Called when processing a magic-auth sequence
+
+[zrl=[baseurl]/help/hook/markdown_to_bb]markdown_to_bb[/zrl]
+ Called when processing markdown conversion
+
+[zrl=[baseurl]/help/hook/match_webfinger_location]match_webfinger_location[/zrl]
+ Called when processing webfinger requests
+
+[zrl=[baseurl]/help/hook/magic_auth_openid_success]magic_auth_openid_success[/zrl]
+ Called when a magic-auth was successful due to openid credentials
+
+[zrl=[baseurl]/help/hook/magic_auth_success]magic_auth_success[/zrl]
+ Called when a magic-auth was successful
+
+[zrl=[baseurl]/help/hook/main_slider]main_slider[/zrl]
+ Called when generating the affinity tool
+
+[zrl=[baseurl]/help/hook/marital_selector]marital_selector[/zrl]
+ Called when generating the list of choices for the 'marital status' profile dropdown (advanced profile)
+
+[zrl=[baseurl]/help/hook/marital_selector_min]marital_selector_min[/zrl]
+ Called when generating the list of choices for the 'marital status' profile dropdown (normal profile)
+
+[zrl=[baseurl]/help/hook/module_loaded]module_loaded[/zrl]
+ Called when a module has been successfully locate to server a URL request
+
+[zrl=[baseurl]/help/hook/mood_verbs]mood_verbs[/zrl]
+ Called when generating the list of moods
+
+[zrl=[baseurl]/help/hook/nav]nav[/zrl]
+ Called when generating the navigation bar
+
+[zrl=[baseurl]/help/hook/network_content_init]network_content_init[/zrl]
+ Called when loading cntent for the network page
+
+[zrl=[baseurl]/help/hook/network_ping]network_ping[/zrl]
+ Called during a ping request
+
+[zrl=[baseurl]/help/hook/network_to_name]network_to_name[/zrl]
+ Deprecated
+
+[zrl=[baseurl]/help/hook/notifier_end]notifier_end[/zrl]
+ Called when a delivery loop has completed
+
+[zrl=[baseurl]/help/hook/notifier_hub]notifier_hub[/zrl]
+ Called when a hub is delivered
+
+[zrl=[baseurl]/help/hook/notifier_normal]notifier_normal[/zrl]
+ Called when the notifier is invoked for a 'normal' delivery
+
+[zrl=[baseurl]/help/hook/notifier_process]notifier_process[/zrl]
+ Called when the notifier is processing a message/event
+
+[zrl=[baseurl]/help/hook/obj_verbs]obj_verbs[/zrl]
+ Called when creating the list of verbs available for profile "things".
+
+[zrl=[baseurl]/help/hook/oembed_action]oembed_action[/zrl]
+ Called when deciding if an oembed url is to be filter, blocked, or approved
+
+[zrl=[baseurl]/help/hook/oembed_probe]oembed_probe[/zrl]
+ Called when performing an oembed content lookup
+
+[zrl=[baseurl]/help/hook/other_encapsulate]other_encapsulate[/zrl]
+ Called when encrypting content for which the algorithm is unknown (see also crypto_methods)
+
+[zrl=[baseurl]/help/hook/other_unencapsulate]other_unencapsulate[/zrl]
+ Called when decrypting content for which the algorithm is unknown (see also crypto_methods)
+
+[zrl=[baseurl]/help/hook/page_content_top]page_content_top[/zrl]
+ Called when we generate a webpage (before calling the module content function)
+
+[zrl=[baseurl]/help/hook/page_end]page_end[/zrl]
+ Called after we have generated the page content
+
+[zrl=[baseurl]/help/hook/page_header]page_header[/zrl]
+ Called when generating the navigation bar
+
+[zrl=[baseurl]/help/hook/page_header]page_meta[/zrl]
+ Called when generating the meta data in the page header.
+
+[zrl=[baseurl]/help/hook/parse_atom]parse_atom[/zrl]
+ Called when parsing an atom/RSS feed item
+
+[zrl=[baseurl]/help/hook/parse_link]parse_link[/zrl]
+ Called when probing a URL to generate post content from it
+
+[zrl=[baseurl]/help/hook/pdl_selector]pdl_selector[/zrl]
+ Called when creating a layout selection in a form
+
+[zrl=[baseurl]/help/hook/perm_is_allowed]perm_is_allowed[/zrl]
+ Called during perm_is_allowed() to determine if a permission is allowed for this channel and observer
+
+[zrl=[baseurl]/help/hook/permissions_create]permissions_create[/zrl]
+ Called when an abook entry (connection) is created
+
+[zrl=[baseurl]/help/hook/permissions_update]permissions_update[/zrl]
+ Called when a permissions refresh is transmitted
+
+[zrl=[baseurl]/help/hook/permit_hook]permit_hook[/zrl]
+ Called before a registered hook is actually executed to determine if it should be allowed or blocked
+
+[zrl=[baseurl]/help/hook/personal_xrd]personal_xrd[/zrl]
+ Called when generating the personal XRD for "old webfinger" (Diaspora)
+
+[zrl=[baseurl]/help/hook/photo_post_end]photo_post_end[/zrl]
+ Called after uploading a photo
+
+[zrl=[baseurl]/help/hook/photo_upload_begin]photo_upload_begin[/zrl]
+ Called when attempting to upload a photo
+
+[zrl=[baseurl]/help/hook/photo_upload_end]photo_upload_end[/zrl]
+ Called when a photo upload has been processed
+
+[zrl=[baseurl]/help/hook/photo_upload_file]photo_upload_file[/zrl]
+ Called to generate alternate filenames for an upload
+
+[zrl=[baseurl]/help/hook/photo_upload_form]photo_upload_form[/zrl]
+ Called when generating a photo upload form
+
+[zrl=[baseurl]/help/hook/photo_view_filter]photo_view_filter[/zrl]
+ Called before the data is handed over to the photo_view template
+
+[zrl=[baseurl]/help/hook/poke_verbs]poke_verbs[/zrl]
+ Called when generating the list of actions for "poke" module
+
+[zrl=[baseurl]/help/hook/post_local]post_local[/zrl]
+ Called when an item has been posted on this machine via mod/item.php (also via API)
+
+[zrl=[baseurl]/help/hook/post_local_end]post_local_end[/zrl]
+ Called after a local post operation has completed
+
+[zrl=[baseurl]/help/hook/post_local_start]post_local_start[/zrl]
+ Called when a local post operation is commencing
+
+[zrl=[baseurl]/help/hook/post_mail]post_mail[/zrl]
+ Called when a mail message has been composed
+
+[zrl=[baseurl]/help/hook/post_mail_end]post_mail_end[/zrl]
+ Called when a mail message has been delivered
+
+[zrl=[baseurl]/help/hook/post_remote]post_remote[/zrl]
+ Called when an activity arrives from another site
+
+[zrl=[baseurl]/help/hook/post_remote_end]post_remote_end[/zrl]
+ Called after processing a remote post
+
+[zrl=[baseurl]/help/hook/post_remote_update]post_remote_update[/zrl]
+ Called when processing a remote post that involved an edit or update
+
+[zrl=[baseurl]/help/hook/post_remote_update_end]post_remote_update_end[/zrl]
+ Called after processing a remote post that involved an edit or update
+
+[zrl=[baseurl]/help/hook/prepare_body]prepare_body[/zrl]
+ Called when generating the HTML for a displayed conversation item
+
+[zrl=[baseurl]/help/hook/prepare_body_final]prepare_body_final[/zrl]
+ Called after generating the HTML for a displayed conversation item
+
+[zrl=[baseurl]/help/hook/prepare_body_init]prepare_body_init[/zrl]
+ Called before generating the HTML for a displayed conversation item
+
+[zrl=[baseurl]/help/hook/privacygroup_extras]privacygroup_extras[/zrl]
+ Called before generating the HTML for the Privacy Group edit options
+
+[zrl=[baseurl]/help/hook/privacygroup_extras_delete]privacygroup_extras_delete[/zrl]
+ Called after privacy group is dropped.
+
+[zrl=[baseurl]/help/hook/privacygroup_extras_post]privacygroup_extras_post[/zrl]
+ Called when privacy group edit form is submitted.
+
+[zrl=[baseurl]/help/hook/proc_run]proc_run[/zrl]
+ Called when invoking PHP sub processes
+
+[zrl=[baseurl]/help/hook/process_channel_sync_delivery]process_channel_sync_delivery[/zrl]
+ Called when accepting delivery of a 'sync packet' containing structure and table updates from a channel clone
+
+[zrl=[baseurl]/help/hook/profile_advanced]profile_advanced[/zrl]
+ Called when generating an advanced profile page
+
+[zrl=[baseurl]/help/hook/profile_edit]profile_edit[/zrl]
+ Called when editing a profile
+
+[zrl=[baseurl]/help/hook/profile_photo_content_end]profile_photo_content_end[/zrl]
+ Called when changing a profile photo
+
+[zrl=[baseurl]/help/hook/profile_post]profile_post[/zrl]
+ Called when posting an edited profile
+
+[zrl=[baseurl]/help/hook/profile_sidebar]profile_sidebar[/zrl]
+ Called when generating the 'channel sidebar' or mini-profile
+
+[zrl=[baseurl]/help/hook/profile_sidebar_enter]profile_sidebar_enter[/zrl]
+ Called before generating the 'channel sidebar' or mini-profile
+
+[zrl=[baseurl]/help/hook/queue_deliver]queue_deliver[/zrl]
+ Called when delivering a queued message
+
+[zrl=[baseurl]/help/hook/register_account]register_account[/zrl]
+ Called when an account has been created
+
+[zrl=[baseurl]/help/hook/render_location]render_location[/zrl]
+ Called to generate an ineractive inline map
+
+[zrl=[baseurl]/help/hook/replace_macros]replace_macros[/zrl]
+ Called before invoking the template processor
+
+[zrl=[baseurl]/help/hook/reverse_magic_auth]reverse_magic_auth[/zrl]
+ Called before invoking reverse magic auth to send you to your own site to authenticate on this site
+
+[zrl=[baseurl]/help/hook/settings_account]settings_account[/zrl]
+ Called when generating the account settings form
+
+[zrl=[baseurl]/help/hook/settings_form]settings_form[/zrl]
+ Called when generating the channel settings form
+
+[zrl=[baseurl]/help/hook/settings_post]settings_post[/zrl]
+ Called when posting from the channel settings form
+
+[zrl=[baseurl]/help/hook/sexpref_selector]sexpref_selector[/zrl]
+ Called when generating a dropdown of sexual preference (advanced profile)
+
+[zrl=[baseurl]/help/hook/sexpref_selector_min]sexpref_selector_min[/zrl]
+ Called when generating a dropdown of sexual preference (normal profile)
+
+[zrl=[baseurl]/help/hook/smilie]smilie[/zrl]
+ Called when translating emoticons
+
+[zrl=[baseurl]/help/hook/status_editor]status_editor[/zrl]
+ Called when generating the status_editor.
+
+[zrl=[baseurl]/help/hook/stream_item]stream_item[/zrl]
+ Called for each item which is rendered for viewing via conversation()
+
+[zrl=[baseurl]/help/hook/system_app_installed_filter]system_app_installed_filter[/zrl]
+ Called when determining whether a system app is installed
+
+[zrl=[baseurl]/help/hook/tagged]tagged[/zrl]
+ Called when a delivery is processed which results in you being tagged
+
+[zrl=[baseurl]/help/hook/thumbnail]thumbnail[/zrl]
+ Called when generating thumbnails for cloud storage 'tile' view
+
+[zrl=[baseurl]/help/hook/update_unseen]update_unseen[/zrl]
+ Called prior to automatically marking items seen which were loaded in the browser
+
+[zrl=[baseurl]/help/hook/validate_channelname]validate_channelname[/zrl]
+ Used to validate the names used by a channel
+
+[zrl=[baseurl]/help/hook/webfinger]webfinger[/zrl]
+ Called when visiting the webfinger (RFC7033) service
+
+[zrl=[baseurl]/help/hook/well_known]well_known[/zrl]
+ Called when accessing the '.well-known' special site addresses
+
+[zrl=[baseurl]/help/hook/wiki_preprocess]wiki_preprocess[/zrl]
+ Called before markdown/bbcode processors are run for wiki pages
+
+[zrl=[baseurl]/help/hook/zot_best_algorithm]zot_best_algorithm[/zrl]
+ Called when negotiating crypto algorithms with remote sites
+
+[zrl=[baseurl]/help/hook/zid]zid[/zrl]
+ Called when adding the observer's zid to a URL
+
+[zrl=[baseurl]/help/hook/zid_init]zid_init[/zrl]
+ Called when authenticating a visitor who has used zid
+
+[zrl=[baseurl]/help/hook/zot_finger]zot_finger[/zrl]
+ Called when a zot-info packet has been requested (this is our webfinger discovery mechanism)
diff --git a/doc/en/hooks.html b/doc/en/hooks.html
new file mode 100644
index 000000000..a7ee314e7
--- /dev/null
+++ b/doc/en/hooks.html
@@ -0,0 +1 @@
+<div><h3>Hooks</h3><table><tr><td>Function</td><td>Source File</td><td>Arg</td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td>$a-&gt;module . _mod_aftercontent</td><td>index.php</td><td>$arr</td></tr><tr><td>$a-&gt;module . _mod_content</td><td>index.php</td><td>$arr</td></tr><tr><td>$a-&gt;module . _mod_init</td><td>index.php</td><td>$placeholder</td></tr><tr><td>$a-&gt;module . _mod_post</td><td>index.php</td><td>$_POST</td></tr><tr><td>$a-&gt;module . _post_ . $selname</td><td>include/acl_selectors.php</td><td>$o</td></tr><tr><td>$a-&gt;module . _post_ . $selname</td><td>include/acl_selectors.php</td><td>$o</td></tr><tr><td>$a-&gt;module . _post_ . $selname</td><td>include/acl_selectors.php</td><td>$o</td></tr><tr><td>$a-&gt;module . _pre_ . $selname</td><td>include/acl_selectors.php</td><td>$arr</td></tr><tr><td>$a-&gt;module . _pre_ . $selname</td><td>include/acl_selectors.php</td><td>$arr</td></tr><tr><td>$a-&gt;module . _pre_ . $selname</td><td>include/acl_selectors.php</td><td>$arr</td></tr><tr><td>$name</td><td>include/plugin.php</td><td>&amp;$data = null</td></tr><tr><td>about_hook</td><td>mod/siteinfo.php</td><td>$o</td></tr><tr><td>accept_follow</td><td>mod/connedit.php</td><td>$arr</td></tr><tr><td>account_downgrade</td><td>include/account.php</td><td>$ret</td></tr><tr><td>account_downgrade</td><td>include/account.php</td><td>$ret</td></tr><tr><td>account_settings</td><td>mod/settings.php</td><td>$account_settings</td></tr><tr><td>activity_received</td><td>include/zot.php</td><td>$parr</td></tr><tr><td>affinity_labels</td><td>include/widgets.php</td><td>$labels</td></tr><tr><td>affinity_labels</td><td>mod/connedit.php</td><td>$labels</td></tr><tr><td>api_perm_is_allowed</td><td>include/permissions.php</td><td>$arr</td></tr><tr><td>app_menu</td><td>index.php</td><td>$arr</td></tr><tr><td>atom_author</td><td>include/items.php</td><td>$o</td></tr><tr><td>atom_entry</td><td>include/items.php</td><td>$o</td></tr><tr><td>atom_feed</td><td>include/items.php</td><td>$atom</td></tr><tr><td>atom_feed_end</td><td>include/items.php</td><td>$atom</td></tr><tr><td>attach_upload_file</td><td>include/attach.php</td><td>$f</td></tr><tr><td>authenticate</td><td>include/auth.php</td><td>$addon_auth</td></tr><tr><td>avatar_lookup</td><td>include/network.php</td><td>$avatar</td></tr><tr><td>bb2diaspora</td><td>include/markdown.php</td><td>$Text</td></tr><tr><td>bbcode</td><td>include/bbcode.php</td><td>$Text</td></tr><tr><td>channel_remove</td><td>include/Contact.php</td><td>$r[0]</td></tr><tr><td>chat_message</td><td>include/chat.php</td><td>$arr</td></tr><tr><td>chat_post</td><td>mod/chatsvc.php</td><td>$arr</td></tr><tr><td>check_account_email</td><td>include/account.php</td><td>$arr</td></tr><tr><td>check_account_invite</td><td>include/account.php</td><td>$arr</td></tr><tr><td>check_account_password</td><td>include/account.php</td><td>$arr</td></tr><tr><td>connect_premium</td><td>mod/connect.php</td><td>$arr</td></tr><tr><td>connector_settings</td><td>mod/settings.php</td><td>$settings_connectors</td></tr><tr><td>construct_page</td><td>boot.php</td><td>$arr</td></tr><tr><td>contact_block_end</td><td>include/text.php</td><td>$arr</td></tr><tr><td>contact_edit</td><td>mod/connedit.php</td><td>$arr</td></tr><tr><td>contact_edit_post</td><td>mod/connedit.php</td><td>$_POST</td></tr><tr><td>contact_select_options</td><td>include/acl_selectors.php</td><td>$x</td></tr><tr><td>conversation_start</td><td>include/conversation.php</td><td>$cb</td></tr><tr><td>create_identity</td><td>include/channel.php</td><td>$newuid</td></tr><tr><td>cron</td><td>include/cronhooks.php</td><td>$d</td></tr><tr><td>cron_daily</td><td>include/poller.php</td><td>datetime_convert()</td></tr><tr><td>cron_weekly</td><td>include/poller.php</td><td>datetime_convert()</td></tr><tr><td>directory_item</td><td>mod/directory.php</td><td>$arr</td></tr><tr><td>discover_by_webbie</td><td>include/network.php</td><td>$arr</td></tr><tr><td>display_item</td><td>include/ItemObject.php</td><td>$arr</td></tr><tr><td>display_item</td><td>include/conversation.php</td><td>$arr</td></tr><tr><td>display_settings</td><td>mod/settings.php</td><td>$o</td></tr><tr><td>display_settings_post</td><td>mod/settings.php</td><td>$_POST</td></tr><tr><td>donate_contributors</td><td>extend/addon/matrix/donate/donate.php</td><td>$contributors</td></tr><tr><td>donate_plugin</td><td>extend/addon/matrix/donate/donate.php</td><td>$o</td></tr><tr><td>donate_sponsors</td><td>extend/addon/matrix/donate/donate.php</td><td>$sponsors</td></tr><tr><td>dreport_is_storable</td><td>include/zot.php</td><td>$dr</td></tr><tr><td>drop_item</td><td>include/items.php</td><td>$arr</td></tr><tr><td>enotify</td><td>include/enotify.php</td><td>$h</td></tr><tr><td>enotify_mail</td><td>include/enotify.php</td><td>$datarray</td></tr><tr><td>enotify_store</td><td>include/enotify.php</td><td>$datarray</td></tr><tr><td>event_created</td><td>include/event.php</td><td>$event[id]</td></tr><tr><td>event_updated</td><td>include/event.php</td><td>$event[id]</td></tr><tr><td>externals_url_select</td><td>include/externals.php</td><td>$arr</td></tr><tr><td>feature_enabled</td><td>include/features.php</td><td>$arr</td></tr><tr><td>feature_settings</td><td>mod/settings.php</td><td>$settings_addons</td></tr><tr><td>feature_settings_post</td><td>mod/settings.php</td><td>$_POST</td></tr><tr><td>follow</td><td>include/follow.php</td><td>$arr</td></tr><tr><td>follow</td><td>include/follow.php</td><td>$arr</td></tr><tr><td>follow_allow</td><td>include/follow.php</td><td>$x</td></tr><tr><td>gender_selector</td><td>include/profile_selectors.php</td><td>$select</td></tr><tr><td>gender_selector_min</td><td>include/profile_selectors.php</td><td>$select</td></tr><tr><td>generate_map</td><td>include/text.php</td><td>$arr</td></tr><tr><td>generate_named_map</td><td>include/text.php</td><td>$arr</td></tr><tr><td>get_all_api_perms</td><td>include/permissions.php</td><td>$arr</td></tr><tr><td>get_all_perms</td><td>include/permissions.php</td><td>$arr</td></tr><tr><td>get_features</td><td>include/features.php</td><td>$arr</td></tr><tr><td>get_role_perms</td><td>include/permissions.php</td><td>$ret</td></tr><tr><td>get_widgets</td><td>boot.php</td><td>$arr</td></tr><tr><td>get_widgets</td><td>boot.php</td><td>$arr</td></tr><tr><td>global_permissions</td><td>include/permissions.php</td><td>$ret</td></tr><tr><td>home_content</td><td>mod/home.php</td><td>$o</td></tr><tr><td>home_init</td><td>mod/home.php</td><td>$ret</td></tr><tr><td>hostxrd</td><td>mod/hostxrd.php</td><td>$arr</td></tr><tr><td>html2bbcode</td><td>include/html2bbcode.php</td><td>$message</td></tr><tr><td>identity_basic_export</td><td>include/channel.php</td><td>$addon</td></tr><tr><td>import_author_xchan</td><td>include/items.php</td><td>$arr</td></tr><tr><td>import_channel</td><td>mod/import.php</td><td>$addon</td></tr><tr><td>import_directory_profile</td><td>include/zot.php</td><td>$d</td></tr><tr><td>import_xchan</td><td>include/zot.php</td><td>$arr</td></tr><tr><td>item_photo_menu</td><td>include/conversation.php</td><td>$args</td></tr><tr><td>item_store</td><td>include/items.php</td><td>$d</td></tr><tr><td>item_store</td><td>include/items.php</td><td>$arr</td></tr><tr><td>item_store_update</td><td>include/items.php</td><td>$d</td></tr><tr><td>item_translate</td><td>include/items.php</td><td>$translate</td></tr><tr><td>item_translate</td><td>include/items.php</td><td>$translate</td></tr><tr><td>jot_networks</td><td>include/acl_selectors.php</td><td>$jotnets</td></tr><tr><td>jot_networks</td><td>include/conversation.php</td><td>$jotnets</td></tr><tr><td>jot_networks</td><td>mod/editblock.php</td><td>$jotnets</td></tr><tr><td>jot_networks</td><td>mod/editpost.php</td><td>$jotnets</td></tr><tr><td>jot_networks</td><td>mod/editwebpage.php</td><td>$jotnets</td></tr><tr><td>jot_networks</td><td>mod/editlayout.php</td><td>$jotnets</td></tr><tr><td>jot_tool</td><td>include/conversation.php</td><td>$jotplugins</td></tr><tr><td>jot_tool</td><td>mod/editblock.php</td><td>$jotplugins</td></tr><tr><td>jot_tool</td><td>mod/editpost.php</td><td>$jotplugins</td></tr><tr><td>jot_tool</td><td>mod/editwebpage.php</td><td>$jotplugins</td></tr><tr><td>jot_tool</td><td>mod/editlayout.php</td><td>$jotplugins</td></tr><tr><td>load_pdl</td><td>boot.php</td><td>$arr</td></tr><tr><td>local_dir_update</td><td>include/dir_fns.php</td><td>$arr</td></tr><tr><td>logged_in</td><td>include/oauth.php</td><td>$a-&gt;user</td></tr><tr><td>logged_in</td><td>include/api.php</td><td>$a-&gt;user</td></tr><tr><td>logged_in</td><td>include/security.php</td><td>$a-&gt;account</td></tr><tr><td>logged_in</td><td>include/security.php</td><td>$user_record</td></tr><tr><td>logging_out</td><td>include/auth.php</td><td>$args</td></tr><tr><td>login_hook</td><td>boot.php</td><td>$o</td></tr><tr><td>magic_auth</td><td>mod/magic.php</td><td>$arr</td></tr><tr><td>magic_auth_openid_success</td><td>mod/openid.php</td><td>$arr</td></tr><tr><td>magic_auth_openid_success</td><td>mod/openid.php</td><td>$arr</td></tr><tr><td>magic_auth_success</td><td>mod/post.php</td><td>$arr</td></tr><tr><td>main_slider</td><td>include/widgets.php</td><td>$arr</td></tr><tr><td>marital_selector</td><td>include/profile_selectors.php</td><td>$select</td></tr><tr><td>marital_selector_min</td><td>include/profile_selectors.php</td><td>$select</td></tr><tr><td>module_loaded</td><td>index.php</td><td>$x</td></tr><tr><td>mood_verbs</td><td>include/text.php</td><td>$arr</td></tr><tr><td>nav</td><td>include/nav.php</td><td>$x</td></tr><tr><td>network_content_init</td><td>mod/network.php</td><td>$arr</td></tr><tr><td>network_ping</td><td>mod/ping.php</td><td>$arr</td></tr><tr><td>network_tabs</td><td>include/conversation.php</td><td>$arr</td></tr><tr><td>network_to_name</td><td>include/contact_selectors.php</td><td>$nets</td></tr><tr><td>notifier_end</td><td>include/notifier.php</td><td>$target_item</td></tr><tr><td>notifier_hub</td><td>include/notifier.php</td><td>$narr</td></tr><tr><td>notifier_normal</td><td>include/deliver_hooks.php</td><td>$r[0]</td></tr><tr><td>obj_verbs</td><td>include/taxonomy.php</td><td>$arr</td></tr><tr><td>oembed_probe</td><td>include/oembed.php</td><td>$x</td></tr><tr><td>page_content_top</td><td>index.php</td><td>$a-&gt;page[content]</td></tr><tr><td>page_end</td><td>index.php</td><td>$a-&gt;page[content]</td></tr><tr><td>page_header</td><td>include/nav.php</td><td>$a-&gt;page[nav]</td></tr><tr><td>parse_atom</td><td>include/items.php</td><td>$arr</td></tr><tr><td>parse_link</td><td>mod/linkinfo.php</td><td>$arr</td></tr><tr><td>pdl_selector</td><td>include/comanche.php</td><td>$arr</td></tr><tr><td>perm_is_allowed</td><td>include/permissions.php</td><td>$arr</td></tr><tr><td>permissions_create</td><td>include/notifier.php</td><td>$perm_update</td></tr><tr><td>permissions_update</td><td>include/notifier.php</td><td>$perm_update</td></tr><tr><td>personal_xrd</td><td>mod/xrd.php</td><td>$arr</td></tr><tr><td>photo_post_end</td><td>include/photos.php</td><td>$ret</td></tr><tr><td>photo_post_end</td><td>include/photos.php</td><td>$ret</td></tr><tr><td>photo_upload_begin</td><td>include/attach.php</td><td>$arr</td></tr><tr><td>photo_upload_begin</td><td>include/photos.php</td><td>$args</td></tr><tr><td>photo_upload_end</td><td>include/attach.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/attach.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/attach.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/attach.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/attach.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/photos.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/photos.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/photos.php</td><td>$ret</td></tr><tr><td>photo_upload_end</td><td>include/photos.php</td><td>$ret</td></tr><tr><td>photo_upload_file</td><td>include/attach.php</td><td>$f</td></tr><tr><td>photo_upload_file</td><td>include/photos.php</td><td>$f</td></tr><tr><td>photo_upload_form</td><td>mod/photos.php</td><td>$ret</td></tr><tr><td>poke_verbs</td><td>include/text.php</td><td>$arr</td></tr><tr><td>post_local</td><td>include/zot.php</td><td>$arr</td></tr><tr><td>post_local</td><td>include/items.php</td><td>$arr</td></tr><tr><td>post_local</td><td>mod/item.php</td><td>$datarray</td></tr><tr><td>post_local_end</td><td>include/items.php</td><td>$arr</td></tr><tr><td>post_local_end</td><td>include/attach.php</td><td>$arr</td></tr><tr><td>post_local_end</td><td>include/attach.php</td><td>$arr</td></tr><tr><td>post_local_end</td><td>extend/addon/matrix/randpost/randpost.php</td><td>$x</td></tr><tr><td>post_local_end</td><td>extend/addon/matrix/randpost/randpost.php</td><td>$x</td></tr><tr><td>post_local_end</td><td>mod/mood.php</td><td>$arr</td></tr><tr><td>post_local_end</td><td>mod/like.php</td><td>$arr</td></tr><tr><td>post_local_end</td><td>mod/item.php</td><td>$datarray</td></tr><tr><td>post_local_end</td><td>mod/subthread.php</td><td>$arr</td></tr><tr><td>post_local_start</td><td>mod/item.php</td><td>$_REQUEST</td></tr><tr><td>post_mail</td><td>include/items.php</td><td>$arr</td></tr><tr><td>post_mail_end</td><td>include/items.php</td><td>$arr</td></tr><tr><td>post_remote</td><td>include/items.php</td><td>$arr</td></tr><tr><td>post_remote_end</td><td>include/items.php</td><td>$arr</td></tr><tr><td>post_remote_update</td><td>include/items.php</td><td>$arr</td></tr><tr><td>post_remote_update_end</td><td>include/items.php</td><td>$arr</td></tr><tr><td>prepare_body</td><td>include/text.php</td><td>$prep_arr</td></tr><tr><td>prepare_body_final</td><td>include/text.php</td><td>$prep_arr</td></tr><tr><td>prepare_body_init</td><td>include/text.php</td><td>$item</td></tr><tr><td>probe_well_known</td><td>include/probe.php</td><td>$ret</td></tr><tr><td>proc_run</td><td>boot.php</td><td>$arr</td></tr><tr><td>process_channel_sync_delivery</td><td>include/zot.php</td><td>$addon</td></tr><tr><td>profile_advanced</td><td>mod/profile.php</td><td>$o</td></tr><tr><td>profile_edit</td><td>mod/profiles.php</td><td>$arr</td></tr><tr><td>profile_photo_content_end</td><td>mod/profile_photo.php</td><td>$o</td></tr><tr><td>profile_post</td><td>mod/profiles.php</td><td>$_POST</td></tr><tr><td>profile_sidebar</td><td>include/channel.php</td><td>$arr</td></tr><tr><td>profile_sidebar_enter</td><td>include/channel.php</td><td>$profile</td></tr><tr><td>register_account</td><td>include/account.php</td><td>$result</td></tr><tr><td>render_location</td><td>include/conversation.php</td><td>$locate</td></tr><tr><td>replace_macros</td><td>include/text.php</td><td>$arr</td></tr><tr><td>reverse_magic_auth</td><td>mod/rmagic.php</td><td>$arr</td></tr><tr><td>settings_account</td><td>mod/settings.php</td><td>$_POST</td></tr><tr><td>settings_form</td><td>mod/settings.php</td><td>$o</td></tr><tr><td>settings_post</td><td>mod/settings.php</td><td>$_POST</td></tr><tr><td>sexpref_selector</td><td>include/profile_selectors.php</td><td>$select</td></tr><tr><td>sexpref_selector_min</td><td>include/profile_selectors.php</td><td>$select</td></tr><tr><td>smilie</td><td>include/text.php</td><td>$params</td></tr><tr><td>smilie</td><td>extend/addon/matrix/smileybutton/smileybutton.php</td><td>$params</td></tr><tr><td>tagged</td><td>include/items.php</td><td>$arr</td></tr><tr><td>validate_channelname</td><td>include/channel.php</td><td>$arr</td></tr><tr><td>webfinger</td><td>mod/wfinger.php</td><td>$arr</td></tr><tr><td>well_known</td><td>mod/_well_known.php</td><td>$arr</td></tr><tr><td>zid</td><td>include/channel.php</td><td>$arr</td></tr><tr><td>zid_init</td><td>include/channel.php</td><td>$arr</td></tr><tr><td>zot_finger</td><td>include/zot.php</td><td>$ret</td></tr></table><p>Generated Tue Nov 03 21:19:02 PST 2015</p></div> \ No newline at end of file
diff --git a/doc/en/intro_for_developers.bb b/doc/en/intro_for_developers.bb
new file mode 100644
index 000000000..172008b7f
--- /dev/null
+++ b/doc/en/intro_for_developers.bb
@@ -0,0 +1,113 @@
+[b]$Projectname Developer Guide[/b]
+
+[b]File system layout:[/b]
+
+[addon] optional addons/plugins
+
+[boot.php] Every process uses this to bootstrap the application structure
+
+[doc] Help Files
+
+[images] core required images
+
+[include] The &quot;model&quot; in MVC - (back-end functions), also contains PHP &quot;executables&quot; for background processing
+
+[index.php] The front-end controller for web access
+
+[install] Installation and upgrade files and DB schema
+
+[library] Third party modules (must be license compatible)
+
+[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)
+
+[mod/site/] site-specific mod overrides, excluded from git
+
+[util] translation tools, main English string database and other miscellaneous utilities
+
+[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)
+
+[view] theming and language files
+
+[view/(css,js,img,php,tpl)] default theme files
+
+[view/(en,it,es ...)] language strings and resources
+
+[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides
+
+[b]The Database:[/b]
+
+ [li]abook - contact table, replaces Friendica 'contact'[/li]
+ [li]account - service provider account[/li]
+ [li]addon - registered plugins[/li]
+ [li]app - peronal app data[/li]
+ [li]attach - file attachments[/li]
+ [li]auth_codes - OAuth usage[/li]
+ [li]cache - OEmbed cache[/li]
+ [li]channel - replaces Friendica 'user'[/li]
+ [li]chat - chat room content[/li]
+ [li]chatpresence - channel presence information for chat[/li]
+ [li]chatroom - data for the actual chat room[/li]
+ [li]clients - OAuth usage[/li]
+ [li]config - main configuration storage[/li]
+ [li]conv - Diaspora private messages[/li]
+ [li]event - Events[/li]
+ [li]fcontact - friend suggestion stuff[/li]
+ [li]ffinder - friend suggestion stuff[/li]
+ [li]fserver - obsolete[/li]
+ [li]fsuggest - friend suggestion stuff[/li]
+ [li]pgrp - privacy groups[/li]
+ [li]pgrp_member - privacy groups[/li]
+ [li]hook - plugin hook registry[/li]
+ [li]hubloc - Red location storage, ties a location to an xchan[/li]
+ [li]item - posts[/li]
+ [li]item_id - other identifiers on other services for posts[/li]
+ [li]likes - likes of 'things'[/li]
+ [li]mail - private messages[/li]
+ [li]menu - channel menu data[/li]
+ [li]menu_item - items uses by channel menus[/li]
+ [li]notify - notifications[/li]
+ [li]notify-threads - need to factor this out and use item thread info on notifications[/li]
+ [li]obj - object data for things (x has y)[/li]
+ [li]outq - output queue[/li]
+ [li]pconfig - personal (per channel) configuration storage[/li]
+ [li]photo - photo storage[/li]
+ [li]poll - data for polls[/li]
+ [li]poll_elm - data for poll elements[/li]
+ [li]profdef - custom profile field definitions[/li]
+ [li]profext - custom profile field data[/li]
+ [li]profile - channel profiles[/li]
+ [li]profile_check - DFRN remote auth use, may be obsolete[/li]
+ [li]register - registrations requiring admin approval[/li]
+ [li]session - web session storage[/li]
+ [li]shares - shared item information[/li]
+ [li[sign - Diaspora signatures. To be phased out.[/li]
+ [li]site - site table to find directory peers[/li]
+ [li]source - channel sources data[/li]
+ [li]spam - unfinished[/li]
+ [li]sys_perms - extensible permissions for the sys channel[/li]
+ [li]term - item taxonomy (categories, tags, etc.) table[/li]
+ [li]tokens - OAuth usage[/li]
+ [li]updates - directory sync updates[/li]
+ [li]verify - general purpose verification structure[/li]
+ [li]vote - vote data for polls[/li]
+ [li]xchan - replaces 'gcontact', list of known channels in the universe[/li]
+ [li]xchat - bookmarked chat rooms[/li]
+ [li]xconfig - as pconfig but for channels with no local account[/li]
+ [li]xlink - &quot;friends of friends&quot; linkages derived from poco[/li]
+ [li]xprof - if this hub is a directory server, contains basic public profile info of everybody in the network[/li]
+ [li]xtag - if this hub is a directory server, contains tags or interests of everybody in the network[/li]
+
+
+[b]How to theme $Projectname - by Olivier Migeot[/b]
+
+This is a short documentation on what I found while trying to modify $Projectname's appearance.
+
+First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .
+
+Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().
+
+At that point, if you need to add javascript or css files, add them to /js or /css, and then &quot;register&quot; them in _init() through head_add_js('file.js') and head_add_css('file.css').
+
+Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/macros/addons_footer.bb b/doc/en/macros/addons_footer.bb
new file mode 100644
index 000000000..32814c59b
--- /dev/null
+++ b/doc/en/macros/addons_footer.bb
@@ -0,0 +1,2 @@
+Return to the [zrl=[baseurl]/help/addons]Addons documentation[/zrl]
+Return to the [zrl=[baseurl]/help/main]Main documentation[/zrl]
diff --git a/doc/en/macros/cloud_footer.bb b/doc/en/macros/cloud_footer.bb
new file mode 100644
index 000000000..798cc9ea6
--- /dev/null
+++ b/doc/en/macros/cloud_footer.bb
@@ -0,0 +1,2 @@
+Return to the [zrl=[baseurl]/help/cloud]Cloud documentation[/zrl]
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl]
diff --git a/doc/en/macros/de/addons_footer.bb b/doc/en/macros/de/addons_footer.bb
new file mode 100644
index 000000000..068bb7ec7
--- /dev/null
+++ b/doc/en/macros/de/addons_footer.bb
@@ -0,0 +1,2 @@
+Zurück zur [zrl=[baseurl]/help/addons]Addons-Hilfe[/zrl]
+Zurück zur [zrl=[baseurl]/help/main]Hilfe-Startseite[/zrl]
diff --git a/doc/en/macros/de/cloud_footer.bb b/doc/en/macros/de/cloud_footer.bb
new file mode 100644
index 000000000..921448a3c
--- /dev/null
+++ b/doc/en/macros/de/cloud_footer.bb
@@ -0,0 +1,2 @@
+Zurück zur [zrl=[baseurl]/help/cloud]Cloud-Hilfe[/zrl]
+Zurück zur [zrl=[baseurl]/help/main]Hilfe-Startseite[/zrl]
diff --git a/doc/en/macros/de/main_footer.bb b/doc/en/macros/de/main_footer.bb
new file mode 100644
index 000000000..e71603626
--- /dev/null
+++ b/doc/en/macros/de/main_footer.bb
@@ -0,0 +1 @@
+Zurück zur [zrl=[baseurl]/help/main]Hilfe-Startseite[/zrl]
diff --git a/doc/en/macros/de/troubleshooting_footer.bb b/doc/en/macros/de/troubleshooting_footer.bb
new file mode 100644
index 000000000..be8c13a28
--- /dev/null
+++ b/doc/en/macros/de/troubleshooting_footer.bb
@@ -0,0 +1,2 @@
+Zurück zur [zrl=[baseurl]/help/troubleshooting]Troubleshooting-Startseite[/zrl]
+Zurück zur [zrl=[baseurl]/help/troubleshooting]Hilfe-Startseite[/zrl]
diff --git a/doc/en/macros/main_footer.bb b/doc/en/macros/main_footer.bb
new file mode 100644
index 000000000..08f671ded
--- /dev/null
+++ b/doc/en/macros/main_footer.bb
@@ -0,0 +1 @@
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl]
diff --git a/doc/en/macros/pl/addons_footer.bb b/doc/en/macros/pl/addons_footer.bb
new file mode 100644
index 000000000..79ac0a71c
--- /dev/null
+++ b/doc/en/macros/pl/addons_footer.bb
@@ -0,0 +1,2 @@
+Powróć do [zrl=[baseurl]/help/addons]dokumentacji dodatków[/zrl]
+Powróć do [zrl=[baseurl]/help/main]głównej strony dokumentacji[/zrl]
diff --git a/doc/en/macros/pl/cloud_footer.bb b/doc/en/macros/pl/cloud_footer.bb
new file mode 100644
index 000000000..48628ae1a
--- /dev/null
+++ b/doc/en/macros/pl/cloud_footer.bb
@@ -0,0 +1,2 @@
+Powróć do [zrl=[baseurl]/help/cloud]dokumentacji chmury[/zrl]
+Powróć do [zrl=[baseurl]/help/main]głównej strony dokumentacji[/zrl]
diff --git a/doc/en/macros/pl/main_footer.bb b/doc/en/macros/pl/main_footer.bb
new file mode 100644
index 000000000..8bf25fed5
--- /dev/null
+++ b/doc/en/macros/pl/main_footer.bb
@@ -0,0 +1 @@
+Powróć do [zrl=[baseurl]/help/main]głównej strony dokumentacji[/zrl]
diff --git a/doc/en/macros/pl/troubleshooting_footer.bb b/doc/en/macros/pl/troubleshooting_footer.bb
new file mode 100644
index 000000000..19328ad64
--- /dev/null
+++ b/doc/en/macros/pl/troubleshooting_footer.bb
@@ -0,0 +1,2 @@
+[zrl=[baseurl]/help/troubleshooting]Dokumentacja dotycząca rozwiązywania problemów[/zrl]
+[zrl=[baseurl]/help/troubleshooting]Główna strona dokumentacji[/zrl]
diff --git a/doc/en/macros/troubleshooting_footer.bb b/doc/en/macros/troubleshooting_footer.bb
new file mode 100644
index 000000000..c7603a62b
--- /dev/null
+++ b/doc/en/macros/troubleshooting_footer.bb
@@ -0,0 +1,2 @@
+[zrl=[baseurl]/help/troubleshooting]Troubleshooting documentation[/zrl]
+[zrl=[baseurl]/help/troubleshooting]Documentation Main Page[/zrl]
diff --git a/doc/en/member/assets/bookmarker-save-icon.png b/doc/en/member/assets/bookmarker-save-icon.png
new file mode 100644
index 000000000..6a7c10eb9
--- /dev/null
+++ b/doc/en/member/assets/bookmarker-save-icon.png
Binary files differ
diff --git a/doc/en/member/assets/bookmarks-menu-dropdown.png b/doc/en/member/assets/bookmarks-menu-dropdown.png
new file mode 100644
index 000000000..137ae52ad
--- /dev/null
+++ b/doc/en/member/assets/bookmarks-menu-dropdown.png
Binary files differ
diff --git a/doc/en/member/assets/privacy-group-tool-public.png b/doc/en/member/assets/privacy-group-tool-public.png
new file mode 100644
index 000000000..828cb6411
--- /dev/null
+++ b/doc/en/member/assets/privacy-group-tool-public.png
Binary files differ
diff --git a/doc/en/member/assets/privacy-tool-3.png b/doc/en/member/assets/privacy-tool-3.png
new file mode 100644
index 000000000..ba896403d
--- /dev/null
+++ b/doc/en/member/assets/privacy-tool-3.png
Binary files differ
diff --git a/doc/en/member/assets/qr_text_to_post.png b/doc/en/member/assets/qr_text_to_post.png
new file mode 100644
index 000000000..887c85492
--- /dev/null
+++ b/doc/en/member/assets/qr_text_to_post.png
Binary files differ
diff --git a/doc/en/member/assets/zat_dialog.png b/doc/en/member/assets/zat_dialog.png
new file mode 100644
index 000000000..892964e95
--- /dev/null
+++ b/doc/en/member/assets/zat_dialog.png
Binary files differ
diff --git a/doc/en/member/bbcode.html b/doc/en/member/bbcode.html
new file mode 100644
index 000000000..e3e079b4d
--- /dev/null
+++ b/doc/en/member/bbcode.html
@@ -0,0 +1,337 @@
+<style>
+ section {
+ display: inline-block;
+ overflow-x: scroll;
+ }
+</style>
+<h3>Text Decoration</h3>
+<table class="table table-responsive table-bordered">
+ <tbody>
+ <tr>
+ <th>BBcode syntax</th><th>Rendered text</th>
+ </tr>
+ <tr>
+ <td><code>[b]bold[/b]</code></td><td><strong>bold</strong></td>
+ </tr>
+ <tr>
+ <td><code>[i]italic[/i]</code></td><td><em>italic</em></td>
+ </tr>
+ <tr>
+ <td><code>[u]underlined[/u]</code></td><td><u>underlined</u></td>
+ </tr>
+ <tr>
+ <td><code>[s]strike[/s]</code></td><td><strike>strike</strike></td>
+ </tr>
+ <tr>
+ <td><code>[color=red]red[/color]</code></td><td><span style="color: red;">red</span></td>
+ </tr>
+ <tr>
+ <td><code>[hl]highlighted[/hl]</code></td><td><span style="background-color: yellow;">highlighted</span></td>
+ </tr>
+ <tr>
+ <td><code>[font=courier]some text[/font] </code></td><td><span style="font-family: courier;">some text</span></td>
+ </tr>
+ <tr>
+ <td><code>[quote]quote[/quote]</code></td><td><blockquote>quote</blockquote></td>
+ </tr>
+ <tr>
+ <td><code>[quote=Author]Author? Me? No, no, no...[/quote]</code></td><td><strong class="author">Author wrote:</strong><blockquote>Author? Me? No, no, no...</blockquote></td>
+ </tr>
+ <tr>
+ <td><code>
+ [size=small]small text[/size]<br>
+ [size=xx-large]xx-large text[/size]<br>
+ [size=20]20px exactly[/size]<br>
+ </code>
+ Size options include: <strong>xx-small, small, medium, large, xx-large</strong></td><td><span style="font-size: small;">small text</span><br><span style="font-size: xx-large;">xx-large text</span><br><span style="font-size: 20px;">20px exactly</span></td>
+ </tr>
+ <tr>
+ <td><code>Add a horizontal bar
+[hr]
+Like this
+ </code></td><td>
+ Add a horizontal bar<br><hr><br>Like this
+ </td>
+ </tr>
+ <tr>
+ <td><code>This is
+[center]centered[/center]
+text</code></td><td>
+ This is<br><div style="text-align:center;">centered</div><br>text
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+<h3>Code blocks</h3>
+Code can be rendered generically in a block or inline format (depending on if there are new line characters in the text), or you can specify a supported language for enhanced syntax highlighting. Syntax highlighting requires a suitable rendering plugin such as <strong>hilite</strong>. Supported languages with the hilite plugin include <strong>php, css, mysql, sql, abap, diff, html, perl, ruby, vbscript, avrc, dtd, java, xml, cpp, python, javascript, js, json, sh </strong>.
+<br><br>
+If a rendering plugin is not installed or an unsupported language is specified, the output for syntax highlighted code blocks is the same as the block format code tag.
+<br><br>
+<table class="table table-responsive table-bordered">
+ <tbody>
+ <tr>
+ <th>BBcode syntax</th><th>Output</th>
+ </tr>
+ <tr>
+ <td><code>[code]function bbcode() { }[/code]</code></td><td><code>function bbcode() { }</code></td>
+ </tr>
+ <tr>
+ <td><code>[code=php]function bbcode() {<br>
+ $variable = true;<br>
+ if( $variable ) {<br>
+ echo "true";<br>
+ }<br>
+}[/code]</code></td><td><code><div class="hl-main"><ol class="hl-main"><li><span class="hl-code">&nbsp;</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">bbcode</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code"></span></li><li><span class="hl-code">&nbsp;&nbsp;&nbsp;</span><span class="hl-var">$variable</span><span class="hl-code"> = </span><span class="hl-reserved">true</span><span class="hl-code">;</span></li><li><span class="hl-code">&nbsp;&nbsp;&nbsp;</span><span class="hl-reserved">if</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-var">$variable</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code"></span></li><li><span class="hl-code">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="hl-reserved">echo</span><span class="hl-code"> </span><span class="hl-quotes">"</span><span class="hl-string">true</span><span class="hl-quotes">"</span><span class="hl-code">;</span></li><li><span class="hl-code">&nbsp;&nbsp;&nbsp;</span><span class="hl-brackets">}</span><span class="hl-code"></span></li><li><span class="hl-code">&nbsp;</span><span class="hl-brackets">}</span></li></ol></div></code></td>
+ </tr>
+ <tr>
+ <td><code>[nobb][nobb]This is how [i]you[/i] can
+[u]show[/u] how to use
+[hl]BBcode[/hl] syntax[/nobb][/nobb]</code></td><td>[nobb]This is how [i]you[/i] can [u]show[/u] how to use [hl]BBcode[/hl] syntax[/nobb]</td>
+ </tr>
+ </tbody>
+</table>
+
+<h3>Lists</h3>
+<table class="table table-responsive table-bordered">
+ <tbody>
+ <tr>
+ <th>BBcode syntax</th><th>Rendered list</th>
+ </tr>
+ <tr>
+ <td><code>[ul]<br>
+[*] First list element<br>
+[*] Second list element<br>
+[/ul]</code></td><td><ul class="listbullet" style="list-style-type: circle;"><li> First list element</li><li> Second list element<br></li></ul></td>
+ </tr>
+ <tr>
+ <td><code>[ol]<br>
+[*] First list element<br>
+[*] Second list element<br>
+[/ol]</code></td><td><ul class="listdecimal" style="list-style-type: decimal;"><li> First list element</li><li> Second list element<br></li></ul></td>
+ </tr>
+ <tr>
+ <td><code>[list=A]<br>
+[*] First list element<br>
+[*] Second list element<br>
+[/list]</code>
+ The list type options are <code>1, i, I, a, A</code>.</td><td><ul class="listupperalpha" style="list-style-type: upper-alpha;"><li> First list element</li><li> Second list element</li></ul></td>
+ </tr>
+ <tr>
+ <td><code>[dl terms="b"]<br>
+[*= First element term] First element description<br>
+[*= Second element term] Second element description<br>
+[/dl]</code>
+ The <strong>terms</strong> style options can be any combination of:
+ <dl class="bb-dl dl-horizontal">
+ <dt>b</dt><dd>bold</dd>
+ <dt>i</dt><dd>italic</dd>
+ <dt>u</dt><dd>underline</dd>
+ <dt>m</dt><dd>monospace</dd>
+ <dt>l</dt><dd>large</dd>
+ <dt>h</dt><dd>horizontal &mdash; like <em>this</em> defintion list</dd>
+ </dl>
+ </td><td><dl class="bb-dl dl-terms-bold">
+<dt> First element term</dt><dd> First element description<br></dd>
+<dt> Second element term</dt><dd> Second element description<br></dd></dl></td>
+ </tr>
+ </tbody>
+</table>
+
+<h3>Tables</h3>
+
+<table class="table table-responsive table-bordered">
+ <tbody>
+ <tr>
+ <th>BBcode syntax</th><th>Rendered table</th>
+ </tr>
+ <tr>
+ <td><code>[table border=0]<br>
+[tr]<br>
+[th]Header 1[/th][th]Header 2[/th]<br>
+[/tr]<br>
+[tr][td]Content[/td][td]Content[/td][/tr]<br>
+[tr][td]Content[/td][td]Content[/td][/tr]<br>
+[/table]</code></td><td><table class="table table-responsive"><tbody><tr><th>Header 1</th><th>Header 2</th></tr>
+<tr><td>Content</td><td>Content</td></tr><tr><td>Content</td><td>Content</td></tr></tbody></table></td>
+ </tr>
+ <tr>
+ <td><code>[table border=1]<br>
+[tr]<br>
+[th]Header 1[/th][th]Header 2[/th]<br>
+[/tr]<br>
+[tr][td]Content[/td][td]Content[/td][/tr]<br>
+[tr][td]Content[/td][td]Content[/td][/tr]<br>
+[/table]</code></td><td><table class="table table-responsive table-bordered"><tbody><tr><th>Header 1</th><th>Header 2</th></tr>
+<tr><td>Content</td><td>Content</td></tr><tr><td>Content</td><td>Content</td></tr></tbody></table></td>
+ </tr>
+ <tr>
+ <td><code>[table]<br>
+[tr]<br>
+[th]Header 1[/th][th]Header 2[/th]<br>
+[/tr]<br>
+[tr][td]Content[/td][td]Content[/td][/tr]<br>
+[tr][td]Content[/td][td]Content[/td][/tr]<br>
+[/table]</code></td><td><table><tbody><tr><th>Header 1</th><th>Header 2</th></tr><tr><td>Content</td><td>Content</td></tr><tr><td>Content</td><td>Content</td></tr></tbody></table>
+</td>
+ </tr>
+ </tbody>
+</table>
+
+<h3>Links and Embedded Content</h3>
+
+<table class="table table-responsive table-bordered">
+ <tbody>
+ <tr>
+ <th>BBcode syntax</th><th>Output</th>
+ </tr>
+ <tr>
+ <td><code>[video]video URL[/video]<br>
+[audio]audio URL[/audio]</code></td><td></td>
+ </tr>
+ <tr>
+ <td><code>[url=https://hubzilla.org]Hubzilla[/url]</code></td><td><a href="https://hubzilla.org" target="_blank">Hubzilla</a></td>
+ </tr>
+ <tr>
+ <td><code>An image [img]https://example.org/image.jpg[/img]
+in some text </code></td><td>
+ An image <img src="/images/default_profile_photos/rainbow_man/48.jpg" alt="Image/photo"> in some text
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+
+<h3>$Projectname specific codes</h3>
+
+<table class="table table-responsive table-bordered">
+ <tbody>
+ <tr>
+ <th>BBcode syntax</th><th>Output</th>
+ </tr>
+ <tr>
+ <td>Magic-auth version of [url] tag
+ <code>[zrl=https://hubzilla.org]Identity-aware link[/zrl]</code>
+ </td><td><code>https://hubzilla.org/?zid=[observer=1][observer.address][/observer][observer=0]your_channel@your.home.hub[/observer]</code></td>
+ </tr>
+ <tr>
+ <td>Magic-auth version of [img] tag
+ <code>[zmg]https://hubzilla.org/some/photo.jpg[/zmg]</code>
+ </td><td>Image is only viewable by those authenticated and with permission.</td>
+ </tr>
+ <tr>
+ <td>Observer-dependent output:<code>
+ [nobb][observer=1]Text to display if observer IS authenticated[/observer][/nobb]
+ </code></td><td></td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer=0]Text to display if observer IS NOT authenticated[/observer][/nobb]
+ </code>
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.language=en]Text to display if observer language is English[/observer][/nobb]
+ </code>
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.language!=de]Text to display if observer language is not German[/observer][/nobb]
+ </code>
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.url][/nobb]
+ </code>
+ </td>
+ <td>channel URL of observer</td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.baseurl][/nobb]
+ </code>
+ </td>
+ <td>website of observer</td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.name][/nobb]
+ </code>
+ </td>
+ <td>name of observer</td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.webname][/nobb]
+ </code>
+ </td>
+ <td>short name in the url of the observer</td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.address][/nobb]
+ </code>
+ </td>
+ <td>address (ZOT-id) of observer</td>
+ </tr>
+ <tr>
+ <td>
+ <code>
+ [nobb][observer.photo][/nobb]
+ </code>
+ </td>
+ <td>profile photo of observer</td>
+ </tr>
+ <tr>
+ <td><code>What is a spoiler?<br>
+ [spoiler]Text you want to hide.[/spoiler]</code></td><td>
+ What is a spoiler? <div onclick="openClose('opendiv-1131603764'); return false;" class="fakelink">Click to open/close</div><blockquote id="opendiv-1131603764" style="display: none;">Text you want to hide.</blockquote>
+ </td>
+ </tr>
+ <tr>
+ <td><code>[toc data-toc='div.page-body' data-toc-headings='h1,h2']</code><br>
+Create a table of content in a webpage or wiki page. Please refer to the <a href="http://ndabas.github.io/toc/" target="_blank">original jQuery toc</a> to get more explanations.
+ <ul>
+ <li>Optional param: 'data-toc'. If omitted the default is 'body'</li>
+ <li>Optional param: 'data-toc-headings'. If omitted the default is 'h1,h2,h3'</li>
+ </ul></td><td></td>
+ </tr>
+ <tr>
+ <td><code>[nobb][rpost=title]Text to post[/rpost][/nobb]</code><br>
+The observer will be returned to their home hub to enter a post with the specified title and body. Both are optional</td><td><a href="[baseurl]/rpost?f=&amp;title=title&amp;body=Text+to+post" target="_blank">[baseurl]/rpost?f=&amp;title=title&amp;body=Text+to+post</a></td>
+ </tr>
+ <tr>
+ <td>This requires the <a href="https://framagit.org/hubzilla/addons/tree/master/qrator"><strong>qrator</strong></a> plugin.<br><code>[qr]text to post[/qr]</code></td><td><img src="/doc/member/assets/qr_text_to_post.png"></td>
+ </tr>
+ <tr>
+ <td>This requires a suitable map plugin such as <strong><a href="https://framagit.org/hubzilla/addons/tree/master/openstreetmap">openstreetmap</a></strong>.
+ <code>[map]</code></td><td>Generate an inline map using the current browser coordinates of the poster, if browser location is enabled</td>
+ </tr>
+ <tr>
+ <td>This requires a suitable map plugin such as <strong><a href="https://framagit.org/hubzilla/addons/tree/master/openstreetmap">openstreetmap</a></strong>.
+ <code>[map=latitude,longitude]</code></td><td>Generate a map using global coordinates.</td></tr>
+ <tr>
+ <td>This requires a suitable map plugin such as <strong><a href="https://framagit.org/hubzilla/addons/tree/master/openstreetmap">openstreetmap</a></strong>.
+ <code>[map]Place Name[/map]</code></td><td>
+Generate a map for a given named location. The first matching location is returned. For instance "Sydney" will usually return Sydney, Australia and not Sydney, Nova Scotia, Canada unless the more precise location is specified. It is highly recommended to use the post preview utility to ensure you have the correct location before submitting the post.
+</td>
+ </tr>
+ <tr>
+ <td><code>[&amp;copy;]</code></td><td> &copy; </td>
+ </tr>
+ </tbody>
+</table>
diff --git a/doc/en/member/member_faq.bb b/doc/en/member/member_faq.bb
new file mode 100644
index 000000000..9533cb557
--- /dev/null
+++ b/doc/en/member/member_faq.bb
@@ -0,0 +1,10 @@
+[h3]$Projectname FAQ[/h3]
+[h4]I am able to edit a post's text after I saved it, but is there a way to change the permissions?[/h4]
+Short anser: No, there isn't. There are reasons. You are able to change permissons to your files, photos and the likes, but not to posts after you have saved them. The main reason is: Once you have saved a post it is being distributed either to the public channel and from there to other $Projectname servers or to those you intended it to go. Just like you cannot reclaim something you gave to another person, you cannot change permissions to $Projectname posts. We would need to track everywhere your posting goes, keep track of everyone you allowed to see it and then keep track of from whom to delete it.
+If a posting is public this is even harder, as $Projectname is a global network and there is no way to follow a post, let alone reclaim it reliably. Other networks that may receive your post have no reliable way to delete or reclaim the post.
+[h4]I downloaded my channel and imported it (cloned my identity) to another site but there is no content, no posts, no photos. What is wrong???[/h4]
+Posts and photos/files are provided separately from the channel basic information. This is due to memory limitations dealing with years of conversations and photo archives. Posts and conversations can be synced separately from the basic channel information. Photos and file archives can be transferred using a plugin tool such as 'redfiles', which is currently listed as "experimental". When creating this feature we thought that keeping all your contacts was the most important task. Your friends have already seen your old content. Posts/conversations were next in priority and these may now be synced. Files and photos are the last bit to get completely working. Once we find someone willing to finish implementing this, it will be done. :)
+[h4]I can't see private resources[/h4]
+You have probably disabled third party cookies. You need to enable them for remote authentication to work.
+[h4]There are a lot of foreign language posts. Let's auto-translate them.[/h4]
+There are also a lot of [b]private[/b] foreign language posts and auto-translation services would require us to transmit these private messages to the translation service; and we don't know what they will do with them on their servers. Actually we do know thanks to Edward Snowden. Our best bet is a project called [b][i]Apertium[/i][/b] which is an open source translator we can install locally. It is currently missing German translations - which are the most requested translation in the matrix. Once again, this will be implemented when we find somebody who really wants to make it happen.
diff --git a/doc/en/member/member_guide.bb b/doc/en/member/member_guide.bb
new file mode 100644
index 000000000..e3d62a4b5
--- /dev/null
+++ b/doc/en/member/member_guide.bb
@@ -0,0 +1,1081 @@
+[h3]Overview[/h3]
+
+While many features and capabilities of $Projectname are familiar to people who have used social networking sites and blogging software, there are also quite a few new concepts and features that most people have not encountered before. Some of the new ideas are related to the decentralized nature of the grid; others are associated with the advanced permissions system that is necessary to protect your data privacy. The purpose of this guide is to help you understand how to create, configure, and use your nomadic identity.
+
+[h3]Registration[/h3]
+
+Not all $Projectname sites allow open registration. If registration is allowed, you will see a &quot;Register&quot; link immediately below the login prompts on the site home page. Following this link will take you to the site Registration page. On some sites it may redirect you to another site which allow registrations. As all $Projectname sites are linked, it does not matter where your account resides.
+
+[b]Your Email Address[/b]
+
+Please provide a valid email address. Your email address is never published. This address will be used to activate your account, to (optionally) send email notifications for incoming messages or items, [i]and to recover lost passwords[/i].
+
+[b]Password[/b]
+
+Enter a password of your choice, and repeat it in the second box to ensure it was typed correctly. As $Projectname offers a decentralised identity, your account can log you in to many other websites.
+
+[b]Terms Of Service[/b]
+
+Click the link to read the site's [zrl=[baseurl]/help/TermsOfService]Terms of Service[/zrl]. Once you've read them, tick the box in the register form to confirm.
+
+[b]Register[/b]
+
+Once you have provided the necessary details, click the 'Register' button. Some sites may require administrator approval before the registration is processed, and you will be alerted if this is the case. Please watch your email (including spam folders) for your registration approval.
+
+
+
+[h3]Channels[/h3]
+
+[h4]What are channels?[/h4]
+
+Channels are simply collections of content stored in one place. A channel can represent anything. It could represent you, a website, a forum, photo albums, anything. For most people, their first channel with be &quot;Me&quot;.
+
+The most important features for a channel that represents &quot;me&quot; are:
+[ul]
+[*]Secure and private &quot;spam free&quot; communications
+
+[*]Identity and &quot;single-signon&quot; across the entire network
+
+[*]Privacy controls and permissions which extend to the entire network
+
+[*]Directory services (like a phone book)
+[/ul]
+In short, a channel that represents yourself is &quot;me, on the internet&quot;.
+
+
+
+[h3]Channel Permission Roles[/h3]
+
+When you create a new channel, you will be asked to select a permission role based on how you envision using this channel. The most popular permission roles are the Social Networking roles. You have many other choices, providing options which are analagous to Facebook Groups and Pages, collaborative spaces, newsfeeds, and more. These roles automatically configure several different system variables ranging from what permissions are granted to friends, to your default privacy settings and visibility choices. Advanced configurations are available to let you adjust each of these parameters to your needs, but we've found that most people prefer to "set it and forget it". Thew following describes some of the different roles which are currently available and how they impact your privacy and ability to interact.
+
+[h4]Social[/h4]
+
+[b]Federation[/b]
+
+The channel is a very permissive social networking profile which is compatible with other federated social networks. The permission policies are similar to Twitter and mostly compatible with Diaspora and Mastodon. Privacy is a lower priority than ease of access and connecting with others. Anybody in the network can comment on your public posts and send you private mail. By default posts and published items are public, but you can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others. This mode [i]may[/i] increase your exposure to undesired communications and spam. This role is not generally recommended [i]unless[/i] you need to interact regularly with members of other networks.
+
+[b]Mostly Public[/b]
+
+The channel is a typical social networking profile. By default posts and published items are public, but you can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others. Only your immediate connections can comment on your public posts and send you private mail. The permission policies are similar to Facebook.
+
+
+[b]Restricted[/b]
+
+By default all posts and published items are sent to your 'Friends' privacy group and not made public. New friends are added to this privacy group. You can over-ride this and create a public post or published item if you desire. You are listed in the directory. Your online presence (for chat) and your connections (friends) are visible to your profile viewers.
+
+[b]Private[/b]
+
+By default all posts and published items are sent to your 'Friends' privacy group. New friends are added to this privacy group. You can over-ride this and create a public post or public item if you desire. You are NOT listed in the directory. Only your connections can see your other connections. Your online presence is hidden.
+
+
+[h4]Forum[/h4]
+
+[b]Mostly Public[/b]
+
+The channel is a typical forum. By default posts and published items are public. Members may post by !mention or wall-to-wall post. Posting photos and other published items is blocked. The channel is visible in the directory. Members are added automatically.
+
+
+[b]Restricted[/b]
+
+By default all posts and published items are sent to the channel's 'Friends' privacy group. New friends are added to this privacy group. Members may post by !mention or wall-to-wall post, but posts and replies may also be seen by other receipients of the top-level post who are not members. The channel is visible in the directory. Members must be manually added by the forum owner.
+
+[b]Private[/b]
+
+By default all posts and published items are sent to your 'Friends' privacy group. New friends are added to this privacy group. The owner can over-ride this and create a public post or public item if desired. Members cannot. You are NOT listed in the directory. Only your connections can see your other connections. Your online presence is hidden. Members must be manually added by the forum owner. Posting by !mention is disabled. Posts can only be made via wall-to-wall posts, and sent to members of the 'Friends' privacy group. They are not publicly visible.
+
+
+[h4]Feed[/h4]
+
+
+[b]Public[/b]
+
+Similiar to Social - Mostly Public, but tailored for RSS feed sources. Items may be freely republished and sourced. Online presence is meaningless, therefore hidden. New connections are automatically approved.
+
+
+[b]Restricted[/b]
+
+Not listed in directory. Online presence is meaningless, therefore hidden. Feed is published only to members of the 'Friends' privacy group. New connections are automatically added to this privacy group. Members must be manually approved by the channel owner.
+
+
+[h4]Special[/h4]
+
+[b]Celebrity/Soapbox[/b]
+
+Listed in directory. Communications are by default public. Online presence is hidden. No commenting or feedback of any form is allowed, though connections have the ability to "like" your profile.
+
+
+[b]Group Repository[/b]
+
+A public forum which allows members to post files/photos/webpages.
+
+
+[h4]Custom/Expert Mode[/h4]
+
+Set all the privacy and permissions manually to suit your specific needs.
+
+
+[h3]Creating channels[/h3]
+
+
+After creating your account, you will be presented with the &quot;Add a channel&quot; screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The &quot;choose a short nickname&quot; box is similar to a &quot;username&quot; field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz
+
+See Also
+[zrl=[baseurl]/help/accounts_profiles_channels_basics]The Basics about Identities within $Projectname[/zrl]
+[zrl=[baseurl]/help/accounts]Accounts[/zrl]
+[zrl=[baseurl]/help/profiles]Profiles[/zrl]
+[zrl=[baseurl]/help/permissions]Permissions[/zrl]
+[zrl=[baseurl]/help/remove_account]Remove Account[/zrl]
+
+
+You can create additonal channels from the &quot;Channel Manager&quot; link.
+
+Once you have done this, your channel is ready to use. At [observer=1][observer.url][/observer][observer=0][baseurl]/channel/username[/observer] you will find your channel &quot;stream&quot;. This is where your recent activity will appear, in reverse chronological order. If you post in the box marked &quot;share&quot;, the entry will appear at the top of your stream. You will also find links to all the other communication areas for this channel here. The "hamburger" menu in most themes will provide you with navigation to other system components and apps. The Photos page contain photo albums, and the Events page contains events share by both yourself and your contacts.
+
+[b]Profiles[/b]
+
+$Projectname has unlimited profiles. You may use different profiles to show different &quot;sides of yourself&quot; to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded &quot;sides&quot; of each channel. For example, your default public profile might say &quot;Hello, I'm Fred, and I like laughing&quot;. You may show your close friends a profile that adds &quot;and I also enjoy dwarf tossing&quot;.
+
+You always have a profile known as your &quot;default&quot; or &quot;public&quot; profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile.
+
+That said, if you want other friends to be able to find you, it helps to have the following information in your public profile...
+
+[ul][*]Your real name or at least a nickname everybody knows
+[*]A photo of you
+[*]Your location on the planet, at least to a country level.[/ul]
+
+In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some &quot;Keywords&quot; to your profile. Such as &quot;music, linux, photography&quot; or whatever. You can add as many keywords as you like.
+
+To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings &gt; Additional Features[/zrl] and enable &quot;Multiple Profiles&quot; there, otherwise you won't have the ability to use more than just your default profile.
+
+Then select &quot;Edit Profiles&quot; from the menu of your $Projectname site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a &quot;clone&quot; of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose &quot;Clone this profile&quot; there.
+
+In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on &quot;Edit visibility&quot; next to the profile in question (only available for the profiles that are not your default profile) and then click on specific connections to add them to or remove them from the group of people who can see this profile.
+
+Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile.
+
+There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the &quot;Settings&quot; page.
+
+If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished.
+
+[b]Keywords and Directory Search[/b]
+
+On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page.
+
+On your Connnections page and in the directory there is a link to &quot;Suggestions&quot; or &quot;Channel Suggestions&quot;, respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance.
+
+See Also
+
+[zrl=[baseurl]/help/AdvancedSearch]Advanced Searching[/zrl]
+
+
+[h4]The grid, permissions and delegation[/h4]
+
+The &quot;Grid&quot; page contains all recent posts from across $Projectname network, again in reverse chronologial order. The exact posts that appear here depend largely on your permissions. At their most permissive, you will receive posts from complete strangers. At the other end of the scale, you may see posts from only your friends - or if you're feeling really anti-social, only your own posts.
+
+As mentioned at the start, many other kinds of channel are possible, however, the creation procedure is the same. The difference between channels lies primarily in the permissions assigned. For example, a channel for sharing documents with colleagues at work would probably want more permissive settings for &quot;Can write to my &quot;public&quot; file storage&quot; than a personal account. For more information, see the [zrl=[baseurl]/help/roles]permissions section[/zrl].
+
+You can also delegate control of your channels' posts and connections, but not its configurations, to another channel. That is done by editing a connection and assigning it the permission to administer your channel's resources.
+
+[h3]Connecting To Channels[/h3]
+
+Connections in $Projectname can take on a great many different meanings. A connection is more accurately defined as a set of permissions that you have granted to somebody else. In traditional social network applications, all connections are granted the same permissions; or at most there two levels (friends and 'followers'). In $Projectname, a range of separate permissions may be set/adjusted depending on the siutation and relationship you have with the other channel. You can allow somebody to view your posts but not your photos. You can also deny them permission to comment on your posts or send private mail to you. But let's keep it simple, you want to be friends with somebody like you are familiar with from social networking. How do you do it?
+
+First, you need to find some channels to connect to. There are two primary ways of doing this. Firstly, setting the &quot;Can send me their channel stream and posts&quot; permission to &quot;Anybody in this network&quot; will bring posts from complete strangers to your matrix. This will give you a lot of public content and should hopefully help you find interesting, entertaing people, forums, and channels.
+
+The next thing you can do is look at the Directory. The directory is available on every $Projectname website which means searching from your own site will bring in results from the entire network. You can search by name, interest, location, and keyword.
+
+If you already know somebody's 'webbie' you can connect with them directly. A webbie looks just like an email address (for instance bob@example.com) but refers to somebody in the open social web. In order to connect they must be using a compatible network protocol. By default, this software supports the 'zot' protocol, however additional protocols may be provided through plugins/addons. See below for more information on connecting to channels on other networks.
+
+To connect with other $Projectname channels:
+
+Visit their profile by clicking their photograph in the directory, matrix, or comments, and it will open their channel home page in the channel viewer. At the left hand side of the screen, you will usually see a link called &quot;connect&quot;. Click it, and you're done. Depending on the settings of the channel you are connecting to, you may need to wait for them to approve your connection, but no further action is needed on your part. Once you've initiated the connection, you will be taken to the connection editor. This allows you to assign specific permissions for this channel if you wish to make any changes.
+
+You may also connect with any channel by visiting the &quot;Connections&quot; page of your site or the Directory and typing their &quot;webbie&quot; into the &quot;Add New Connection&quot; field. Use this method if somebody tells you their webbie and you wish to connect with them. The process is the same as connecting via the &quot;Connect&quot; button - you will then be taken to the connection editor to set permissions.
+
+To connect with channels on other networks:
+
+The process for connecting to channels on other networks (such as GNU-Social, Mastodon, and Diaspora) is similar - type their &quot;webbie&quot; into the &quot;Add New Connections&quot; box on the &quot;Connections&quot; page. Before you do this however, please visit your Settings page (Feature/Addon Settings) and ensure that the relevant protocol (Diaspora, GNU-Social/OStatus, or ActivityPub) is provided on your hub and [b][i]activated[/i] for your channel[/b]. These networks/protocols do not support account migration and location independence so if you move location or clone your channel elsewhere, communications with these connections may fail. For this reason these protocols are not activated by default, but only through your consent. Activating these protocols involves an important decision between communicating with friends on these networks or providing fail-safe account resilience if your server fails.
+
+Some communications offer more than one protocol. If you wish to connect with somebody on Mastodon (for instance) they can use either the 'ostatus' or the 'activitypub' protocol for communication. Generally the 'activitypub' protocol will provide a better experience than 'ostatus', but $Projectname will often choose the first protocol it discovers and this may not be the one you want. You may connect with somebody over a specific protocol by prepending the protocol name in square brackets to their &quot;webbie&quot;. For example
+
+[code]
+[activitypub]https://foo.bar/foobar
+[ostatus]foobar@foo.bar
+[diaspora]foobar@foo.bar
+[zot]foobar@foo.bar
+[feed]https://foo.bar/foobar
+[/code]
+
+
+To connect with RSS feeds:
+
+Your hub admin may allow connecting to RSS feeds. The process for connecting to an RSS feed is the same, exept type (or paste) the URL of the feed into the &quot;Add New Connection&quot; box. Feeds are only processed once or twice per day and your hub admin may impose limits on how many feeds you may add.
+
+[h4]Block/Ignore/Archive/Hide channels [/h4]
+
+Channels in your address book can have statuses such as [i]blocked[/i], [i]ignored[/i], [i]archived[/i] and [i]hidden[/i]. From your connections page you can see tabs that display the channels with those statuses. From your edit connection pages you can change the statuses of a channel.
+
+Here's their meaning:
+
+[b]Blocked:[/b] the channel can't read your items regardless of permissions, nor can it write to your channel.
+
+[b]Ignored:[/b] the channel can read your items if it has permission, but can't write to your channel.
+
+[b]Hidden:[/b] the channel does not show up in your profile's connections list, noone can see you're connected, but beware they may still show up to your other connections, for example in post replies.
+
+[b]Archived:[/b] if a channel can't be reached for 30 days, it is automatically marked as archived. This keeps all the data but stops polling the channel for new information and removes it from autocomplete. If later you learn the channel has come back online, you may manually unarchive it.
+
+[h4]Premium Channels[/h4]
+
+Some channels are designated &quot;Premium Channels&quot; and may require some action on your part before a connection can be established. The Connect button will for these channels will take you to a page which lists in detail what terms the channel owner has set. If the terms are accepted, the connection will then proceed normally. In some cases, such as with celebrities and world-reknowned publishers, this may involve payment. If you do not agree to the terms, the connection will not proceed, or it may proceed but with reduced permissions allowed on your interactions with that channel.
+
+[h3]Permissions[/h3]
+Permissions in $Projectname are more complete than you may be used to. This allows us to define more fine graded relationships than the black and white &quot;this person is my friend, so they can do everything&quot; or &quot;this person is not my friend, so they can't do anything&quot; permissions you may find elsewhere.
+
+[h4]Permission Roles[/h4]
+
+When you create a channel we allow you to select different 'roles' for that channel. These create an entire family of permissions and privacy settings that are appropriate for that role. Typical roles are "Social - mostly public", "Social - mostly private", "Forum - public" and many others. These bring a level of simplicity to managing permissions. Just choose a role and appropriate permissions are automatically applied. You can also choose 'Custom/Expert mode' and change any individual permission setting in any way you desire.
+
+
+[h4]Default Permission Limits[/h4]
+
+There are a large number of individual permissions. These control everything from the ability to view your stream to the ability to chat with you. Every permission has a limit. The scope of these permissions varies from &quot;Only me&quot; to &quot;Everybody on the internet&quot; - though some scopes may not be available for some permissions. The limit applies to any published thing you create which has no privacy or access control. For example if you publish a photo and didn't select a specific audience with permission to view it, we apply the limit. These limits apply to everything within that permission rule, so you cannot apply a limit to one photo. The limit applies to all your photos. If all your photos are visible to everybody on the internet and you reduce the limit only to friends, [b]all[/b] of your photos will now be visible only to friends.
+
+[h4]Access Control[/h4]
+
+Access Control is the preferred method of managing privacy in [i]most[/i] cases, rather than using permission limits. This creates lists of either connections or privacy groups (or both) and uses the access list to decide if a permission is allowed. An access list is attached to everything you publish. Unlike permission limits, if you change the access control list on a single photo, it doesn't affect any of your other photos. You can use privacy groups and a "default access control list" to create and automate the management of access control lists to provide any level of privacy you desire on anything you publish.
+
+We highly recommend that you use the "typical social network" settings when you create your first channel, as it allows others to communicate with you and help you out if you have difficulty. You will find that these settings allow you as much privacy as you desire - when you desire it; but also allow you to communicate in public if you choose to. You are free to use much more private settings once you have learned your way around.
+
+
+[dl terms="l"]
+[*= The scopes of permissions are:]
+[dl terms="i"]
+ [*= Nobody Except Yourself ] This is self explanatory. Only you will be allowed access.
+
+ [*= Only those you specifically allow ] By default, people you are not connected to, and all new contacts will have this permission denied. You will be able to make exceptions for individual channels on their contact edit screen.
+
+ [*= Anybody in your address book ] Anybody you do not know will have this permission denied, but anybody you accept as a contact will have this permission approved. This is the way most legacy platforms handle permissions.
+
+ [*= Anybody On This Hub ] Anybody with a channel on the same hub/website as you will have permission approved. Anybody who is registered at a different hub will have this permission denied.
+
+ [*= Anybody in this network ] Anybody in $Projectname will have this permission approved. Even complete strangers. However, anybody not logged in/authenticated will have this permission denied.
+
+ [*= Anybody authenticated ] This is similar to "anybody in this network" except that it can include anybody who can authenticate by any means - and therefore [i]may[/i] include visitors from other networks.
+
+ [*=Guest Access Token] This allows you to share a file, folder, photo, album, or channel with a specific person or group of people. They don't need to be $Projectname members. You can set an expiration for the Access Token.
+
+ [*= Anybody on the internet ] Completely public. This permission will be approved for anybody at all.
+[/dl]
+[*= The individual permissions are:]
+[dl terms="i"]
+ [*= Can view my &quot;public&quot; stream and posts. ] This permision determines who can view your channel &quot;stream&quot; that is, the non-private posts that appear on the &quot;home&quot; tab when you're logged in.
+
+ [*= Can view my &quot;public&quot; channel profile. ] This permission determines who can view your channel's profile. This refers to the &quot;about&quot; tab
+
+ [*= Can view my &quot;public&quot; photo albums. ] This permission determines who can view your photo albums. Individual photographs may still be posted to a more private audience.
+
+ [*= Can view my &quot;public&quot; address book. ] This permission determines who can view your contacts. These are the connections displayed in the &quot;View connections&quot; section.
+
+ [*= Can view my &quot;public&quot; file storage. ] This permission determines who can view your public files stored in your cloud.
+
+ [*= Can view my &quot;public&quot; pages. ] This permission determines who can view your public web pages.
+
+ [*= Can send me their channel stream and posts. ] This permission determines whose posts you will view. If your channel is a personal channel (ie, you as a person), you would probably want to set this to &quot;anyone in my address book&quot; at a minimum. A personal notes channel would probably want to choose &quot;nobody except myself&quot;. Setting this to &quot;Anybody in the network&quot; will show you posts from complete strangers, which is a good form of discovery.
+
+ [*= Can post on my channel page (&quot;wall&quot;). ] This permission determines who can write to your wall when clicking through to your channel.
+
+ [*= Can comment on my posts. ] This permission determines who can comment on posts you create. Normally, you would want this to match your &quot;can view my public stream and posts&quot; permission
+
+ [*= Can send me private mail messages. ] This determines who can send you private messages (zotmail).
+
+ [*= Can post photos to my photo albums. ] This determines who can post photographs in your albums. This is very useful for forum-like channels where connections may not be connected to each other.
+
+ [*= Can forward to all my channel contacts via post tags. ] Using @- mentions will reproduce a copy of your post on the profile specified, as though you posted on the channel wall. This determines if people can post to your channel in this way.
+
+ [*= Can chat with me (when available). ] This determines who can join the public chat rooms created by your channel.
+
+ [*= Can write to my &quot;public&quot; file storage. ] This determines who can upload files to your public file storage, or 'cloud'.
+
+ [*= Can edit my &quot;public&quot; pages. ] This determines who can edit your webpages. This is useful for wikis or sites with multiple editors.
+
+ [*= Can administer my channel resources. ] This determines who can have full control of your channel. This should normally be set to &quot;nobody except myself&quot;.
+[/dl][/dl]
+[i]Note:[/i]
+Plugins/addons may provide special permission settings, so you may be offered additional permission settings beyond what is described here.
+
+If you have set any of these permissions to &quot;only those I specifically allow&quot;, you may specify individual permissions on the connnection edit screen.
+
+[h4]Affinity[/h4]
+
+The connection edit screen offers a slider to select a degree of friendship with the connnection (this tool is enabled through the &quot;Extra Features&quot; tab of your Settings page). Think of this as a measure of how much you like or dislike them. 1 is for people you like, whose posts you want to see all the time. 99 is for people you don't care for, and whose posts you might only wish to look at occasionally. Once you've assigned a value here, you can use the affinity tool on the matrix page to filter content based on this number.
+
+The slider on the matrix page has both a minimum and maximum value. Posts will only be shown from people who fall between this range. Affinity has no relation to permissions, and is only useful in conjunction with the affinity tool feature.
+
+[h3]Guest Access Tokens[/h3]
+Guest access tokens (sometimes called "Zot access tokens") allow you to share a file, folder, photo, album, or channel with a specific person or group of people who are not $Projectname members. These tokens allow you to share individual items by sending a link that includes the token in the URL; alternatively, people can actually [i]log in[/i] using the token credentials, after which they can seamlessly view whatever content has been shared with that token.
+
+To create and manage guest tokens, open the [zrl=[baseurl]/settings/tokens/]Guest Access Tokens[/zrl] settings page. A random token is generate with each page load, allowing you to create one by inputting an associated login name and optionally specifying an expiration date. Existing tokens are listed below the dialog and can be edited by selecting them or deleted by pressing the trash icon.
+
+Additional permissions may be granted to the guest token by expanding the [b]Individual Permissions[/b] options and selecting privacy settings such as [b]Can view my channel stream and posts[/b] or [b]Can chat with me[/b].
+
+[url=[baseurl]/help/feature/access_tokens]More details can be found here...[/url]
+
+[img][baseurl]/doc/member/assets/zat_dialog.png[/img]
+
+
+[h3]Markup Languages[/h3]
+$Projectname supports several markup languages for advanced formatting of content. The default markup language is a [url=[baseurl]/help/member/bbcode]custom variant of BBcode[/url], tailored for use in $Projectname. [url=[baseurl]/help/member/bbcode]BBcode[/url] is supported for posts, wiki pages, and web page elements. Wiki pages and webpage elements may also be written using standard Markdown.
+[table border=0]
+[tr][th]Content Type[/th][th]Supported Markup[/th][/tr]
+[tr][td]Post[/td][td][url=[baseurl]/help/member/bbcode]BBcode[/url][/td][/tr]
+[tr][td]Wiki[/td][td][url=[baseurl]/help/member/bbcode]BBcode[/url], Markdown[/td][/tr]
+[tr][td]Webpage element[/td][td][url=[baseurl]/help/member/bbcode]BBcode[/url], Markdown, HTML[/td][/tr]
+[/table]
+
+[h3]Tags And Mentions[/h3]
+
+[h4]Mentions[/h4]
+You can mention a channel by simply preceding their name with the [code]@[/code] character, like this:
+
+[code]
+@Jack
+[/code]
+
+If the channel mentioned is in the list of recipients for the post or comment, they will receive a notification, bringing it to their attention. If they're [i]not[/i] among the recipients, the tag will simply work as a link to their profile.
+
+When you begin to mention somebody, it will create an auto-complete box to select from [u]your immediate connections[/u](?). Select one as appropriate.
+
+
+[h4]Private Mentions[/h4]
+If you wish to restrict a post to a single—or only a few—channels you can do this by selecting channels or privacy groups from the privacy tool.
+
+[img=[baseurl]/help/en/member/assets/privacy-tool-3.png]Two views of the permissions dialogue. To the left: Selecing a single privacy group or forum as recipients for the post. To the right: Using the 'Custom selection' view to gain fine grained control over the recipients.[/img]
+
+You can also just tag a channel with a [i]privacy tag[/i].
+
+A privacy tag is a channel name preceded by the two characters [code]@![/code]. This will also change the privacy permissions of the post to only include the tagged channel. You can use more than one privacy tag, for instance [code]@!bob and @!linda[/code] will send the post only to Bob and Linda. This mechanism over-rides the privacy selector.
+
+[h4]Mentioning forums[/h4]
+
+Forums may be mentioned in the same way. [code]@!dogs[/code] will post to the dogs forum privately. The forum will redeliver the post to all the forum members, but your own followers will not see the post unless they are also members of the dogs forum.
+
+[size=small][b]Note:[/b] In previous releases you could mention a forum by prefixing the forum name with the characters [code]!![/code]. This is no longer supported. The correct way to send to a forum is by using the [code]@![/code] tag.[/size]
+
+[h4]Mentioning privacy groups[/h4]
+
+You may also tag privacy groups which are "public".
+
+When you create or edit a privacy group, there is a checkbox to allow the group members to be seen by others. If this box is checked for a group and you tag (for instance) [code]@!Friends[/code] - the post will be restricted to the Friends group. Check that the group is public before doing this - as there is no way to take back a post except to delete it. The group name will appear in the post and will alert members of that group that they are members of it.
+
+Set the privacy group visible to others to make it public:
+[img=[baseurl]/help/en/member/assets/privacy-group-tool-public.png]The privacy group tool with 'Members are visible to other channels' set to 'yes'.[/img]
+
+To add or edit privacy groups, you need to have the [url=[baseurl]/group]Privacy Groups app[/url] installed.
+
+[h4]Mentions and Comments[/h4]
+The above mechanisms only apply to "top-level" posts you create. Mentioning a channel with any of the above mechanisms has no effect in comments, except that the mentioned channel may receive a notification if they were already included as a recipient in the conversation.
+
+[h4]Topical Tags (also known as Hashtags)[/h4]
+Topical tags are indicated by preceding the tag name with the [code]#[/code] character. This will create a link in the post to a generalised site search for the term provided. For example, #[zrl=[baseurl]/search?tag=cars]cars[/zrl] will provide a search link for all posts tagged with '[code]#cars[/code]' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration.
+
+Topical tags are also not normally linked if they are purely numeric, e.g. [code]#1[/code]. If you wish to use a numeric hashtag, please add some descriptive text such as [code]#2012-elections[/code] or enclose the entire tag in double quotes (for example [code]#"2012"[/code]). Doubles quotes are also required if the tag contains spaces ([code]#"My Tag"[/code]) and may be required if the tag contains punctuation characters ([code]#"EndsWithPeriod."[/code] or [code]#"Exciting!!!"[/code]).
+
+[h4]Bookmarks[/h4]
+Bookmarks indicate a link which can be saved to your bookmark folder. They use the sequence [code]#^[/code] followed by the link. Often these are generated automatically.
+
+[img=[baseurl]/help/en/member/assets/bookmarker-save-icon.png]Saving a bookmark by clicking the bookmark icon when the 'bookmarker' addon is enabled.[/img]
+
+If the site administrator has enabled the [url=[baseurl]/admin/addons/bookmarker]bookmarker[/url] addon for the site, this sequence will be converted to a bookmark icon when viewing the post or comment online. Clicking the icon will save the bookmark.
+
+Otherwise if the [url=[baseurl]/bookmarks]Bookmarks app[/url] is installed for the channel, the post dropdown menu contains a link for saving the bookmark or bookmarks.
+
+[img=[baseurl]/help/en/member/assets/bookmarks-menu-dropdown.png]A post with a bookmark, showing the dropdown menu.[/img]
+
+[h4]Manual Mentions[/h4]
+Where possible please use the auto-complete window to select tag and mention recipients, because it will generate a coded tag which uniquely identifies one channel. Names are sometimes ambiguous. However, you can "manually" tag a channel by matching the channel name or address.
+
+[code]
+@billy
+[/code]
+
+will tag a connection whose name or network address is 'billy' (exact match). If you have two connections with a name or network address of billy, for instance [code]billy@server1.hubzilla.org[/code] and [code]billy@server2.hubzilla2.org[/code], you will need to supply the complete address or the results will be ambiguous and the wrong person may be tagged.
+
+[code]
+@"Robert Johnson"
+[/code]
+
+will tag Robert Johnson. The double quotes are required if the tagged name contains space characters.
+
+
+[h3]Web Pages[/h3]
+
+$Projectname allows members and allowed connections to create static webpages. To activate this feature, enable the [b]Web Pages[/b] feature in your [b][url=[baseurl]/settings/features/]Additional Features[/url][/b] section.
+
+Once enabled, a new tab will appear on your channel page labeled &quot;Webpages&quot;. Clicking this link will take you to the webpage editor. Pages will be accessible at [b][baseurl]/page/[observer=1][observer.webname][/observer][observer=0]channelname[/observer]/pagelinktitle[/b]
+
+The &quot;page link title&quot; box allows you to specify the &quot;pagelinktitle&quot; of this URL. If no page link title is set, we will set one for you automatically, using the message ID of the item.
+
+Beneath the page creation box, a list of existing pages will appear with an &quot;edit&quot; link. Clicking this will take you to an editor, similar to that of the post editor, where you can make changes to your webpages.
+
+[h4]Using Blocks[/h4]
+
+Blocks can be parts of webpages. The basic HTML of a block looks like this
+[code]
+ <div>
+ Block Content
+ </div>
+
+[/code]
+
+If a block has text/html content type it can also contain menu elements. Sample content of
+[code]
+ <p>HTML block content</p>
+ [menu]menuname[/menu]
+
+[/code]
+will produce HTML like this
+[code]
+ <div>
+ <p>HTML block content</p>
+ <div>
+ <ul>
+ <li><a href="#">Link 1</a></li>
+ <li><a href="#">Link 2</a></li>
+ <li><a href="#">Link 3</a></li>
+ </ul>
+ </div>
+ </div>
+
+[/code]
+
+Via the $content macro a block can also contain the actual webpage content. For this create a block with only
+[code]
+ $content
+
+[/code]as content.
+
+To make a block appear in the webpage it must be defined in the page layout inside a region.
+[code]
+ [region=aside]
+ [block]blockname[/block]
+ [/region]
+
+[/code]
+
+The block appearance can be manipulated in the page layout.
+
+Custom classes can be assigned
+[code]
+ [region=aside]
+ [block=myclass]blockname[/block]
+ [/region]
+
+[/code]
+will produce this HTML
+[code]
+ <div class="myclass">
+ Block Content
+ </div>
+
+[/code]
+
+Via the wrap variable a block can be stripped off its wrapping <div></div> tag
+[code]
+ [region=aside]
+ [block][var=wrap]none[/var]blockname[/block]
+ [/region]
+
+[/code]
+will produce this HTML
+[code]
+ Block Content
+[/code]
+
+[h4]Webpage element import tool[/h4]
+
+There are two methods of importing webpage elements: uploading a zip file or referencing a local cloud files folder. Both methods require that the webpage elements are specified using a specific folder structure. The import tool makes it possible to import all the elements necessary to construct an entire website or set of websites. The goal is to accommodate external development of webpages as well as tools to simplify and automate deployment on a hub.
+
+[h5] Folder structure [/h5]
+Element definitions must be stored in the repo root under folders called
+[code]
+ /pages/
+ /blocks/
+ /layouts/
+[/code]
+
+Each element of these types must be defined in an individual subfolder using two files: one JSON-formatted file for the metadata and one plain text file for the element content.
+
+[h5] Page elements [/h5]
+Page element metadata is specified in a JSON-formatted file called [code]page.json[/code] with the following properties:
+[list]
+[*] title
+[*] pagelink
+[*] mimetype
+[*] layout
+[*] contentfile
+[/list]
+[b]Example[/b]
+
+Files:
+[code]
+ /pages/my-page/page.json
+ /pages/my-page/my-page.bbcode
+[/code]
+Content of [code]page.json[/code]:
+[code]
+ {
+ "title": "My Page",
+ "pagelink": "mypage",
+ "mimetype": "text/bbcode",
+ "layout": "my-layout",
+ "contentfile": "my-page.bbcode"
+ }
+[/code]
+[h5] Layout elements [/h5]
+
+Layout element metadata is specified in a JSON-formatted file called [code]layout.json[/code] with the following properties:
+[list]
+[*] name
+[*] description
+[*] contentfile
+[/list]
+[b]Example[/b]
+
+Files:
+[code]
+ /layouts/my-layout/layout.json
+ /layouts/my-layout/my-layout.bbcode
+[/code]
+Content of [code]layout.json[/code]:
+[code]
+ {
+ "name": "my-layout",
+ "description": "Layout for my project page",
+ "contentfile": "my-layout.bbcode"
+ }
+[/code]
+
+[h5] Block elements [/h5]
+
+Block element metadata is specified in a JSON-formatted file called [code]block.json[/code] with the following properties:
+[list]
+[*] name
+[*] title
+[*] mimetype
+[*] contentfile
+[/list]
+[b]Example[/b]
+
+Files:
+[code]
+ /blocks/my-block/block.json
+ /blocks/my-block/my-block.html
+[/code]
+Content of [code]block.json[/code]:
+
+[code]
+ {
+ "name": "my-block",
+ "title": "",
+ "mimetype": "text/html",
+ "contentfile": "my-block.html"
+ }
+[/code]
+
+[h3]Comanche Page Description Language[/h3]
+
+Comanche is a markup language similar to [url=[baseurl]/help/member/bbcode]BBcode[/url] with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages.
+
+Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose.
+
+[h4]Page Templates[/h4]
+Currently there are five layout templates, unless your site provides additional layouts.
+
+[dl terms="b"]
+[*= default]
+The default template defines a &quot;nav&quot; region across the top, &quot;aside&quot; as a fixed width sidebar,
+&quot;content&quot; for the main content region, and &quot;footer&quot; for a page footer.
+
+[*= full]
+The full template defines the same as the default template with the exception that there is no &quot;aside&quot; region.
+
+[*= choklet]
+The choklet template provides a number of fluid layout styles which can be specified by flavour:
+[list]
+[*] (default flavour) - a two column layout similar to the "default" template, but more fluid
+[*] bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays
+[*] three - three column layout (adds a "right_aside" region to the default template)
+[*] edgestwo - two column layout with fixed side margins
+[*] edgesthree - three column layout with fixed side margins
+[*] full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar
+[/list]
+
+[*= redable]
+A template for reading longer texts full screen (so without navigation bar). Three columns: aside, content and right_aside.
+For maximum readability it is advised to only use the middle content column.
+
+[*= zen]
+Gives you the freedom to do everything yourself. Just a blank page with a content region.
+[/dl]
+
+To choose a layout template, use the 'template' tag.
+
+[code]
+ [template]full[/template]
+
+[/code]
+
+To choose the "choklet" template with the "three" flavour:
+
+[code]
+ [template=three]choklet[/template]
+
+[/code]
+
+The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions.
+
+Three &quot;macros&quot; have been defined for your use.
+[code]
+ $htmlhead - replaced with the site head content.
+ $nav - replaced with the site navigation bar content.
+ $content - replaced with the main page content.
+
+[/code]
+
+By default, $nav is placed in the &quot;nav&quot; page region and $content is placed in the &quot;content&quot; region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions.
+
+
+To select a theme for your page, use the 'theme' tag.
+[code]
+ [theme]suckerberg[/theme]
+
+[/code]
+This will select the theme named &quot;suckerberg&quot;. By default your channel's preferred theme will be used.
+
+[code]
+ [theme=passion]suckerberg[/theme]
+
+[/code]
+This will select the theme named &quot;suckerberg&quot; and select the &quot;passion&quot; schema (theme variant). Alternatively it may be possible to use a condensed theme notation for this.
+
+[code]
+ [theme]suckerberg:passion[/theme]
+
+[/code]
+
+The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier.
+
+[h4]Navbar[/h4]
+
+[code]
+ [navbar]tucson[/navbar]
+[/code]
+
+Use the 'tucson' navbar template and CSS rules. By default the 'default' navbar template will be used.
+
+
+[h4]Regions[/h4]
+Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.
+
+[code]
+ [region=htmlhead]....content goes here....[/region]
+ [region=aside]....content goes here....[/region]
+ [region=nav]....content goes here....[/region]
+ [region=content]....content goes here....[/region]
+
+[/code]
+
+[h4]CSS and Javascript[/h4]
+We have the possibility to include javascript and css libraries in the htmlhead region. At present we make use of jquery (js), bootstrap (css/js) and foundation (css/js).
+This will overwrite the selected themes htmlhead.
+
+[code]
+ [region=htmlhead]
+ [css]bootstrap[/css]
+ [js]jquery[/js]
+ [js]bootstrap[/js]
+ [/region]
+
+[/code]
+
+[h4]Menus and Blocks[/h4]
+Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created.
+
+[code]
+ [menu]mymenu[/menu]
+
+[/code]
+This places the menu called &quot;mymenu&quot; at this location on the page, which must be inside a region.
+
+[code]
+ [menu=horizontal]mymenu[/menu]
+
+[/code]
+This places the menu called &quot;mymenu&quot; at this location on the page, which must be inside a region. Additionally it applies the "horizontal" class to the menu. "horizontal" is defined in the redbasic theme. It may or may not be available in other themes.
+
+[code]
+ [menu][var=wrap]none[/var]mymenu[/menu]
+
+[/code]
+The variable [var=wrap]none[/var] in a block removes the wrapping div element from the menu.
+
+[code]
+ [block]contributors[/block]
+[/code]
+This places a block named &quot;contributors&quot; in this region.
+
+[code]
+ [block=someclass]contributors[/block]
+
+[/code]
+This places a block named &quot;contributors&quot; in this region. Additionally it applies the &quot;someclass&quot; class to the block. This replaces the default block classes &quot;bblock widget&quot;.
+
+[code]
+ [block][var=wrap]none[/var]contributors[/block]
+
+[/code]
+The variable [var=wrap]none[/var] in a block removes the wrapping div element from the block.
+
+[h4]Widgets[/h4]
+Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. System widgets are listed [url=help/Widgets]here[/url]. Widgets can also ve created by plugins, themes, or your site administrator to provide additional functionality.
+
+
+Widgets and arguments are specified with the 'widget' and 'var' tags.
+[code]
+ [widget=recent_visitors][var=count]24[/var][/widget]
+
+[/code]
+
+This loads the &quot;recent_visitors&quot; widget and supplies it with the argument &quot;count&quot; set to &quot;24&quot;.
+
+[h4]Comments[/h4]
+The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page.
+
+[code]
+ [comment]This is a comment[/comment]
+
+[/code]
+
+[h4]Conditional Execution[/h4]
+You can use an 'if' construct to make decisions. These are currently based on system configuration variable or the current observer.
+
+[code]
+ [if $config.system.foo]
+ ... the configuration variable system.foo evaluates to 'true'.
+ [else]
+ ... the configuration variable system.foo evaluates to 'false'.
+ [/if]
+
+ [if $observer]
+ ... this content will only be show to authenticated viewers
+ [/if]
+
+[/code]
+
+ The 'else' clause is optional.
+
+ Several tests are supported besides boolean evaluation.
+
+[code]
+ [if $config.system.foo == bar]
+ ... the configuration variable system.foo is equal to the string 'bar'
+ [/if]
+ [if $config.system.foo != bar]
+ ... the configuration variable system.foo is not equal to the string 'bar'
+ [/if]
+ [if $config.system.foo {} bar ]
+ ... the configuration variable system.foo is a simple array containing a value 'bar'
+ [/if]
+ [if $config.system.foo {*} bar]
+ ... the configuration variable system.foo is a simple array containing a key named 'bar'
+ [/if]
+[/code]
+
+[h4]Complex Example[/h4]
+[code]
+ [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment]
+
+ [template]3-column-with-header[/template]
+
+ [comment]Use the &quot;darknight&quot; theme[/comment]
+
+ [theme]darkknight[/theme]
+
+ [comment]Use the existing site navigation menu[/comment]
+
+ [region=nav]$nav[/region]
+
+ [region=side]
+
+ [comment]Use my chosen menu and a couple of widgets[/comment]
+
+ [menu]myfavouritemenu[/menu]
+
+ [widget=recent_visitors]
+ [var=count]24[/var]
+ [var=names_only]1[/var]
+ [/widget]
+
+ [widget=tagcloud][/widget]
+ [block]donate[/block]
+
+ [/region]
+
+
+
+ [region=middle]
+
+ [comment]Show the normal page content[/comment]
+
+ $content
+
+ [/region]
+
+
+
+ [region=right]
+
+ [comment]Show my condensed channel &quot;wall&quot; feed and allow interaction if the observer is allowed to interact[/comment]
+
+ [widget]channel[/widget]
+
+ [/region]
+
+[/code]
+
+
+[h3]Personal Cloud Storage[/h3]
+
+$Projectname provides an ability to store privately and/or share arbitrary files with friends.
+
+You may either upload files from your computer into your storage area, or copy them directly from the operating system using the WebDAV protocol.
+
+On many public servers there may be limits on disk usage.
+
+[h4]File Attachments[/h4]
+
+The quickest and easiest way to share files is through file attachments. In the row of icons below the status post editor is a tool to upload attachments. Click the tool, select a file and submit. After the file is uploaded, you will see an attachment code placed inside the text region. Do not edit this line or it may break the ability for your friends to see the attachment. You can use the post permissions dialogue box or privacy hashtags to restrict the visibility of the file - which will be set to match the permissions of the post your are sending.
+
+To delete attachments or change the permissions on the stored files, visit [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username replacing username with the nickname you provided during channel creation[/observer].
+
+[h4]Web Access[/h4]
+
+Your files are visible on the web at the location [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username[/observer] to anybody who is allowed to view them. If the viewer has sufficient privileges, they may also have the ability to create new files and folders/directories. This should only be used for smaller files and photos (up to a few megabytes) as it uses internal memory. For larger files (videos, music, etc.), please upload using WebDAV. These files may still be retrieved via web access.
+
+[h4]WebDAV access[/h4]
+
+WebDAV provides a way to copy files directly to or from your computer's operating system, where your cloud files appear as a virtual disk drive. This should be used to upload large files such as video and audio; as it is not limited to available memory. See [zrl=help/member/member_guide#Cloud_Desktop_Clients]Cloud Desktop Clients[/zrl] below.
+
+[h4]CalDAV and CardDAV access on Android[/h4]
+
+You can sync you calendar and contacts on Android with your Hub.
+
+The following steps where tested for [url=https://f-droid.org/en/packages/at.bitfire.davdroid/]DAVdroid[/url]
+[list]
+[*] install DAVdroid
+[*] add account
+[*] use "URL" and "user name" to login
+[list]
+[*] base url is [baseurl]/cdav
+[*] user name is [observer=1][observer.webname][/observer][observer=0]username[/observer]
+[/list]
+[/list]
+
+To share your calendar visit [observer.baseurl]/cdav/calendar
+
+
+[h4]Permissions[/h4]
+
+When using WebDAV, the file is created with your channel's default file permissions and this cannot be changed from within the operating system. It also may not be as restrictive as you would like. What we've found is that the preferred method of making files private is to first create folders or directories; then visit [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username[/observer] select the directory and change the permissions. Do this before you put anything into the directory. The directory permissions take precedence so you can then put files or other folders into that container and they will be protected from unwanted viewers by the directory permissions. It is common for folks to create a &quot;personal&quot; or &quot;private&quot; folder which is restricted to themselves. You can use this as a personal cloud to store anything from anywhere on the web or any computer and it is protected from others. You might also create folders for &quot;family&quot; and &quot;friends&quot; with permission granted to appropriate privacy groups.
+
+[h3]Cloud Desktop Clients[/h3]
+
+
+[h4]Cloud Desktop Clients - Windows[/h4]
+
+WebDAV using Windows 7 graphical user interface wizard:
+1. Left-click the Start-button to open the start menu.
+2. Right-click the My computer icon to access its menu.
+3. Left-click Map network drive... to open the connection dialog wizard.
+4. Type '[baseurl]/dav/nickname' in the textbox (replace nickname with your channel nickname) and click the Complete button.
+5. Type your $Projectname channel nickname. IMPORTANT - NO at-sign or domain name.
+6. Type your $Projectname password
+
+[h4]Cloud Desktop Clients - Linux[/h4]
+
+[h5]Mount as a filesystem[/h5]
+
+[b]Mounting As A Filesystem[/b]
+
+To install your cloud directory as a filesystem, you first need davfs2 installed. 99% of the time, this will be included in your distributions repositories. In Debian
+
+[code]apt-get install davfs2[/code]
+
+If you want to let normal users mount the filesystem
+
+[code] dpkg-reconfigure davfs2[/code]
+
+and select &quot;yes&quot; at the prompt.
+
+Now you need to add any user you want to be able to mount dav to the davfs2 group
+
+[code]usermod -aG davfs2 &lt;DesktopUser&gt;[/code]
+
+[b]Note:[/b] on some systems the user group may be different, i.e. - "network"
+on Arch Linux. If in doubt, check the davfs documentation for your
+particular OS.
+
+Edit /etc/fstab
+
+[code]nano /etc/fstab[/code]
+
+ to include your cloud directory by adding
+
+[code]
+[baseurl]/dav/ /mount/point davfs user,noauto,uid=&lt;DesktopUser&gt;,file_mode=600,dir_mode=700 0 1
+[/code]
+
+Where [baseurl] is the URL of your hub, /mount/point is the location you want to mount the cloud, and &lt;DesktopUser&gt; is the user you log in to one your computer. Note that if you are mounting as a normal user (not root) the mount point must be in your home directory.
+
+For example, if I wanted to mount my cloud to a directory called 'cloud' in my home directory, and my username was bob, my fstab would be
+
+[code][baseurl]/dav/ /home/bob/cloud davfs user,noauto,uid=bob,file_mode=600,dir_mode=700 0 1[/code]
+
+Now, create the mount point.
+
+[code]mkdir /home/bob/cloud[/code]
+
+and also create a directory file to store your credentials
+
+[code]mkdir /home/bob/.davfs2[/code]
+
+Create a file called 'secrets'
+
+[code]nano /home/bob/.davfs2/secrets[/code]
+
+and add your cloud login credentials
+
+[code]
+[baseurl]/dav &lt;username&gt; &lt;password&gt;
+[/code]
+
+Where &lt;username&gt; and &lt;password&gt; are the username and password [i]for your hub[/i].
+
+Don't let this file be writeable by anyone who doesn't need it with
+
+[code]chmod 600 /home/bob/.davfs2/secrets[/code]
+
+Finally, mount the drive.
+
+[code]mount [baseurl]/dav[/code]
+
+You can now find your cloud at /home/bob/cloud and use it as though it were part of your local filesystem - even if the applications you are using have no dav support themselves.
+
+[b]Troubleshooting[/b]
+
+With some webservers and certain configurations, you may find davfs2 creating files with 0 bytes file size where other clients work just fine. This is generally caused by cache and locks. If you are affected by this issue, you need to edit your davfs2 configuration.
+
+[code]nano /etc/davfs2/davfs2.conf[/code]
+
+Your distribution will provide a sample configuration, and this file should already exist, however, most of it will be commented out with a # at the beginning of the line.
+
+First step is to remove locks.
+
+Edit the use_locks line so it reads [code]use_locks 0[/code].
+
+Unmount your file system, remount your file system, and try copying over a file from the command line. Note you should copy a new file, and not overwrite an old one for this test. Leave it a minute or two then do [code]ls -l -h[/code] and check the file size of your new file is still greater than 0 bytes. If it is, stop there, and do nothing else.
+
+If that still doesn't work, disable the cache. Note that this has a performance impact so should only be done if disabling locks didn't solve your problem. Edit the cache_size and set it to [code]cache_size 0[/code] and also set file_refresh to [code]file_refresh 0[/code]. Unmount your filesystem, remount your file system, and test it again.
+
+If it [i]still[/i] doesn't work, there is one more thing you can try. (This one is caused by a bug in older versions of dav2fs itself, so updating to a new version may also help). Enable weak etag dropping by setting [code]drop_weak_etags 1[/code]. Unmount and remount your filesystem to apply the changes.
+
+
+[h5]Dolphin[/h5]
+Visit webdavs://example.com/dav where &quot;example.com&quot; is the URL of your hub.
+
+When prompted for a username and password, enter your channel name (the first part of your webbie - no @ or domain name) and password for your normal account.
+
+Note, if you are already logged in to the web interface via Konqueror, you will not be prompted for further authentication.
+
+[h5]Konqueror[/h5]
+
+Simply visit webdavs://example.com/dav after logging in to your hub, where &quot;example.com&quot; is the URL of your hub.
+
+No further authentication is required if you are logged in to your hub in the normal manner.
+
+Additionally, if one has authenticated at a different hub during their normal browser session, your identity will be passed to the cloud for these hubs too - meaning you can access any private files on any server, as long as you have permissions to see them, as long as you have visited that site earlier in your session.
+
+This functionality is normally restricted to the web interface, and is not available to any desktop software other than KDE.
+
+[h5]Nautilus[/h5]
+
+1. Open a File browsing window (that's Nautilus)
+2. Select File &gt; Connect to server from the menu
+3. Type davs://&lt;domain_name&gt;/dav/&lt;your_channelname&gt; and click Connect
+4. You will be prompted for your channel name (same as above) and password
+5. Your personal DAV directory will be shown in the window
+
+[h5]Nemo[/h5]
+
+For (file browser) Nemo 1.8.2 under Linux Mint 15, Cinnamon 1.8.8. Nemo ist the standard file browser there.
+
+1st way
+type &quot;davs://&lt;domain_name&gt;/dav/&lt;your_channelname&gt;&quot; in the address bar.
+
+2nd way
+Menu &gt; file &gt; connect to server
+Fill the dialog
+- Server: hubzilla_domain_name
+- Type: Secure WebDAV (https)
+- Folder: /dav
+- Username: yourchannelname
+- Password: yourpassword
+
+Once open you can set a bookmark.
+
+[h5]Server Notes[/h5]
+
+Note: There have been reported issues with clients that use "chunked transfer encoding", which includes Apple iOS services, and also the "AnyClient" and "CyberDuck" tools. These work fine for downloads, but uploads often end up with files of zero size. This is caused by an incorrect implemention of chunked encoding in some current FCGI (fast-cgi) implementations. Apache running with PHP as a module does not have these issues, but when running under FCGI you may need to use alternative clients or use the web uploader. At the time of this writing the issue has been open and no updates provided for at least a year. If you encounter zero size files with other clients, please check the client notes; as there are occasional configuration issues which can also produce these symptoms.
+
+[h3]Saved Searches[/h3]
+
+In order to quickly find information, the 'saved search' widget may be used. This widget may be presented as a sidebar tool on your network page and possibly from your channel page. It is differentiated from the 'navigation bar' search tool in that it does not search the entire site, but only the subset of information available to your channel.
+
+Additionally the search terms you provide may activate a one-time search or be saved in a list for re-use. Saving the search item also invokes the search in addition to adding it to the saved list (which is displayed below the search text entry box). Any item in the list may be discarded if it is no longer needed.
+
+The saved search widget will provide autocompletion of channels (the results are prefixed with '@'), and hashtags (prefixed with '#'). You do not need to enter these tags; although entering the desired tag will reduce the autocomplete results to only hold the relevant information. The behaviour maps as follows:
+
+[list]
+[*]@name - search your network stream for posts or comments written by 'name'. This will also change the post editor permissions to include only 'name'; as if this was a privacy group.
+[*]#hashtag - search you network stream for posts containing #hashtag.
+[*]text - search your network stream for posts containing 'text'.
+[/list]
+
+
+[h3]Remove Channel or Account[/h3]
+
+[h4]Remove Channel[/h4]
+
+Select the 'Remove Channel' link on your channel settings page or visit the URL:
+
+ [baseurl]/removeme
+
+You will need to confirm your password and the channel you are currently logged into will be removed.
+
+[hl][i][b]This is irreversible.[/b][/i][/hl]
+
+If you have identity clones on other hubs this only removes by default the channel instance which exists on this hub.
+
+[h4]Remove Account[/h4]
+
+Select 'Remove Account' from your account settings page or visit the URL:
+
+ [baseurl]/removeaccount
+
+You will need to confirm your password and the account you are currently logged into will be removed.
+
+[hl][i][b]This is irreversible.[/b][/i][/hl]
+
+All your channels will be deleted. If you have identity clones on other hubs this only removes by default the channels instances which exists on this hub.
+
diff --git a/doc/en/plugins.bb b/doc/en/plugins.bb
new file mode 100644
index 000000000..3aecc458f
--- /dev/null
+++ b/doc/en/plugins.bb
@@ -0,0 +1,312 @@
+[b]Plugins[/b]
+
+So you want to make $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
+
+
+In your $Projectname folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
+[code]
+ mkdir addon
+[/code]
+Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters.
+
+Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files.
+[code]
+ mkdir addon/randplace
+[/code]
+Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file
+[code]
+ addon/randplace/randplace.php
+[/code]
+The very first line of this file needs to be
+[code]
+ &lt;?php
+[/code]
+Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of
+[code]
+ /**
+ *
+ * Name: Random Place (here you can use better descriptions than you could in the filename)
+ * Description: Sample $Projectname plugin, Sets a random place when posting.
+ * Version: 1.0
+ * Author: Mike Macgirvin &lt;mike@zothub.com&gt;
+ *
+ */
+[/code]
+These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'.
+
+The typical plugin will have at least the following functions:
+[code]
+ pluginname_load()
+ pluginname_unload()
+[/code]
+In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named
+[code]
+ pluginname_install()
+ pluginname_uninstall()
+[/code]
+
+Next we'll talk about [b]hooks[/b]. Hooks are places in $Projectname code where we allow plugins to do stuff. There are a [url=[baseurl]/help/hooklist]lot of these[/url], and they each have a name. What we normally do is use the pluginname_load() function to register a &quot;handler function&quot; for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
+
+We register hook handlers with the 'Zotlabs\Extend\Hook::register()' function. It typically takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
+
+[code]
+ function randplace_load() {
+ Zotlabs\Extend\Hook::register('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+
+ Zotlabs\Extend\Hook::register('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ Zotlabs\Extend\Hook::register('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+
+ }
+[/code]
+
+So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings.
+
+Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
+[code]
+ function randplace_unload() {
+ Zotlabs\Extend\Hook::unregister('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+
+ Zotlabs\Extend\Hook::unregister('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ Zotlabs\Extend\Hook::unregister('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+ }
+[/code]
+
+Hooks are always called with one argument which is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&amp;' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the passed data is a named array of data structures. Please see the &quot;hook reference&quot; (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
+
+Let's go ahead and add some code to implement our post_local hook handler.
+[code]
+ function randplace_post_hook(&amp;$item) {
+
+ /**
+ *
+ * An item was posted on the local system.
+ * We are going to look for specific items:
+ * - A status post by a profile owner
+ * - The profile owner must have allowed our plugin
+ *
+ */
+
+ logger('randplace invoked');
+
+ if(! local_channel()) /* non-zero if this is a logged in user of this system */
+ return;
+
+ if(local_channel() != $item['uid']) /* Does this person own the post? */
+ return;
+
+ if(($item['parent']) || (! is_item_normal($item))) {
+ /* If the item has a parent, or is not "normal", this is a comment or something else, not a status post. */
+ return;
+ }
+
+ /* Retrieve our personal config setting */
+
+ $active = get_pconfig(local_channel(), 'randplace', 'enable');
+
+ if(! $active)
+ return;
+ /**
+ *
+ * OK, we're allowed to do our stuff.
+ * Here's what we are going to do:
+ * load the list of timezone names, and use that to generate a list of world cities.
+ * Then we'll pick one of those at random and put it in the &quot;location&quot; field for the post.
+ *
+ */
+
+ $cities = array();
+ $zones = timezone_identifiers_list();
+ foreach($zones as $zone) {
+ if((strpos($zone,'/')) &amp;&amp; (! stristr($zone,'US/')) &amp;&amp; (! stristr($zone,'Etc/')))
+ $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
+ }
+
+ if(! count($cities))
+ return;
+ $city = array_rand($cities,1);
+ $item['location'] = $cities[$city];
+
+ return;
+ }
+[/code]
+
+Now let's add our functions to create and store preference settings.
+[code]
+ /**
+ *
+ * Callback from the settings post function.
+ * $post contains the global $_POST array.
+ * We will make sure we've got a valid user account
+ * and that only our own submit button was clicked
+ * and if so set our configuration setting for this person.
+ *
+ */
+
+ function randplace_settings_post($post) {
+ if(! local_channel())
+ return;
+ if($_POST['randplace-submit'])
+ set_pconfig(local_channel(),'randplace','enable',intval($_POST['randplace']));
+ }
+
+
+
+ /**
+ *
+ * Called from the Feature Setting form.
+ * The second argument is a string in this case, the HTML content region of the page.
+ * Add our own settings info to the string.
+ *
+ * For uniformity of settings pages, we use the following convention
+ * &lt;div class=&quot;settings-block&quot;&gt;
+ * &lt;h3&gt;title&lt;/h3&gt;
+ * .... settings html - many elements will be floated...
+ * &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt; &lt;!-- generic class which clears all floats --&gt;
+ * &lt;input type=&quot;submit&quot; name=&quot;pluginnname-submit&quot; class=&quot;settings-submit&quot; ..... /&gt;
+ * &lt;/div&gt;
+ */
+
+
+
+ function randplace_settings(&amp;$s) {
+
+ if(! local_channel())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ head_add_css(/addon/randplace/randplace.css');
+
+ /* Get the current state of our config variable */
+
+ $enabled = get_pconfig(local_channel(),'randplace','enable');
+
+ $checked = (($enabled) ? ' checked=&quot;checked&quot; ' : '');
+
+ /* Add some HTML to the existing form */
+
+ $s .= '&lt;div class=&quot;settings-block&quot;&gt;';
+ $s .= '&lt;h3&gt;' . t('Randplace Settings') . '&lt;/h3&gt;';
+ $s .= '&lt;div id=&quot;randplace-enable-wrapper&quot;&gt;';
+ $s .= '&lt;label id=&quot;randplace-enable-label&quot; for=&quot;randplace-checkbox&quot;&gt;' . t('Enable Randplace Plugin') . '&lt;/label&gt;';
+ $s .= '&lt;input id=&quot;randplace-checkbox&quot; type=&quot;checkbox&quot; name=&quot;randplace&quot; value=&quot;1&quot; ' . $checked . '/&gt;';
+ $s .= '&lt;/div&gt;&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;';
+
+ /* provide a submit button */
+
+ $s .= '&lt;div class=&quot;settings-submit-wrapper&quot; &gt;&lt;input type=&quot;submit&quot; name=&quot;randplace-submit&quot; class=&quot;settings-submit&quot; value=&quot;' . t('Submit') . '&quot; /&gt;&lt;/div&gt;&lt;/div&gt;';
+
+ }
+
+[/code]
+
+
+
+[h2]Advanced Plugins[/h2]
+
+Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
+
+There are two ways to accomplish this. To create a module object use the following model:
+[code]
+<?php /* file: addon/randplace/Mod_Randplace.php */
+namespace Zotlabs\Module;
+
+ // Your module will consist of the name of your addon with an uppercase first character, within the Zotlabs\Module namespace
+ // To avoid namespace conflicts with your plugin, the convention we're using is to name the module file Mod_Addonname.php
+ // In this case 'Mod_Randplace.php' and then include it from within your main plugin file 'randplace.php' with the line:
+ //
+ // require_once('addon/randplace/Mod_Randplace.php');
+
+ class Randplace extends \Zotlabs\Web\Controller {
+ function init() {
+ // init method is always called first if it exists
+ }
+ function post() {
+ // the post method is only called if there are $_POST variables present (e.g. the page request method is "post")
+ }
+ function get() {
+ // The get method is used to display normal content on the page
+ // whatever this function returns will be displayed in the page body
+ }
+ }
+[/code]
+
+The other option is to use a procedural interface. The $a argument to these function is obsolete, but must be present.
+The key to this is to create a simple function named pluginname_module() which does nothing. These lines and this interface
+can be used inside your addon file without causing a namespace conflict, as the object method will.
+
+[code]
+ function randplace_module() { return; }
+[/code]
+Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to return or process a structured webpage just like system modules. The typical functions and the order which they are called is
+[code]
+ modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
+ // you should do it here, followed by killme() which will avoid the default action of building a webpage
+ modulename_post($a) // Called whenever the page is accessed via the &quot;post&quot; method
+ modulename_content($a) // called to generate the central page content. This function should return a string
+ // consisting of the central page content.
+[/code]
+Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page
+[code]
+ https://yoursite/randplace/something/somewhere/whatever
+[/code]
+we will create an argc/argv list for use by your module functions
+[code]
+ $x = argc(); // $x will be 4, the number of path arguments after the sitename
+
+ for($x = 0; $x &lt; argc(); $x ++)
+ echo $x . ' ' . argv($x);
+
+
+ 0 randplace
+ 1 something
+ 2 somewhere
+ 3 whatever
+[/code]
+
+[h3]Using class methods as hook handler functions[/h3]
+
+To register a hook using a class method as a callback, a couple of things need to be considered. The first is that the functions need to be declared static public so that they are available from all contexts, and they need to have a namespace attached because they can be called from within multiple namespaces. You can then register them as strings or arrays (using the PHP internal calling method).
+
+[code]
+<?php
+/*
+ * plugin info block goes here
+ */
+
+function myplugin_load() {
+ Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php','\\Myplugin::foo');
+[b]or[/b]
+ Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php',array('\\Myplugin','foo'));
+}
+
+class Myplugin {
+
+ public static function foo($params) {
+ // handler for 'hook_name'
+ }
+}
+[/code]
+
+If you want to keep your plugin hidden from the siteinfo page, simply create a file called '.hidden' in your addon directory
+[code]
+ touch addon/<addon name>/.hidden
+[/code]
+
+***Porting Friendica Plugins***
+
+$Projectname uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are:
+
+[li] Friendica's pluginname_install() is pluginname_load()[/li]
+
+[li] Friendica's pluginname_uninstall() is pluginname_unload()[/li]
+
+$Projectname has _install and _uninstall functions but these are used differently.
+
+[li] Friendica's &quot;plugin_settings&quot; hook is called &quot;feature_settings&quot;[/li]
+
+[li] Friendica's &quot;plugin_settings_post&quot; hook is called &quot;feature_settings_post&quot;[/li]
+
+Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in $Projectname. Many structured data names (especially DB schema columns) are also quite different.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/problems-following-an-update.bb b/doc/en/problems-following-an-update.bb
new file mode 100644
index 000000000..7376d6163
--- /dev/null
+++ b/doc/en/problems-following-an-update.bb
@@ -0,0 +1,38 @@
+[b]Problems Following An Update[/b]
+
+A good 90% of all bugs encountered immediately after updating the code to the latest version are simple cache errors of one sort or another. If you update and find something very obvious is broken - like your matrix page doesn't load, notifications are missing, or comment boxes are missing - the chances are it's not a bug at all. Breaking basic functionality is the kind of thing developers tend to notice.
+
+If this happens to you, there are a few simple steps to take before resorting to the support forums:
+
+[b]Browser Cache[/b]
+
+Symptoms: Menus do not expand, ACL selector does not open, progress indicator does not display (or loops forever), Matrix and channel pages do not load.
+
+Force reload the page. Shift reload, or ctrl+f5. Occasionally, but very, very rarely, you will also need to clear the session data - which is achieved by restarting the browser.
+
+[b]FastCGI[/b]
+
+Symptoms: Incorrect variables. The basic UI mostly works, but displays incorrect content or is missing content entirely.
+
+If you're using php5-fpm, this problem is usually resolved with [code]service php5-fpm restart[/code]
+
+[b]Smarty Cache[/b]
+
+Symptoms:
+
+1) White Screen Of Death. This is most prevalent on the settings and admin pages.
+
+2) Missing icons, tabs, menus or features.
+
+We use the Smarty3 template engine to generate pages. These templates are compiled before they are displayed. Occasionally, a new or modified template will fail to overwrite the old compiled version. To clear the Smarty cache, delete all the files in store/[data]/smarty3/compiled [b]but do not delete the directory itself[/b]. Templates will then be recompiled on their next access.
+
+[b]Theme Issues[/b]
+
+There are many themes for $Projectname. Only Redbasic is officialy supported by the core developers. This applies [i]even if a core developer happens to support an additional theme[/i]. This means new features are only guaranteed to work in Redbasic.
+
+Redbasic uses a few javascript libraries that are done differently, or entirely absent in other themes. This means new features may only work properly in Redbasic. Before reporting an issue, therefore, you should switch to Redbasic to see if it exists there. If the issue goes away, this is not a bug - it's a theme that isn't up to date.
+
+Should you report an issue with the theme developers then? No. Theme developers use their themes. Chances are, they know. Give them two or three days to catch up and [i]then[/i] report the issue if it's still not fixed. There are two workarounds for this situation. Firstly, you can temporarily use Redbasic. Secondly, most themes are open source too - open a pull request and make yourself a friend.
+
+#include doc/macros/troubleshooting_footer.bb;
+
diff --git a/doc/en/red2pi.bb b/doc/en/red2pi.bb
new file mode 100644
index 000000000..8ae087fbf
--- /dev/null
+++ b/doc/en/red2pi.bb
@@ -0,0 +1,342 @@
+[b]How to install $Projectname on a Raspberry Pi[/b]
+
+You just bought a Raspberry Pi and want to run the RED Matrix with your own domain name?
+
+Then this page is for you! You will:
+[list=1]
+[*] Install Raspberry OS (Debian Linux) on a Raspberry
+[*] Install Apache Web Server, PHP, MaySQL, phpMyAdmin
+[*] Register a free domain (dynamic DNS) and use it for your hub
+[*] Install $Projectname
+[*] Keep your Raspberry Pi and $Projectname up-to-date
+[*] TODO Setting up SSL
+[*] TODO Running with SSL
+[*] TODO Make the webserver less vulnarable to attacks
+[/list]
+
+[size=large]1. Install Raspberry OS (Debian Linux)[/size]
+
+instructions under [url=http://www.raspberrypi.org/downloads]http://www.raspberrypi.org/downloads[/url]
+This page links to the quick start containing detailed instruction.
+
+[b]Format SD card[/b]
+
+using the program gparted under Linux Mint 15
+
+format as FAT32
+
+[b]Download NOOBS (offline and network install)[/b]
+
+[url=http://downloads.raspberrypi.org/noobs]http://downloads.raspberrypi.org/noobs[/url]
+
+unzip
+
+copy unzipped files to SD card
+
+[b]Install Raspbian as OS on the Rasperry Pi[/b]
+
+connect with keyboard via USB
+
+connect with monitor via HDMI
+
+Insert SD card into Rasperry Pi
+
+Connect with power supply to switch on the Rasperry
+
+choose Raspbian as OS (&gt; installs Raspbian....)
+
+wait for the coniguration program raspi-config (you can later start it by sudo raspi-config)
+
+[b]Configure Raspbian[/b]
+
+in raspi-config &gt; advanced &gt; choose to use ssh (!! You need this to connect to administrate your Pi from your PC !!)
+
+in raspi-config &gt; change the password (of default user &quot;pi&quot; from &quot;raspberry&quot; to your password)
+
+in raspi-config (optional) &gt; Internationalisation options &gt; Change Locale &gt; to de_DE.utf-8 utf-8 (for example)
+
+in raspi-config (optional) &gt; Internationalisation options &gt; Change Timezoe &gt; set your timezone
+
+in raspi-config (optional) &gt; Overlock &gt; medium
+
+(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]More[/b]
+
+[code]sudo reboot[/code]
+
+Now its time to connect the Pi to the network.
+[ul]
+[*] pull out keyboard
+[*] pull out monitor
+[*] you even can pull out the power supply (USB)
+[*] plug-in the network cable to the router
+[*] plug-in the power supply again
+[*] wait for a minute or to give the Pi time to boot and start ssh...
+[/ul]
+
+On your PC connect to the Pi to administrate (here update it).
+Open the console on the PC (Window: Start &gt; cmd, Linux: Shell)
+
+Hint: use the router admin tool to find out the IP of your PI[code]ssh pi@192.168.178.37
+sudo apt-get update
+sudo apt-get dist-upgrade[/code]
+
+(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+
+[size=large]2. Install Apache Web Server, PHP, MaySQL, phpMyAdmin[/size]
+
+[b]Install Apache Webserver[/b]
+
+[code]sudo bash
+sudo groupadd www-data[/code] might exist already
+
+[code]sudo usermod -a -G www-data www-data
+sudo apt-get update
+sudo reboot[/code]
+
+wait...
+reconnect via ssh, example: [code]ssh pi@192.168.178.37
+sudo apt-get install apache2 apache2-doc apache2-utils[/code]
+
+Open webbrowser on PC and check [url=http://192.168.178.37]http://192.168.178.37[/url]
+Should show you a page like &quot;It works&quot;
+
+(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]Install PHP, MaySQL, phpMyAdmin[/b]
+
+[code]sudo bash
+apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl
+apt-get install php5-mysql
+apt-get install mysql-server mysql-client[/code] enter and note the mysql passwort
+
+[code]apt-get install phpmyadmin[/code]
+
+Configuring phpmyadmin
+- Select apache2
+- Configure database for phpmyadmin with dbconfig-common?: Choose Yes
+
+(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]Test installation[/b]
+
+[code]cd /var/www[/code]
+
+create a php file to test the php installation[code]sudo nano phpinfo.php[/code]
+
+Insert into the file:[code]
+&lt;?php
+ phpinfo();
+?&gt;
+[/code]
+(save CTRL+0, ENTER, CTRL+X)
+
+open webbrowser on PC and try [url=http://192.168.178.37/phpinfo.php]http://192.168.178.37/phpinfo.php[/url] (page shows infos on php)
+
+connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf[/code]
+- CTRL+V... to the end of the file
+- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code]
+
+restart apache[code]/etc/init.d/apache2 restart
+sudo apt-get update
+sudo apt-get upgrade
+sudo reboot[/code]
+
+(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]phpMyAdmin[/b]
+
+open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
+
+(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]Create an empty database... that is later used by RED[/b]
+
+open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
+
+Create an empty database
+
+Note the access details (hostname, username, password, database name).
+
+
+[size=large]3. Selfhost[/size]
+
+(Source: #^[url=http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html]http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html[/url])
+
+[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
+
+[b]Step 1[/b]
+Register for a Free domain at #^[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
+(We will take techhome.homenet.org in this guide)
+
+[b]Step 2[/b]
+
+Logon to FreeDNS (where you just registered) and goto #^[url=http://freedns.afraid.org/dynamic/]http://freedns.afraid.org/dynamic/[/url]
+Right click on &quot;Direct Link&quot; and copy the URL and paste it somewhere.
+You should notice a large and unique alpha-numeric key in the URL, make a note of it as shown below:
+[code]http://freedns.afraid.org/dynamic/update.php?alphanumeric-key[/code]
+
+
+[b]Step 3[/b]
+Install inadyn using the following command:[code]sudo apt-get install inadyn[/code]
+
+[b]Step 4[/b]
+Configure inadyn using the below steps:[code]sudo nano /etc/inadyn.conf[/code]
+And add the following contains in it replacing the actual values:
+[code]
+--username [color=red]techhome[/color]
+--password [color=red]mypassword[/color]
+--update_period 3600
+--forced_update_period 14400
+--alias [color=red]techhome.homenet.org&lt;/b&gt;,[color=red]alphanumeric key[/color]
+--background
+--dyndns_system default@freedns.afraid.org
+--syslog
+ [/code]
+
+
+[b]Step 5[/b]
+
+Now, we need to ensure that the DNS updater (Inadyn) runs automatically after every re-boot[code]export EDITOR=gedit &amp;&amp; sudo crontab -e[/code]
+Add the following line:[code]@reboot /usr/sbin/inadyn[/code]
+
+
+[b]Step 6[/b]
+
+Reboot system and then run the following command to ensure inadyn is running:[code]
+sudo reboot
+ps -A | grep inadyn
+[/code]
+Now your host is ready and up for accessing from internet...
+You can trying ssh-ing from another computer over the internet
+[code]ssh username@techhome.homenet.org[/code]
+Or, if any web server is running, then simply browse to #^[url=http://techhome.homenet.org]http://techhome.homenet.org[/url]
+Or, you can just ping it to test ping techhome.homenet.org
+To check the logs you can use this:
+[code]more /var/log/messages |grep INADYN[/code]
+
+
+[size=large]4. Install $Projectname[/size]
+
+(Source: [zrl=[baseurl]/help/Install][baseurl]/help/Install[/zrl])
+
+Linux Appache document root is /var/www/
+Two files exist there (created by the steps above): index.html, phpinfo.php
+
+
+[b]Install $Projectname and its Addons[/b]
+
+Cleanup: Remove the directory www/ (Git will not create files and folders in directories that are not empty.) Make sure you are in directory var[code]pi@pi /var $ cd /var[/code]
+
+Remove directory[code]pi@pi /var $ sudo rm -rf www/[/code]
+
+Download the sources of $Projectname from GIT
+[code]pi@pi /var $ sudo git clone https://framagit.org/hubzilla/core.git www[/code]
+
+Download the sources of the addons from GIT
+[code]pi@pi /var/www $ sudo git clone https://framagit.org/hubzilla/addons.git addon[/code]
+
+Make user www-data the owner of the whole web directory (including subdirectories and files)
+(TODO: This step has to be proofed by the next installation.)
+[code]pi@pi /var $ chown -R www-data:www-data /var/www/[/code]
+
+Check if you can update the sources from git[code]
+pi@pi /var $ cd www
+pi@pi /var/www $ git pull
+[/code]
+
+Check if you can update the addons
+[code]pi@pi /var/www $ cd addon/
+pi@pi /var/www/addon $ sudo git pull[/code]
+
+Make sure folder store/[data]/smarty3 exists and is writable by the webserver
+[code]pi@pi /var/www $ sudo chmod ou+w "store/\[data\]/smarty3"[/code]
+
+Create .htconfig.php and is writable by the webserver
+[code]pi@pi /var/www $ sudo touch .htconfig.php
+pi@pi /var/www $ sudo chmod ou+w .htconfig.php[/code]
+
+[b]First start and initial configuration of your RED Matrix hub[/b]
+
+In browser open #^[zrl=http://einervonvielen.mooo.com/]http://einervonvielen.mooo.com/[/zrl]
+(Replace einervonvielen.mooo.com by your domain, see chapter selfhost. Be patient. It takes time.)
+(#^[zrl=http://einervonvielen.mooo.com/index.php?q=setup]http://einervonvielen.mooo.com/index.php?q=setup[/zrl])
+
+There might be errors like the following.
+
+Error: libCURL PHP module required but not installed.
+Solution:
+apt-get install php5-curl
+
+Error: Apache webserver mod-rewrite module is required but not installed.
+Solution
+(Source: [url=http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html]http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html[/url])
+The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load
+- pi@pi /var/www $ nano /etc/apache2/mods-available/rewrite.load
+ (You should find the contendt: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so)
+To enable and load mod_rewrite, do the rest of steps.
+Create a symbolic link in /etc/apache2/mods-enabled
+- pi@pi /var/www $ sudo a2enmod rewrite
+Then open up the following file, and replace every occurrence of &quot;AllowOverride None&quot; with &quot;AllowOverride all&quot;.
+- pi@pi /var/www $ sudo nano /etc/apache2/sites-available/default
+Finally, restart Apache2.
+- pi@pi /var/www $ sudo service apache2 restart
+
+Error store is writable (not checked)
+Solution:
+(TODO: Make writeable to group www-data only?)
+pi@pi /var/www $ sudo mkdir store
+pi@pi /var/www $ chown -R www-data:www-data /var/www/red/
+pi@pi /var/www $ sudo chmod ou+w view
+
+[b]More[/b]
+
+Set up a cron job to run the poller once every 15 minutes in order to perform background processing.
+- pi@pi /var/www $ which php
+Make sure you are in the document root directory of the webserver
+- pi@pi /var/www $ cd /var/www/
+Try to execute the poller in order to make sure it works
+- pi@pi /var/www $ /usr/bin/php include/poller.php
+Create the cronjob
+- pi@pi /var/www $ crontab -e
+Enter
+- */15 * * * * cd /var/www/; /usr/bin/php include/poller.php
+- Save and exit.
+
+Prevent search engines from indexing your search pages. Why? This can cause heavy resource use.
+
+[code]
+php util/config system block_public_search 1
+[/code]
+
+
+
+[size=large]5. Keep your Raspberry Pi and your $Projectname up-to-date[/size]
+
+Git update every day at 4 am and addons at 5 am every day
+Try if the command is working
+- pi@pi /var/www $ sudo git pull
+Create the cronjob
+- pi@pi /var/www $ crontab -e
+Enter the following to update at 4:01 am every day
+- 01 04 * * * cd /var/www/; sudo git pull
+Enter the following to update the addons at 5:01 am every day
+- 01 05 * * * cd /var/www/addon/; sudo git pull
+Enter the following to update the Raspberry Pi (Raspbian OS = Debian) at 6:01 am every day
+- 01 06 * * * sudo aptitude -y update &amp;&amp; sudo aptitude -y safe-upgrade
+Save and exit.
+
+[size=large]6. Running with SSL[/size]
+
+Follow the instructions here:
+[url=https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL]https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL[/url]
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/roadmap.bb b/doc/en/roadmap.bb
new file mode 100644
index 000000000..dce19848a
--- /dev/null
+++ b/doc/en/roadmap.bb
@@ -0,0 +1,28 @@
+
+Roadmap
+
+
+Platform
+
+ Convert E2EE and select Javascript resources to dynamic loading using jQuery.getScript() [or other methods].
+
+Webpages
+
+ Make webpage building easy, with point-n-click selectors to build PDLs
+
+
+Events
+
+ Recurring events
+ Integrate Hubzilla events with CalDAV
+
+
+Connections
+
+ CardDAV integration with abook and profiles
+
+
+Issues manager
+
+ Provide easy(easier) channel move (as opposed to channel copy or clone)
+
diff --git a/doc/en/schema_development.bb b/doc/en/schema_development.bb
new file mode 100644
index 000000000..10832684a
--- /dev/null
+++ b/doc/en/schema_development.bb
@@ -0,0 +1,78 @@
+[b]Red Development - A Guide To The Schema System[/b]
+
+A schema, in a nutshell, is a collection of settings for a bunch of variables to define
+certain elements of a theme. A schema is loaded as though it were part of config.php
+and has access to all the same information. Importantly, this means it is identity aware,
+and can be used to do some interesting things. One could, for example, restrict options
+by service class, or present different options to different members.
+
+By default, we filter only by whether or not expert mode is enabled. If expert mode is
+enabled, all options are presented to the member. If it is not, only scheme, background
+image, font face, and iconset are available as choices.
+
+A schema is loaded *after* the member's personal settings. Therefore, to allow a member
+to overwrite a particular aspect of a schema you would use the following syntax:
+[code]
+ if (! $foo)
+ $foo = 'bar';
+[/code]
+However, there are circumstances - particularly with positional elements - where it
+may be desirable (or necessary) to override a member's settings. In this case, the syntax
+is even simpler:
+[code]
+ $foo = 'bar';
+[/code]
+Members will not thank you for this, however, so only use it when it is required.
+
+If no personal options are set, and no schema is selected, we will first try to load a schema
+with the file name &quot;default.php&quot;. This file should never be included with a theme. If it
+is, merge conflicts will occur as people update their code. Rather, this should be defined
+by administrators on a site by site basis.
+default.php and default.css MUST be symlinks to existing scheme files.
+
+You schema does not need to - and should not - contain all of these values. Only the values
+that differ from the defaults should be listed. This gives you some very powerful options
+with very few lines of code.
+
+Note the options available differ with each theme. The options available with the Redbasic
+theme are as follows:
+
+[li] nav_colour
+ The colour of the navigation bar. Options are red, black and silver. Alternatively,
+ one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and
+ hover effects.[/li]
+[li] banner_colour
+ The font colour of the banner element. Accepts an RGB or Hex value.[/li]
+[li] bgcolour
+ Set the body background colour. Accepts an RGB or Hex value.[/li]
+[li] background_image
+ Sets a background image. Accepts a URL or path.[/li]
+[li] item_colour
+ Set the background colour of items. Accepts an RGB or Hex value.[/li]
+[li] item_opacity
+ Set the opacity of items. Accepts a value from 0.01 to 1[/li]
+[li] toolicon_colour
+ Set the colour of tool icons. Accepts an RGB or Hex value.[/li]
+[li] toolicon_activecolour
+ Set the colour of active or hovered icon tools.[/li]
+[li] font_size
+ Set the size of fonts in items and posts. Accepts px or em.[/li]
+[li] body_font_size
+ Sets the size of fonts at the body level. Accepts px or em.[/li]
+[li] font_colour
+ Sets the font colour. Accepts an RGB or Hex value.[/li]
+[li] radius
+ Set the radius of corners. Accepts a numeral, and is always in px.[/li]
+[li] shadow
+ Set the size of shadows shown with inline images. Accepts a numerical
+ value. Note shadows are not applied to smileys.[/li]
+[li] converse_width
+ Set the maximum width of the content region in px.[/li]
+[li] nav_min_opacity[/li]
+[li] top_photo[/li]
+[li] reply_photo[/li]
+
+If a your_schema_name.css file is found, the content of this file will be attached to the end of style.css.
+This gives the schem developer the possiblity to override any style component.
+
+#include doc/macros/main_footer.bb;
diff --git a/doc/en/schemaspy_hubzilla/zot.meta.xml b/doc/en/schemaspy_hubzilla/zot.meta.xml
new file mode 100644
index 000000000..98a9d370e
--- /dev/null
+++ b/doc/en/schemaspy_hubzilla/zot.meta.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<schemaMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://schemaspy.sourceforge.net/xmlschema/2011/02/05/schemaspy.meta.xsd">
+<comments>
+2015-11-04 - Hubzilla database schema with some corrected cross-table relationships supporting decentralized publishing. Haakon Meland Eriksen.
+</comments>
+
+ <tables>
+ <table name="abook">
+ <column name="abook_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="account">
+ </table>
+ <table name="addon">
+ </table>
+ <table name="app">
+ </table>
+ <table name="attach">
+ <column name="hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="auth_codes">
+ </table>
+ <table name="cache">
+ </table>
+ <table name="channel">
+ <column name="channel_hash">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="chat">
+ <column name="chat_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="chatpresence">
+ <column name="cp_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="chatroom">
+ </table>
+ <table name="clients">
+ </table>
+ <table name="config">
+ </table>
+ <table name="conv">
+ </table>
+ <table name="dreport">
+ <column name="dreport_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="event">
+ <column name="event_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ <column name="event_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="fcontact">
+ </table>
+ <table name="ffinder">
+ </table>
+ <table name="fserver">
+ </table>
+ <table name="fsuggest">
+ </table>
+ <table name="group_member">
+ <column name="xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="groups">
+ <column name="hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="hook">
+ </table>
+ <table name="hubloc">
+ <column name="hubloc_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="issue">
+ </table>
+ <table name="item">
+ <column name="owner_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ <column name="author_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ <column name="source_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="item_id">
+ </table>
+ <table name="likes">
+ </table>
+ <table name="mail">
+ <column name="from_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ <column name="to_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="manage">
+ <column name="xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="menu">
+ </table>
+ <table name="menu_item">
+ </table>
+ <table name="notify">
+ <column name="hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="obj">
+ </table>
+ <table name="outq">
+ <column name="outq_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="pconfig">
+ </table>
+ <table name="photo">
+ <column name="xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="poll">
+ </table>
+ <table name="poll_elm">
+ </table>
+ <table name="profdef">
+ </table>
+ <table name="profext">
+ <column name="hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="profile">
+ </table>
+ <table name="profile_check">
+ </table>
+ <table name="register">
+ <column name="hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="session">
+ </table>
+ <table name="shares">
+ <column name="share_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="sign">
+ </table>
+ <table name="site">
+ </table>
+ <table name="source">
+ <column name="src_channel_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ <column name="src_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="spam">
+ </table>
+ <table name="sys_perms">
+ </table>
+ <table name="term">
+ <column name="term_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ <column name="parent_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="tokens">
+ </table>
+ <table name="updates">
+
+ <column name="ud_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="verify">
+ </table>
+ <table name="vote">
+ <column name="vote_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="xchan">
+ <column name="xchan_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ </column>
+ </table>
+ <table name="xchat">
+
+ <column name="xchat_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="xconfig">
+
+ <column name="xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="xign">
+
+ <column name="xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+
+ </table>
+ <table name="xlink">
+
+ <column name="xlink_xchan">
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ <table name="xperm">
+
+ </table>
+ <table name="xprof">
+ <column name="xprof_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+
+ </table>
+ <table name="xtag">
+
+ <column name="xtag_hash">
+ <foreignKey table="channel" column="channel_hash"/>
+ <foreignKey table="hubloc" column="hubloc_hash"/>
+ <foreignKey table="xchan" column="xchan_hash" />
+ </column>
+ </table>
+ </tables>
+
+</schemaMeta>
diff --git a/doc/en/sql_conventions.bb b/doc/en/sql_conventions.bb
new file mode 100644
index 000000000..f6a4e251f
--- /dev/null
+++ b/doc/en/sql_conventions.bb
@@ -0,0 +1,91 @@
+[h1]SQL Conventions[/h1]
+[b]Intro[/b]
+The following common SQL conventions appear throughout the code in many places. We use a simple DBA (DataBase Abstraction layer) to handle differences between databases. Please be sure to use only standards-compliant SQL.
+
+[b]Rule One[/b]
+Worth Repeating: Don't use non-standard SQL. This goes for addons as well. If you do use non-standard SQL, and the dba funcs are insufficient, do a if()/switch() or similar for all currently supported databases. Currently nothing red# does requires non-standard SQL.
+
+[b]Using a format string[/b]
+[li]Uses sprintf()
+To be written
+[code]// Example
+$r = q("SELECT * FROM profile WHERE uid = %d",
+ local_channel()
+);
+[/code][/li]
+
+[b]Checking bit flags in a where clause[/b]
+[li]You must explicitly convert integers to booleans. The easiest way to do this is to compare to 0.
+[code]// Example
+$r = q("SELECT abook_id, abook_flags, abook_my_perms, abook_their_perms, xchan_hash, xchan_photo_m, xchan_name, xchan_url from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d)>0 ",
+ intval($uid),
+ intval(ABOOK_FLAG_SELF)
+);
+[/code]
+[/li]
+[li]Turning off a flag
+[code]$y = q("update xchan set xchan_flags = (xchan_flags & ~%d) where (xchan_flags & %d)>0 and xchan_hash = '%s'",
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ dbesc($rr['hubloc_hash'])
+);[/code]
+[/li]
+[li]Turning on a flag
+[code]$y = q("update xchan set xchan_flags = (xchan_flags | %d) where xchan_hash = '%s'",
+ intval(XCHAN_FLAGS_ORPHAN),
+ dbesc($rr['hubloc_hash'])
+);[/code]
+[/li]
+
+[b]Using relative times (INTERVALs)[/b]
+[li]Sometimes you want to compare something, like less than x days old.
+[code]// Example
+$r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_dob > %s + interval %s and abook_dob < %s + interval %s",
+ db_utcnow(), db_quoteinterval('7 day'),
+ db_utcnow(), db_quoteinterval('14 day')
+);[/code]
+[/li]
+[b]Paged results[/b]
+[li]To be written
+[code]// Example
+$r = q("SELECT * FROM mail WHERE uid=%d AND $sql_extra ORDER BY created DESC LIMIT %d OFFSET %d",
+ intval(api_user()),
+ intval($count), intval($start)
+);[/code][/li]
+
+[b]NULL dates[/b]
+[li]To be written
+[code]// Example
+$r = q("DELETE FROM mail WHERE expires != '%s' AND expires < %s ",
+ dbesc(NULL_DATE),
+ db_utcnow()
+);[/code][/li]
+
+[b]Storing binary data[/b]
+[li]To be written
+[code]// Example
+$x = q("update photo set data = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and scale = 0",
+ dbescbin($ph->imageString()),
+ intval($height),
+ intval($width),
+ dbesc($resource_id),
+ intval($page_owner_uid)
+);[/code][/li]
+
+[b]Current timestamp[/b]
+[li][code]// Example
+$randfunc = db_getfunc('rand');
+$r = q("select xchan_url from xchan left join hubloc on hubloc_hash = xchan_hash where hubloc_connected > %s - interval %s order by $randfunc limit 1",
+ db_utcnow(), db_quoteinterval('30 day')
+);[/code][/li]
+
+[b]SQL Function and Operator Abstraction[/b]
+[li]Sometimes the same function or operator has a different name/symbol in each database. You use db_getfunc('funcname') to look them up. The string is [i]not[/i] case-sensitive; do [i]not[/i] include parens.
+[code]// Example
+$randfunc = db_getfunc('rand');
+$r = q("select xchan_url from xchan left join hubloc on hubloc_hash = xchan_hash where hubloc_connected > %s - interval %s order by $randfunc limit 1",
+ db_utcnow(), db_quoteinterval('30 day')
+);[/code][/li]
+
+#include doc/macros/main_footer.bb; \ No newline at end of file
diff --git a/doc/en/toc.html b/doc/en/toc.html
new file mode 100644
index 000000000..b1edef6d2
--- /dev/null
+++ b/doc/en/toc.html
@@ -0,0 +1,75 @@
+<div class="" id="accordion">
+ <div class="mb-3">
+ <div class="">
+ <h3 class="panel-title">
+ Tutorials
+ </h3>
+ </div>
+ <div id="tutorials" class="doco-section">
+ <div class="vstack">
+ <a class="" href="/help/tutorials/personal_channel">Personal Channel</a>
+ </div>
+ </div>
+ </div>
+ <div class="mb-3">
+ <div class="">
+ <h3 class="panel-title">
+ Members
+ </h3>
+ </div>
+ <div id="members" class="doco-section">
+ <div class="vstack">
+ <a class="" href="/help/member/member_guide">Guide</a>
+ <a class="" href="/help/member/bbcode">BBcode Reference</a>
+ <a class="" href="/help/feature/additional/overview">Additional Features</a>
+ <a class="" href="/help/bugs">Reporting Bugs</a>
+ <a class="" href="/help/member/member_faq">FAQ</a>
+ </div>
+ </div>
+ </div>
+ <div class="mb-3">
+ <div class="">
+ <h3 class="panel-title">
+ Administrators
+ </h3>
+ </div>
+ <div id="administrators" class="doco-section">
+ <div class="vstack">
+ <a class="" href="/help/admin/administrator_guide">Guide</a>
+ <a class="" href="/help/admin/hub_snapshots">Hub Snapshots</a>
+ <a class="" href="/help/database">Database</a>
+ <a class="" href="/help/hidden_configs">Extra configs</a>
+ </div>
+ </div>
+ </div>
+ <div class="mb-3">
+ <div class="">
+ <h3 class="panel-title">
+ Developers
+ </h3>
+ </div>
+ <div id="developers" class="doco-section">
+ <div class="vstack">
+ <a class="" href="/help/developer/developer_guide">Guide</a>
+ <a class="" href="/help/developer/covenant">Code of Conduct</a>
+ <a class="" href="/help/developer/zot_protocol">Zot Protocol</a>
+ <a class="" href="/help/developer/api_zot">Zot API</a>
+ <a class="" href="/help/hooklist">Hooks</a>
+ </div>
+ </div>
+ </div>
+ <div class="mb-3">
+ <div class="">
+ <h3 class="panel-title">
+ About
+ </h3>
+ </div>
+ <div id="about" class="doco-section">
+ <div class="vstack">
+ <a class="" href="/help/about/about">About</a>
+ <a class="" href="/help/about/project">Project</a>
+ <a class="" href="/help/about/about_hub">About this hub</a>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/doc/en/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png b/doc/en/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png
new file mode 100644
index 000000000..d5cf1093f
--- /dev/null
+++ b/doc/en/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png
Binary files differ
diff --git a/doc/en/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png b/doc/en/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png
new file mode 100644
index 000000000..d613925aa
--- /dev/null
+++ b/doc/en/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png
Binary files differ
diff --git a/doc/en/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png b/doc/en/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png
new file mode 100644
index 000000000..c403bf806
--- /dev/null
+++ b/doc/en/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png
Binary files differ
diff --git a/doc/en/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png b/doc/en/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png
new file mode 100644
index 000000000..ca8ba6fb9
--- /dev/null
+++ b/doc/en/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png
Binary files differ
diff --git a/doc/en/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png b/doc/en/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png
new file mode 100644
index 000000000..0da2d96e2
--- /dev/null
+++ b/doc/en/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png
Binary files differ
diff --git a/doc/en/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png b/doc/en/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png
new file mode 100644
index 000000000..2a209b2be
--- /dev/null
+++ b/doc/en/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png
Binary files differ
diff --git a/doc/en/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png b/doc/en/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png
new file mode 100644
index 000000000..f992672b0
--- /dev/null
+++ b/doc/en/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png
Binary files differ
diff --git a/doc/en/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png b/doc/en/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png
new file mode 100644
index 000000000..b656192dc
--- /dev/null
+++ b/doc/en/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png
Binary files differ
diff --git a/doc/en/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png b/doc/en/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png
new file mode 100644
index 000000000..6129195b6
--- /dev/null
+++ b/doc/en/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png
Binary files differ
diff --git a/doc/en/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png b/doc/en/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png
new file mode 100644
index 000000000..923403fe9
--- /dev/null
+++ b/doc/en/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png
Binary files differ
diff --git a/doc/en/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png b/doc/en/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png
new file mode 100644
index 000000000..f158ad5d9
--- /dev/null
+++ b/doc/en/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png
Binary files differ
diff --git a/doc/en/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png b/doc/en/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png
new file mode 100644
index 000000000..edc8b01cc
--- /dev/null
+++ b/doc/en/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png
Binary files differ
diff --git a/doc/en/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png b/doc/en/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png
new file mode 100644
index 000000000..5b259058b
--- /dev/null
+++ b/doc/en/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png
Binary files differ
diff --git a/doc/en/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png b/doc/en/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png
new file mode 100644
index 000000000..c03ffd18d
--- /dev/null
+++ b/doc/en/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png
Binary files differ
diff --git a/doc/en/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png b/doc/en/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png
new file mode 100644
index 000000000..65d4c5f0a
--- /dev/null
+++ b/doc/en/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png
Binary files differ
diff --git a/doc/en/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png b/doc/en/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png
new file mode 100644
index 000000000..45609a7bb
--- /dev/null
+++ b/doc/en/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png
Binary files differ
diff --git a/doc/en/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png b/doc/en/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png
new file mode 100644
index 000000000..d239d6965
--- /dev/null
+++ b/doc/en/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png
Binary files differ
diff --git a/doc/en/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png b/doc/en/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png
new file mode 100644
index 000000000..45ed64d00
--- /dev/null
+++ b/doc/en/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png
Binary files differ
diff --git a/doc/en/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png b/doc/en/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png
new file mode 100644
index 000000000..fcaed8bef
--- /dev/null
+++ b/doc/en/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png
Binary files differ
diff --git a/doc/en/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png b/doc/en/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png
new file mode 100644
index 000000000..0ccfc8995
--- /dev/null
+++ b/doc/en/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png
Binary files differ
diff --git a/doc/en/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png b/doc/en/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png
new file mode 100644
index 000000000..1cb4d2d22
--- /dev/null
+++ b/doc/en/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png
Binary files differ
diff --git a/doc/en/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png b/doc/en/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png
new file mode 100644
index 000000000..22e4cb5d5
--- /dev/null
+++ b/doc/en/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png
Binary files differ
diff --git a/doc/en/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png b/doc/en/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png
new file mode 100644
index 000000000..5674f5207
--- /dev/null
+++ b/doc/en/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png
Binary files differ
diff --git a/doc/en/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png b/doc/en/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png
new file mode 100644
index 000000000..e6b4a9974
--- /dev/null
+++ b/doc/en/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png
Binary files differ
diff --git a/doc/en/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png b/doc/en/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png
new file mode 100644
index 000000000..8de042ae4
--- /dev/null
+++ b/doc/en/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png
Binary files differ
diff --git a/doc/en/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png b/doc/en/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png
new file mode 100644
index 000000000..cec391fb4
--- /dev/null
+++ b/doc/en/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png
Binary files differ
diff --git a/doc/en/tutorials/personal_channel.html b/doc/en/tutorials/personal_channel.html
new file mode 100644
index 000000000..3069cd44b
--- /dev/null
+++ b/doc/en/tutorials/personal_channel.html
@@ -0,0 +1,162 @@
+
+<p>This tutorial is intended to be followed in sequence as if you were setting up a
+channel for the first time. It introduces some of the tools and features related
+to a personal channel in a natural way.</p>
+
+<h3 id="Create_a_new_channel">Create a new channel</h3>
+
+<p>When you log in for the first time after registering, you must create a channel.
+(Alternatively you can visit https://your_website/new_channel)</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png" alt="image"></p>
+
+<p>Enter your name and a nickname for the channel address, and select a "role".
+Typically if this is a personal channel that represents you, select a <strong>Social</strong> role
+with a level of default privacy that you are comfortable with. If you are unsure,
+select <strong>Social - Mostly public</strong> which allows easy interaction and provides privacy when you need it.
+Alternatively, <strong>Social - Restricted</strong> is very popular among privacy advocates, though it may require a bit more
+effort to meet people. Whichever setting you choose can be changed later if you decide you require more or less privacy than what is provided.</p>
+
+<!-- This section no longer applicable
+<h3 id="Configure_your_channel_features">Configure your channel features</h3>
+
+<p>When your new channel is created you are directed to the channel settings page.
+Take the time to look around at all the settings pages to familiarize yourself with
+your options, even if you don't understand everything you see right now.</p>
+
+<p>Navigate to the <strong>Additional Features</strong> settings and follow the screenshots below to
+enable various features. Remember to press the Submit button when you are done with
+your selections.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png" alt="image"><img class="img-responsive" src="/help/en/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png" alt="image"><img class="img-responsive" src="/help/en/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png" alt="image"><img class="img-responsive" src="/help/en/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png" alt="image"></p>
+-->
+
+<h3 id="Add_a_profile_photo">Add a profile photo</h3>
+
+<p>When your new channel is created, you will be directed to a page determined by your site admin. By default this is the <strong>Edit Profile</strong> page.
+
+<p>From the <strong>Profile Tools</strong> dropdown menu, select <strong>Change profile photo</strong> (or just click the profile photo).</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png" alt="image"></p>
+
+<p>Upload your photo and size as necessary using the image editor.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png" alt="image"></p>
+
+<p>When you press <strong>Done Editing</strong> you will be redirected back to the profile editor.
+(You might need to clear your browser cache if you have trouble seeing the new photo.)</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png" alt="image"></p>
+
+<p>Returning to your channel home page you will see that a post notifying others of your new
+profile pic has been automatically posted.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png" alt="image"></p>
+
+<h3 id="Compose_a_post">Compose a post</h3>
+
+<p>Go to your channel home and open the post editor by pressing the <strong>Share</strong> textbox
+at the top of the channel "wall". Enter a message, and then drag-and-drop an image
+file into the post editor text area (alternatively you can use the <strong>Attach file</strong>
+tool at the bottom).</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png" alt="image"></p>
+
+<p>Your image file will be automatically uploaded and stored in your cloud files, and
+a link will appear in the post window. Pressing the post preview button will allow you to preview your post before publishing it.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png" alt="image"></p>
+
+<p>Pressing the lock button near the Submit button will open the <strong>Access Control List</strong>
+so you can specify exactly who can access this post.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png" alt="image"></p>
+
+<h3 id="Use_an_uploaded_image_as_a_channel_cover_photo">Use an uploaded image as a channel cover photo</h3>
+
+<p>One way to add some pizzazz your channel is to add a cover photo that visitors will
+see when they load your channel page. The integrated cloud file system
+allows you to choose an existing photo for this purpose.</p>
+
+<p>Visit your photos in the <strong>Photos</strong> app</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png" alt="image"></p>
+
+<p>Select the photo you wish to use and select <strong>Use as cover photo</strong> from the <strong>Photo Tools</strong>
+dropdown menu.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png" alt="image"></p>
+
+<p>Crop the image using the photo editor and save your changes.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png" alt="image"></p>
+
+<p>When you load your channel home page, you will first see the cover photo, and your
+channel page will fade in as you scroll down.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png" alt="image"></p>
+
+<h3 id="Make_a_connection">Make a connection</h3>
+
+<p>Making connections between channels to share things is what social communications are all about.
+Making a connection is simple. If you do not already know how to reach a channel's home
+page, you might try a directory search by opening the <strong>Directory</strong> link from the menu on the right
+side of the top navbar.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png" alt="image"></p>
+
+<p>You can connect directly from the directory entry using the <strong>Connect</strong> button there,
+or you can open the channel page first and press the <strong>Connect</strong> button below the
+profile photo.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png" alt="image"></p>
+
+<p>After you connect you are immediately taken to the connection editor page, where
+you make some important decisions about what you plan to share with this channel.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png" alt="image"></p>
+
+<p>The two important settings are</p>
+
+<ul><li>The individual permissions for the newly connected channel</li>
+<li>The privacy group(s) the connection is a member of</li>
+</ul><p>The individual permissions are mostly straightforward, but they can be slightly
+unclear at first. For example, <strong>Can view my file storage and photos</strong> does <em>not</em>
+mean that the connected channel will be able to view <em>all</em> of your photos and files!
+It means that you will have the <em>option</em> to share photos and files with that
+channel. It is perfectly possible for you to allow someone to read your posts but
+disallow them from seeing photos in that post. This kind of unusual situation is,
+as they say, not a bug; it is a feature.</p>
+
+<p>Privacy groups allow you to conveniently share items with groups of people. You can
+create whatever groups fit your needs by opening the <strong>Add privacy group</strong> link.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png" alt="image"></p>
+
+<p>In this editor, you can switch between the existing privacy groups and see at a
+glance what channels are and are not members of the group. Selecting the icon of
+a channel in either box will move it to the in or out of the group.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png" alt="image"></p>
+
+<p>When editing an individual channel's settings, you can set their privacy group
+membership using the widget on the left:</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png" alt="image"></p>
+
+<p>Connections are a mutual engagement. The channel you connect can <em>choose</em> to approve your
+connection. They will receive a notification that you connected</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png" alt="image"></p>
+
+<p>which takes them to their <a href="https://grid.reticu.li/connections"><strong>Connections</strong></a> editor page where
+they can choose to approve the connection or not.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png" alt="image"></p>
+
+<p>After you approve a connection, it is a good idea to open the individual connection
+editor by pressing the edit button beside the <strong>Delete</strong> button.</p>
+
+<p><img class="img-responsive" src="/help/en/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png" alt="image"></p>
+
+