help/search/search_index.json

1 line
1.7 MiB

{"config":{"indexing":"full","lang":["en","de"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"admin/config/","tags":["admin","configuration"],"text":"Config values that can only be set in config/local.config.php # Friendica's configuration is done in two places: in PHP array configuration files and in the config database table. Database config values overwrite the same file config values. File configuration # The configuration format for file configuration is an array returned from a PHP file. This prevents your webserver from displaying your private configuration. It interprets the configuration files and displays nothing. A typical configuration file looks like this: <?php /* * Comment block */ return [ 'section1' => [ // Comment line 'key' => 'value' , ], 'section2' => [ 'array' => [ 'value0' , 'value1' , 'value2' ], ], ]; Configuration location # The config directory holds key configuration files and can have different config files. All of them have to end with .config.php and must not include -sample in their name. Some examples of common known configuration files: - local.config.php holds the current node custom configuration. - addon.config.php is optional and holds the custom configuration for specific addons. Addons can define their own default configuration values in addon/[addon]/config/[addon].config.php which is loaded when the addon is activated. If needed, an alternative config path can be used by using the FRIENDICA_CONFIG_DIR environment variable (full path required!). This is useful in case of hardening the system by separating configuration from program binaries. Static Configuration location # The static directory holds the codebase default configurations files. They must not be changed by users, because they can get changed from release to release. Currently, the following configurations are included: - defaults.config.php holds the default values for all the configuration keys that can only be set in local.config.php . - settings.config.php holds the default values for some configuration keys that are set through the admin settings page. Migrating from .htconfig.php to config/local.config.php # The legacy .htconfig.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your .htconfig.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your .htconfig.php to check your node is working as expected before deleting it. table.config { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.config > tr > th, table.config > tr > td, table.config > * > tr > th, table.config > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.config > tr > th, table.config > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } .htconfig.php config/local.config.php $db_host = 'localhost'; $db_user = 'mysqlusername'; $db_pass = 'mysqlpassword'; $db_data = 'mysqldatabasename'; $a->config[\"system\"][\"db_charset\"] = 'utf8mb4'; 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], $a->config[\"section\"][\"key\"] = \"value\"; 'section' => [ 'key' => 'value', ], $a->config[\"section\"][\"key\"] = array( \"value1\", \"value2\", \"value3\" ); 'section' => [ 'key' => ['value1', 'value2', 'value3'], ], $a->config[\"key\"] = \"value\"; 'config' => [ 'key' => 'value', ], $a->config['register_policy'] = REGISTER_CLOSED; 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], $a->path = \"value\"; 'system' => [ 'urlpath' => 'value', ], $default_timezone = \"value\"; 'system' => [ 'default_timezone' => 'value', ], $pidfile = \"value\"; 'system' => [ 'pidfile' => 'value', ], $lang = \"value\"; 'system' => [ 'language' => 'value', ], Migrating from config/local.ini.php to config/local.config.php # The legacy config/local.ini.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your config/addon.ini.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your config/local.ini.php file to check your node is working as expected before deleting it. config/local.ini.php config/local.config.php [database] hostname = localhost username = mysqlusername password = mysqlpassword database = mysqldatabasename charset = utf8mb4 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], [section] key = value 'section' => [ 'key' => 'value', ], [config] register_policty = REGISTER_CLOSED 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], [section] key[] = value1 key[] = value2 key[] = value3 'section' => [ 'key' => ['value1', 'value2', 'value3'], ], Database Settings # The configuration variables database.hostname , database.username , database.password , database.database and database.charset are holding your credentials for the database connection. If you need to specify a port to access the database, you can do so by appending :portnumber to the database.hostname variable. 'database' => [ 'hostname' => 'your.mysqlhost.com:123456', ] If all the following environment variables are set, Friendica will use them instead of the previously configured variables for the db: MYSQL_HOST MYSQL_PORT MYSQL_USERNAME MYSQL_PASSWORD MYSQL_DATABASE Config values that can only be set in config/local.config.php # There are some config values that haven't found their way into the administration page. This has several reasons. Maybe they are part of a current development that isn't considered stable and will be added later in the administration page when it is considered safe. Or it triggers something that isn't expected to be of public interest. Or it is for testing purposes only. Attention: Please be warned that you shouldn't use one of these values without the knowledge what it could trigger. Especially don't do that with undocumented values. These configurations keys and their default value are listed in static/defaults.config.php and should be overwritten in config/local.config.php . Administrator Options # Enabling the admin panel for an account, and thus making the account holder admin of the node, is done by setting the variable 'config' => [ 'admin_email' => 'someone@example.com', ] Where you have to match the email address used for the account with the one you enter to the config/local.config.php file. If more than one account should be able to access the admin panel, separate the email addresses with a comma. 'config' => [ 'admin_email' => 'someone@example.com,someoneelse@example.com', ] If you want to have a more personalized closing line for the notification emails you can set a variable for the admin_name . 'config' => [ 'admin_name' => 'Marvin', ]","title":"Config Values"},{"location":"admin/config/#config-values-that-can-only-be-set-in-configlocalconfigphp","text":"Friendica's configuration is done in two places: in PHP array configuration files and in the config database table. Database config values overwrite the same file config values.","title":"Config values that can only be set in config/local.config.php"},{"location":"admin/config/#file-configuration","text":"The configuration format for file configuration is an array returned from a PHP file. This prevents your webserver from displaying your private configuration. It interprets the configuration files and displays nothing. A typical configuration file looks like this: <?php /* * Comment block */ return [ 'section1' => [ // Comment line 'key' => 'value' , ], 'section2' => [ 'array' => [ 'value0' , 'value1' , 'value2' ], ], ];","title":"File configuration"},{"location":"admin/config/#configuration-location","text":"The config directory holds key configuration files and can have different config files. All of them have to end with .config.php and must not include -sample in their name. Some examples of common known configuration files: - local.config.php holds the current node custom configuration. - addon.config.php is optional and holds the custom configuration for specific addons. Addons can define their own default configuration values in addon/[addon]/config/[addon].config.php which is loaded when the addon is activated. If needed, an alternative config path can be used by using the FRIENDICA_CONFIG_DIR environment variable (full path required!). This is useful in case of hardening the system by separating configuration from program binaries.","title":"Configuration location"},{"location":"admin/config/#static-configuration-location","text":"The static directory holds the codebase default configurations files. They must not be changed by users, because they can get changed from release to release. Currently, the following configurations are included: - defaults.config.php holds the default values for all the configuration keys that can only be set in local.config.php . - settings.config.php holds the default values for some configuration keys that are set through the admin settings page.","title":"Static Configuration location"},{"location":"admin/config/#migrating-from-htconfigphp-to-configlocalconfigphp","text":"The legacy .htconfig.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your .htconfig.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your .htconfig.php to check your node is working as expected before deleting it. table.config { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.config > tr > th, table.config > tr > td, table.config > * > tr > th, table.config > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.config > tr > th, table.config > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } .htconfig.php config/local.config.php $db_host = 'localhost'; $db_user = 'mysqlusername'; $db_pass = 'mysqlpassword'; $db_data = 'mysqldatabasename'; $a->config[\"system\"][\"db_charset\"] = 'utf8mb4'; 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], $a->config[\"section\"][\"key\"] = \"value\"; 'section' => [ 'key' => 'value', ], $a->config[\"section\"][\"key\"] = array( \"value1\", \"value2\", \"value3\" ); 'section' => [ 'key' => ['value1', 'value2', 'value3'], ], $a->config[\"key\"] = \"value\"; 'config' => [ 'key' => 'value', ], $a->config['register_policy'] = REGISTER_CLOSED; 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], $a->path = \"value\"; 'system' => [ 'urlpath' => 'value', ], $default_timezone = \"value\"; 'system' => [ 'default_timezone' => 'value', ], $pidfile = \"value\"; 'system' => [ 'pidfile' => 'value', ], $lang = \"value\"; 'system' => [ 'language' => 'value', ],","title":"Migrating from .htconfig.php to config/local.config.php"},{"location":"admin/config/#migrating-from-configlocaliniphp-to-configlocalconfigphp","text":"The legacy config/local.ini.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your config/addon.ini.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your config/local.ini.php file to check your node is working as expected before deleting it. config/local.ini.php config/local.config.php [database] hostname = localhost username = mysqlusername password = mysqlpassword database = mysqldatabasename charset = utf8mb4 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], [section] key = value 'section' => [ 'key' => 'value', ], [config] register_policty = REGISTER_CLOSED 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], [section] key[] = value1 key[] = value2 key[] = value3 'section' => [ 'key' => ['value1', 'value2', 'value3'], ],","title":"Migrating from config/local.ini.php to config/local.config.php"},{"location":"admin/config/#database-settings","text":"The configuration variables database.hostname , database.username , database.password , database.database and database.charset are holding your credentials for the database connection. If you need to specify a port to access the database, you can do so by appending :portnumber to the database.hostname variable. 'database' => [ 'hostname' => 'your.mysqlhost.com:123456', ] If all the following environment variables are set, Friendica will use them instead of the previously configured variables for the db: MYSQL_HOST MYSQL_PORT MYSQL_USERNAME MYSQL_PASSWORD MYSQL_DATABASE","title":"Database Settings"},{"location":"admin/config/#config-values-that-can-only-be-set-in-configlocalconfigphp_1","text":"There are some config values that haven't found their way into the administration page. This has several reasons. Maybe they are part of a current development that isn't considered stable and will be added later in the administration page when it is considered safe. Or it triggers something that isn't expected to be of public interest. Or it is for testing purposes only. Attention: Please be warned that you shouldn't use one of these values without the knowledge what it could trigger. Especially don't do that with undocumented values. These configurations keys and their default value are listed in static/defaults.config.php and should be overwritten in config/local.config.php .","title":"Config values that can only be set in config/local.config.php"},{"location":"admin/config/#administrator-options","text":"Enabling the admin panel for an account, and thus making the account holder admin of the node, is done by setting the variable 'config' => [ 'admin_email' => 'someone@example.com', ] Where you have to match the email address used for the account with the one you enter to the config/local.config.php file. If more than one account should be able to access the admin panel, separate the email addresses with a comma. 'config' => [ 'admin_email' => 'someone@example.com,someoneelse@example.com', ] If you want to have a more personalized closing line for the notification emails you can set a variable for the admin_name . 'config' => [ 'admin_name' => 'Marvin', ]","title":"Administrator Options"},{"location":"admin/install-ejabberd/","tags":["admin","ejabberd"],"text":"Install an ejabberd with synchronized credentials # Ejabberd is a chat server that uses XMPP as messaging protocol that you can use with a large amount of clients. In conjunction with the \"xmpp\" addon it can be used for a web based chat solution for your users. Installation # Change its owner to whichever user is running the server, i.e. ejabberd $ chown ejabberd:ejabberd /path/to/friendica/bin/auth_ejabberd.php Change the access mode, so it is readable only to the user ejabberd and has exec $ chmod 700 /path/to/friendica/bin/auth_ejabberd.php Edit your ejabberd.cfg file, comment out your auth_method and add: {auth_method, external}. {extauth_program, \"/path/to/friendica/bin/auth_ejabberd.php\"}. Disable the module \"mod_register\" and disable the registration: {access, register, [{deny, all}]}. Enable BOSH: Enable the module \"mod_http_bind\" Edit this line: {5280, ejabberd_http, [captcha, http_poll, http_bind]} In your apache configuration for your site add this line: ProxyPass /http-bind http://127.0.0.1:5280/http-bind retry=0 Restart your ejabberd service, you should be able to log in with your friendica credentials Other hints # if a user has a space or a @ in the nickname, the user has to replace these characters: \" \" (space) is replaced with \"%20\" \"@\" is replaced with \"(a)\"","title":"Install ejabberd"},{"location":"admin/install-ejabberd/#install-an-ejabberd-with-synchronized-credentials","text":"Ejabberd is a chat server that uses XMPP as messaging protocol that you can use with a large amount of clients. In conjunction with the \"xmpp\" addon it can be used for a web based chat solution for your users.","title":"Install an ejabberd with synchronized credentials"},{"location":"admin/install-ejabberd/#installation","text":"Change its owner to whichever user is running the server, i.e. ejabberd $ chown ejabberd:ejabberd /path/to/friendica/bin/auth_ejabberd.php Change the access mode, so it is readable only to the user ejabberd and has exec $ chmod 700 /path/to/friendica/bin/auth_ejabberd.php Edit your ejabberd.cfg file, comment out your auth_method and add: {auth_method, external}. {extauth_program, \"/path/to/friendica/bin/auth_ejabberd.php\"}. Disable the module \"mod_register\" and disable the registration: {access, register, [{deny, all}]}. Enable BOSH: Enable the module \"mod_http_bind\" Edit this line: {5280, ejabberd_http, [captcha, http_poll, http_bind]} In your apache configuration for your site add this line: ProxyPass /http-bind http://127.0.0.1:5280/http-bind retry=0 Restart your ejabberd service, you should be able to log in with your friendica credentials","title":"Installation"},{"location":"admin/install-ejabberd/#other-hints","text":"if a user has a space or a @ in the nickname, the user has to replace these characters: \" \" (space) is replaced with \"%20\" \"@\" is replaced with \"(a)\"","title":"Other hints"},{"location":"admin/installing-connectors/","tags":["admin","connectors","twitter","gnu social"],"text":"Installing Connectors (Twitter/GNU Social) # Friendica uses addons to provide connectivity to some networks, such as Twitter. There is also an addon to post through to an existing account on a GNU Social service. You only need this to post to an already existing GNU Social account, but not to communicate with GNU Social members in general. All three addons require an account on the target network. In addition, you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server. Site Configuration # Addons must be installed by the site administrator before they can be used. This is accomplished through the site administration panel. Each of the connectors also requires an \"API key\" from the service you wish to connect with. Some addons allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (config/local.config.php). The ways to obtain these keys vary between the services, but they all require an existing account on the target service. Once installed, these API keys can usually be shared by all site members. The details of configuring each service follow (much of this information comes directly from the addon source files): Twitter Addon for Friendica # Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license Configuration # To use this addon you need a OAuth Consumer key pair (key & secret). You can get it from Twitter . Register your Friendica site as \"Client\" application with \"Read & Write\" access. We do not need \"Twitter as login\". When you've registered the app you get a key pair with an OAuth Consumer key and a secret key for your application/site. Add this key pair to your config/local.config.php: [twitter] consumerkey = your consumer_key here consumersecret = your consumer_secret here After this, your users can configure their Twitter account settings from \"Settings -> Connector Settings\". More documentation # Find the author's documentation here: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin GNU Social Addon for Friendica # Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license Configuration # When the addon is activated the user has to acquire the following in order to connect to the GNU Social account of choice. The base URL for the GNU Social API, for quitter.se this is https://quitter.se/api/ OAuth Consumer key & secret To get the OAuth Consumer key pair the user has to 1 ask her Friendica admin if a pair already exists or 2 has to register the Friendica server as a client application on the GNU Social server. This can be done from the account settings under \"Settings -> Connections -> Register an OAuth client application -> Register a new application\" on the GNU Social server. During the registration of the OAuth client remember the following: Application names must be unique on the GNU Social site, so we recommend a Name of 'friendica-nnnn', replace 'nnnn' with a random number or your website name. there is no callback url register a desktop client with read & write access the Source URL should be the URL of your Friendica server After the required credentials for the application are stored in the configuration you have to actually connect your Friendica account with GNU Social. This is done from the Settings -> Connector Settings page. Follow the Sign in with GNU Social button, allow access and then copy the security code into the box provided. Friendica will then try to acquire the final OAuth credentials from the API. If successful, the addon settings will allow you to select to post your public messages to your GNU Social account (have a look behind the little lock symbol beneath the status \"editor\" on your Home or Network pages).","title":"Connectors"},{"location":"admin/installing-connectors/#installing-connectors-twittergnu-social","text":"Friendica uses addons to provide connectivity to some networks, such as Twitter. There is also an addon to post through to an existing account on a GNU Social service. You only need this to post to an already existing GNU Social account, but not to communicate with GNU Social members in general. All three addons require an account on the target network. In addition, you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server.","title":"Installing Connectors (Twitter/GNU Social)"},{"location":"admin/installing-connectors/#site-configuration","text":"Addons must be installed by the site administrator before they can be used. This is accomplished through the site administration panel. Each of the connectors also requires an \"API key\" from the service you wish to connect with. Some addons allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (config/local.config.php). The ways to obtain these keys vary between the services, but they all require an existing account on the target service. Once installed, these API keys can usually be shared by all site members. The details of configuring each service follow (much of this information comes directly from the addon source files):","title":"Site Configuration"},{"location":"admin/installing-connectors/#twitter-addon-for-friendica","text":"Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license","title":"Twitter Addon for Friendica"},{"location":"admin/installing-connectors/#configuration","text":"To use this addon you need a OAuth Consumer key pair (key & secret). You can get it from Twitter . Register your Friendica site as \"Client\" application with \"Read & Write\" access. We do not need \"Twitter as login\". When you've registered the app you get a key pair with an OAuth Consumer key and a secret key for your application/site. Add this key pair to your config/local.config.php: [twitter] consumerkey = your consumer_key here consumersecret = your consumer_secret here After this, your users can configure their Twitter account settings from \"Settings -> Connector Settings\".","title":"Configuration"},{"location":"admin/installing-connectors/#more-documentation","text":"Find the author's documentation here: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin","title":"More documentation"},{"location":"admin/installing-connectors/#gnu-social-addon-for-friendica","text":"Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license","title":"GNU Social Addon for Friendica"},{"location":"admin/installing-connectors/#configuration_1","text":"When the addon is activated the user has to acquire the following in order to connect to the GNU Social account of choice. The base URL for the GNU Social API, for quitter.se this is https://quitter.se/api/ OAuth Consumer key & secret To get the OAuth Consumer key pair the user has to 1 ask her Friendica admin if a pair already exists or 2 has to register the Friendica server as a client application on the GNU Social server. This can be done from the account settings under \"Settings -> Connections -> Register an OAuth client application -> Register a new application\" on the GNU Social server. During the registration of the OAuth client remember the following: Application names must be unique on the GNU Social site, so we recommend a Name of 'friendica-nnnn', replace 'nnnn' with a random number or your website name. there is no callback url register a desktop client with read & write access the Source URL should be the URL of your Friendica server After the required credentials for the application are stored in the configuration you have to actually connect your Friendica account with GNU Social. This is done from the Settings -> Connector Settings page. Follow the Sign in with GNU Social button, allow access and then copy the security code into the box provided. Friendica will then try to acquire the final OAuth credentials from the API. If successful, the addon settings will allow you to select to post your public messages to your GNU Social account (have a look behind the little lock symbol beneath the status \"editor\" on your Home or Network pages).","title":"Configuration"},{"location":"admin/migrate/","tags":["admin"],"text":"Migrating to a new server installation # Preparation # New server # Set up your new server as described here ; follow the installation procedure until you have created a database. Heads up to users # Inform your users of an upcoming interruption to your service. To ensure data consistency, your server needs to be offline during some steps of the migration processes. You may also find these addons useful for communicating with your users prior to the migration process: * blackout * notifyall Storage # Check your storage backend with bin/console storage list in the root folder. The output should look like this: Sel | Name ----------------------- | Filesystem * | Database If you are not using Database run the following commands: 1. bin/console storage set Database to activate the database backend. 2. bin/console storage move to initiate moving the stored image files. This process may take a long time depending on the size of your storage and your server's capacity. Prior to initiating this process, you may want to check the number of files in the storage with the following command: tree -if -I index.html /path/to/storage/ . Cleaning up # Before transferring your database, you may want to clean it up; ensure the expiration of database items is set to a reasonable value and activated via the administrator panel. Admin > Site > Performance > Enable \"Clean up database\" After adjusting these settings, the database cleaning up processes will be initiated according to your configured daily cron job. To review the size of your database, log into MySQL with mysql -p run the following query: SELECT table_schema AS \"Database\" , SUM ( data_length + index_length ) / 1024 / 1024 / 1024 AS \"Size (GB)\" FROM information_schema . TABLES GROUP BY table_schema ; You should see an output like this: +--------------------+----------------+ | Database | Size (GB) | +--------------------+----------------+ | friendica_db | 8.054092407227 | | [..........] | [...........] | +--------------------+----------------+ Finally, you may also want to optimise your database with the following command: mysqloptimize -p friendica-db Going offline # Stop background tasks and put your server in maintenance mode. 1. If you had set up a worker cron job like this */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php run crontab -e and comment out this line. Alternatively if you deploy a worker daemon, disable this instead. 2. Put your server into maintenance mode: bin/console maintenance 1 \"We are currently upgrading our system and will be back soon.\" Dumping DB # Export your database: mysqldump -p friendica_db > friendica_db-$(date +%Y%m%d).sql and possibly compress it. Transferring to new server # Transfer your database and a copy of your configuration file config/local.config.php.copy to your new server installation. Restoring your DB # Import your database on your new server: mysql -p friendica_db < your-friendica_db-file.sql Completing migration # Configuration file # Copy your old server's configuration file to config/local.config.php . Ensure the newly created database credentials are identical to the setting in the configuration file; otherwise update them accordingly. Cron job for worker # Set up the required daily cron job. Run crontab -e and add the following line according to your system specification */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php DNS settings # Adjust your DNS records by pointing them to your new server. Troubleshooting # If you are unable to log in to your newly migrated Friendica installation, check your web server's error and access logs and mysql logs for obvious issues. If still unable to resolve the problem, it's likely an issue with your installation . In this case, you may try to an entirely new Friendica installation on your new server, but use a different FQDN and DNS name. Once you have this up and running, take it offline and purge the database and configuration file and try migrating to this installation.","title":"Migrate"},{"location":"admin/migrate/#migrating-to-a-new-server-installation","text":"","title":"Migrating to a new server installation"},{"location":"admin/migrate/#preparation","text":"","title":"Preparation"},{"location":"admin/migrate/#new-server","text":"Set up your new server as described here ; follow the installation procedure until you have created a database.","title":"New server"},{"location":"admin/migrate/#heads-up-to-users","text":"Inform your users of an upcoming interruption to your service. To ensure data consistency, your server needs to be offline during some steps of the migration processes. You may also find these addons useful for communicating with your users prior to the migration process: * blackout * notifyall","title":"Heads up to users"},{"location":"admin/migrate/#storage","text":"Check your storage backend with bin/console storage list in the root folder. The output should look like this: Sel | Name ----------------------- | Filesystem * | Database If you are not using Database run the following commands: 1. bin/console storage set Database to activate the database backend. 2. bin/console storage move to initiate moving the stored image files. This process may take a long time depending on the size of your storage and your server's capacity. Prior to initiating this process, you may want to check the number of files in the storage with the following command: tree -if -I index.html /path/to/storage/ .","title":"Storage"},{"location":"admin/migrate/#cleaning-up","text":"Before transferring your database, you may want to clean it up; ensure the expiration of database items is set to a reasonable value and activated via the administrator panel. Admin > Site > Performance > Enable \"Clean up database\" After adjusting these settings, the database cleaning up processes will be initiated according to your configured daily cron job. To review the size of your database, log into MySQL with mysql -p run the following query: SELECT table_schema AS \"Database\" , SUM ( data_length + index_length ) / 1024 / 1024 / 1024 AS \"Size (GB)\" FROM information_schema . TABLES GROUP BY table_schema ; You should see an output like this: +--------------------+----------------+ | Database | Size (GB) | +--------------------+----------------+ | friendica_db | 8.054092407227 | | [..........] | [...........] | +--------------------+----------------+ Finally, you may also want to optimise your database with the following command: mysqloptimize -p friendica-db","title":"Cleaning up"},{"location":"admin/migrate/#going-offline","text":"Stop background tasks and put your server in maintenance mode. 1. If you had set up a worker cron job like this */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php run crontab -e and comment out this line. Alternatively if you deploy a worker daemon, disable this instead. 2. Put your server into maintenance mode: bin/console maintenance 1 \"We are currently upgrading our system and will be back soon.\"","title":"Going offline"},{"location":"admin/migrate/#dumping-db","text":"Export your database: mysqldump -p friendica_db > friendica_db-$(date +%Y%m%d).sql and possibly compress it.","title":"Dumping DB"},{"location":"admin/migrate/#transferring-to-new-server","text":"Transfer your database and a copy of your configuration file config/local.config.php.copy to your new server installation.","title":"Transferring to new server"},{"location":"admin/migrate/#restoring-your-db","text":"Import your database on your new server: mysql -p friendica_db < your-friendica_db-file.sql","title":"Restoring your DB"},{"location":"admin/migrate/#completing-migration","text":"","title":"Completing migration"},{"location":"admin/migrate/#configuration-file","text":"Copy your old server's configuration file to config/local.config.php . Ensure the newly created database credentials are identical to the setting in the configuration file; otherwise update them accordingly.","title":"Configuration file"},{"location":"admin/migrate/#cron-job-for-worker","text":"Set up the required daily cron job. Run crontab -e and add the following line according to your system specification */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php","title":"Cron job for worker"},{"location":"admin/migrate/#dns-settings","text":"Adjust your DNS records by pointing them to your new server.","title":"DNS settings"},{"location":"admin/migrate/#troubleshooting","text":"If you are unable to log in to your newly migrated Friendica installation, check your web server's error and access logs and mysql logs for obvious issues. If still unable to resolve the problem, it's likely an issue with your installation . In this case, you may try to an entirely new Friendica installation on your new server, but use a different FQDN and DNS name. Once you have this up and running, take it offline and purge the database and configuration file and try migrating to this installation.","title":"Troubleshooting"},{"location":"admin/tools/","tags":["admin","tools"],"text":"Admin Tools # Friendica Tools # Friendica has a build in command console you can find in the bin directory. The console provides the following commands: cache: Manage node cache config: Edit site config createdoxygen: Generate Doxygen headers dbstructure: Do database updates docbloxerrorchecker: Check the file tree for DocBlox errors extract: Generate translation string file for the Friendica project (deprecated) globalcommunityblock: Block remote profile from interacting with this node globalcommunitysilence: Silence remote profile from global community page archivecontact: Archive a contact when you know that it isn't existing anymore help: Show help about a command, e.g (bin/console help config) autoinstall: Starts automatic installation of friendica based on values from htconfig.php maintenance: Set maintenance mode for this node newpassword: Set a new password for a given user php2po: Generate a messages.po file from a strings.php file po2php: Generate a strings.php file from a messages.po file typo: Checks for parse errors in Friendica files postupdate: Execute pending post update scripts (can last days) storage: Manage storage backend relay: Manage ActivityPub relay servers Please consult bin/console help on the command line interface of your server for details about the commands. 3rd Party Tools # In addition to the tools Friendica includes, some 3rd party tools can make your admin days easier. Fail2ban # Fail2ban is an intrusion prevention framework ( see Wikipedia ) that you can use to forbid access to a server under certain conditions, e.g. 3 failed attempts to log in, for a certain amount of time. The following configuration was provided by Steffen K9 using Debian. You need to adjust the logpath in the jail.local file and the bantime (value is in seconds). In /etc/fail2ban/jail.local create a section for Friendica: [friendica] enabled = true findtime = 300 bantime = 900 filter = friendica port = http,https logpath = /var/log/friend.log logencoding = utf-8 And create a filter definition in /etc/fail2ban/filter.d/friendica.conf : [Definition] failregex = ^.*authenticate\\: failed login attempt.*\\\"ip\\\"\\:\\\"<HOST>\\\".*$ ignoreregex = Additionally, you have to define the number of failed logins before the ban should be activated. This is done either in the global configuration or for each jail separately. You should inform your users about the number of failed login attempts you grant them. Otherwise, you'll get many reports about the server not functioning if the number is too low. Log rotation # If you have activated the logs in Friendica, be aware that they can grow to a significant size. To keep them in control you should add them to the automatic log rotation , e.g. using the logrotate command. In /etc/logrotate.d/ add a file called friendica that contains the configuration. The following will compress /var/log/friendica (assuming this is the location of the log file) on a daily basis and keep 2 days of back-log. /var/log/friendica.log { compress daily rotate 2 }","title":"Tools"},{"location":"admin/tools/#admin-tools","text":"","title":"Admin Tools"},{"location":"admin/tools/#friendica-tools","text":"Friendica has a build in command console you can find in the bin directory. The console provides the following commands: cache: Manage node cache config: Edit site config createdoxygen: Generate Doxygen headers dbstructure: Do database updates docbloxerrorchecker: Check the file tree for DocBlox errors extract: Generate translation string file for the Friendica project (deprecated) globalcommunityblock: Block remote profile from interacting with this node globalcommunitysilence: Silence remote profile from global community page archivecontact: Archive a contact when you know that it isn't existing anymore help: Show help about a command, e.g (bin/console help config) autoinstall: Starts automatic installation of friendica based on values from htconfig.php maintenance: Set maintenance mode for this node newpassword: Set a new password for a given user php2po: Generate a messages.po file from a strings.php file po2php: Generate a strings.php file from a messages.po file typo: Checks for parse errors in Friendica files postupdate: Execute pending post update scripts (can last days) storage: Manage storage backend relay: Manage ActivityPub relay servers Please consult bin/console help on the command line interface of your server for details about the commands.","title":"Friendica Tools"},{"location":"admin/tools/#3rd-party-tools","text":"In addition to the tools Friendica includes, some 3rd party tools can make your admin days easier.","title":"3rd Party Tools"},{"location":"admin/tools/#fail2ban","text":"Fail2ban is an intrusion prevention framework ( see Wikipedia ) that you can use to forbid access to a server under certain conditions, e.g. 3 failed attempts to log in, for a certain amount of time. The following configuration was provided by Steffen K9 using Debian. You need to adjust the logpath in the jail.local file and the bantime (value is in seconds). In /etc/fail2ban/jail.local create a section for Friendica: [friendica] enabled = true findtime = 300 bantime = 900 filter = friendica port = http,https logpath = /var/log/friend.log logencoding = utf-8 And create a filter definition in /etc/fail2ban/filter.d/friendica.conf : [Definition] failregex = ^.*authenticate\\: failed login attempt.*\\\"ip\\\"\\:\\\"<HOST>\\\".*$ ignoreregex = Additionally, you have to define the number of failed logins before the ban should be activated. This is done either in the global configuration or for each jail separately. You should inform your users about the number of failed login attempts you grant them. Otherwise, you'll get many reports about the server not functioning if the number is too low.","title":"Fail2ban"},{"location":"admin/tools/#log-rotation","text":"If you have activated the logs in Friendica, be aware that they can grow to a significant size. To keep them in control you should add them to the automatic log rotation , e.g. using the logrotate command. In /etc/logrotate.d/ add a file called friendica that contains the configuration. The following will compress /var/log/friendica (assuming this is the location of the log file) on a daily basis and keep 2 days of back-log. /var/log/friendica.log { compress daily rotate 2 }","title":"Log rotation"},{"location":"admin/update/","tags":["admin"],"text":"Updating Friendica # Using a Friendica archive # If you installed Friendica in the path/to/friendica folder: Unpack the new Friendica archive in path/to/friendica_new . Copy the following items from path/to/friendica to path/to/friendica_new : config/local.config.php proxy/ The following items only need to be copied if they are located inside your friendica path: your storage folder as set in Admin -> Site -> File Upload -> Storage base path your item cache as set in Admin -> Site -> Performance -> Path to item cache your temp folder as set in Admin -> Site -> Advanced -> Temp path Rename the path/to/friendica folder to path/to/friendica_old . Rename the path/to/friendica_new folder to path/to/friendica . Check your site. Note: it may go into maintenance mode to update the database schema. If everything works, just delete the path/to/friendica_old folder. To update Addons from an archive, simply delete the path/to/friendica/addon and replace it with the provided archive. Using Git # You can get the latest changes at any time with cd path/to/friendica git pull bin/composer.phar install --no-dev The addon tree has to be updated separately like so: cd path/to/friendica/addon git pull For both repositories: The default branch to use is the stable branch, which is the stable version of Friendica. It is updated about four times a year on a fixed schedule. If you want to use and test bleeding edge code please check out the develop branch. The new features and fixes will be merged from develop into stable after a release candidate period before each release. Warning: The develop branch is unstable, and breaks on average once a month for at most 24 hours until a patch is submitted and merged. Be sure to pull frequently if you choose the develop branch. Considerations before upgrading Friendica # MySQL >= 5.7.4 # Starting from MySQL version 5.7.4, the IGNORE keyword in ALTER TABLE statements is ignored. This prevents automatic table deduplication if a UNIQUE index is added to a Friendica table's structure. If a DB update fails for you while creating a UNIQUE index, make sure to manually deduplicate the table before trying the update again. Manual deduplication # There are two main ways of doing it, either by manually removing the duplicates or by recreating the table. Manually removing the duplicates is usually faster if they're not too numerous. To manually remove the duplicates, you need to know the UNIQUE index columns available in database.sql . SELECT GROUP_CONCAT ( id ), < index columns > , count ( * ) as count FROM users GROUP BY < index columns > HAVING count >= 2 ; /* delete or merge duplicate from above query */ ; If there are too many rows to handle manually, you can create a new table with the same structure as the table with duplicates and insert the existing content with INSERT IGNORE. To recreate the table you need to know the table structure available in database.sql . CREATE TABLE < table_name > _new < rest of the CREATE TABLE > ; INSERT IGNORE INTO < table_name > _new SELECT * FROM < table_name > ; DROP TABLE < table_name > ; RENAME TABLE < table_name > _new TO < table_name > ; This method is slower overall, but it is better suited for large numbers of duplicates. Resolving Possible Database Issues Post Upgrading # Foreign Keys # Some updates include the use of foreign keys now that will bump into issues with previous versions, which would sometimes shove bad data into tables, preventing, causing errors such as below. Error 1452 occurred during database update: Cannot add or update a child row: a foreign key constraint fails (`friendica`.`#sql-10ea6_5a6d`, CONSTRAINT `#sql-10ea6_5a6d_ibfk_1` FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`)) ALTER TABLE `thread` ADD FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE; All current known fixes for possible items that can go wrong are as below. DELETE FROM ` item ` WHERE ` owner - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` item ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` notify ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); DELETE FROM ` photo ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` thread ` WHERE ` iid ` NOT IN ( SELECT ` id ` FROM ` item ` ); DELETE FROM ` item ` WHERE ` author - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` diaspora - interaction ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); This all has been compiled as of currently from issue #9746, #9753, and #9878.","title":"Update"},{"location":"admin/update/#updating-friendica","text":"","title":"Updating Friendica"},{"location":"admin/update/#using-a-friendica-archive","text":"If you installed Friendica in the path/to/friendica folder: Unpack the new Friendica archive in path/to/friendica_new . Copy the following items from path/to/friendica to path/to/friendica_new : config/local.config.php proxy/ The following items only need to be copied if they are located inside your friendica path: your storage folder as set in Admin -> Site -> File Upload -> Storage base path your item cache as set in Admin -> Site -> Performance -> Path to item cache your temp folder as set in Admin -> Site -> Advanced -> Temp path Rename the path/to/friendica folder to path/to/friendica_old . Rename the path/to/friendica_new folder to path/to/friendica . Check your site. Note: it may go into maintenance mode to update the database schema. If everything works, just delete the path/to/friendica_old folder. To update Addons from an archive, simply delete the path/to/friendica/addon and replace it with the provided archive.","title":"Using a Friendica archive"},{"location":"admin/update/#using-git","text":"You can get the latest changes at any time with cd path/to/friendica git pull bin/composer.phar install --no-dev The addon tree has to be updated separately like so: cd path/to/friendica/addon git pull For both repositories: The default branch to use is the stable branch, which is the stable version of Friendica. It is updated about four times a year on a fixed schedule. If you want to use and test bleeding edge code please check out the develop branch. The new features and fixes will be merged from develop into stable after a release candidate period before each release. Warning: The develop branch is unstable, and breaks on average once a month for at most 24 hours until a patch is submitted and merged. Be sure to pull frequently if you choose the develop branch.","title":"Using Git"},{"location":"admin/update/#considerations-before-upgrading-friendica","text":"","title":"Considerations before upgrading Friendica"},{"location":"admin/update/#mysql-574","text":"Starting from MySQL version 5.7.4, the IGNORE keyword in ALTER TABLE statements is ignored. This prevents automatic table deduplication if a UNIQUE index is added to a Friendica table's structure. If a DB update fails for you while creating a UNIQUE index, make sure to manually deduplicate the table before trying the update again.","title":"MySQL &gt;= 5.7.4"},{"location":"admin/update/#manual-deduplication","text":"There are two main ways of doing it, either by manually removing the duplicates or by recreating the table. Manually removing the duplicates is usually faster if they're not too numerous. To manually remove the duplicates, you need to know the UNIQUE index columns available in database.sql . SELECT GROUP_CONCAT ( id ), < index columns > , count ( * ) as count FROM users GROUP BY < index columns > HAVING count >= 2 ; /* delete or merge duplicate from above query */ ; If there are too many rows to handle manually, you can create a new table with the same structure as the table with duplicates and insert the existing content with INSERT IGNORE. To recreate the table you need to know the table structure available in database.sql . CREATE TABLE < table_name > _new < rest of the CREATE TABLE > ; INSERT IGNORE INTO < table_name > _new SELECT * FROM < table_name > ; DROP TABLE < table_name > ; RENAME TABLE < table_name > _new TO < table_name > ; This method is slower overall, but it is better suited for large numbers of duplicates.","title":"Manual deduplication"},{"location":"admin/update/#resolving-possible-database-issues-post-upgrading","text":"","title":"Resolving Possible Database Issues Post Upgrading"},{"location":"admin/update/#foreign-keys","text":"Some updates include the use of foreign keys now that will bump into issues with previous versions, which would sometimes shove bad data into tables, preventing, causing errors such as below. Error 1452 occurred during database update: Cannot add or update a child row: a foreign key constraint fails (`friendica`.`#sql-10ea6_5a6d`, CONSTRAINT `#sql-10ea6_5a6d_ibfk_1` FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`)) ALTER TABLE `thread` ADD FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE; All current known fixes for possible items that can go wrong are as below. DELETE FROM ` item ` WHERE ` owner - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` item ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` notify ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); DELETE FROM ` photo ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` thread ` WHERE ` iid ` NOT IN ( SELECT ` id ` FROM ` item ` ); DELETE FROM ` item ` WHERE ` author - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` diaspora - interaction ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); This all has been compiled as of currently from issue #9746, #9753, and #9878.","title":"Foreign Keys"},{"location":"developer/addon-storage-backend/","tags":["addon","developer"],"text":"Friendica Storage Backend Addon development # Storage backends can be added via addons. A storage backend is implemented as a class, and the plugin register the class to make it available to the system. The Storage Backend Class # The class must live in Friendica\\Addon\\youraddonname namespace, where youraddonname the folder name of your addon. There are two different interfaces you need to implement. ICanWriteToStorage # The class must implement Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage interface. All method in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; interface ICanWriteToStorage { public function get ( string $reference ); public function put ( string $data , string $reference = '' ); public function delete ( string $reference ); public function __toString (); public static function getName (); } get(string $reference) returns data pointed by $reference put(string $data, string $reference) saves data in $data to position $reference , or a new position if $reference is empty. delete(string $reference) delete data pointed by $reference ICanConfigureStorage # Each storage backend can have options the admin can set in admin page. To make the options possible, you need to implement the Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage interface. All methods in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; interface ICanConfigureStorage { public function getOptions (); public function saveOptions ( array $data ); } getOptions() returns an array with details about each option to build the interface. saveOptions(array $data) get $data from admin page, validate it and save it. The array returned by getOptions() is defined as: [ 'option1name' => [ ..info.. ], 'option2name' => [ ..info.. ], ... ] An empty array can be returned if backend doesn't have any options. The info array for each option is defined as: [ 'type', define the field used in form, and the type of data. one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea' 'label', Translatable label of the field. This label will be shown in admin page value, Current value of the option 'help text', Translatable description for the field. Will be shown in admin page extra data Optional. Depends on which 'type' this option is: 'select': array [ value => label ] of choices 'intcheckbox': value of input element 'select_raw': prebuild html string of <option > tags Each label should be translatable ]; See doxygen documentation of IWritableStorage interface for details about each method. Register a storage backend class # Each backend must be registered in the system when the plugin is installed, to be aviable. DI::facStorage()->register(string $class) is used to register the backend class. When the plugin is uninstalled, registered backends must be unregistered using DI::facStorage()->unregister(string $class) . You have to register a new hook in your addon, listening on storage_instance(App $a, array $data) . In case $data['name'] is your storage class name, you have to instance a new instance of your Friendica\\Core\\Storage\\Capability\\ICanReadFromStorage class. Set the instance of your class as $data['storage'] to pass it back to the backend. This is necessary because it isn't always clear, if you need further construction arguments. Adding tests # Currently testing is limited to core Friendica only, this shows theoretically how tests should work in the future Each new Storage class should be added to the test-environment at Storage Tests . Add a new test class which's naming convention is StorageClassTest , which extend the StorageTest in the same directory. Override the two necessary instances: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; abstract class StorageTest { // returns an instance of your newly created storage class abstract protected function getInstance(); // Assertion for the option array you return for your new StorageClass abstract protected function assertOption(ICanWriteToStorage $storage); } Exception handling # There are two intended types of exceptions for storages ReferenceStorageExecption # This storage exception should be used in case the caller tries to use an invalid references. This could happen in case the caller tries to delete or update an unknown reference. The implementation of the storage backend must not ignore invalid references. Avoid throwing the common StorageExecption instead of the ReferenceStorageException at this particular situation! StorageException # This is the common exception in case unexpected errors happen using the storage backend. If there's a predecessor to this exception (e.g. you caught an exception and are throwing this execption), you should add the predecessor for transparency reasons. Example: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; class ExampleStorage implements ICanWriteToStorage { public function get(string $reference) : string { try { throw new Exception('a real bad exception'); } catch (Exception $exception) { throw new \\Friendica\\Core\\Storage\\Exception\\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception); } } } Example # Here is a hypothetical addon which register a useless storage backend. Let's call it samplestorage . This backend will discard all data we try to save and will return always the same image when we ask for some data. The image returned can be set by the administrator in admin page. First, the backend class. The file will be addon/samplestorage/SampleStorageBackend.php : <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackend implements ICanWriteToStorage { const NAME = 'Sample Storage' ; /** @var string */ private $filename ; /** * SampleStorageBackend constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( string $filename ) { $this -> filename = $filename ; } public function get ( string $reference ) { // we return always the same image data. Which file we load is defined by // a config key return file_get_contents ( $this -> filename ); } public function put ( string $data , string $reference = '' ) { if ( $reference === '' ) { $reference = 'sample' ; } // we don't save $data ! return $reference ; } public function delete ( string $reference ) { // we pretend to delete the data return true ; } public function __toString () { return self :: NAME ; } public static function getName () { return self :: NAME ; } } <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackendConfig implements ICanConfigureStorage { /** @var \\Friendica\\Core\\Config\\Capability\\IManageConfigValues */ private $config ; /** @var L10n */ private $l10n ; /** * SampleStorageBackendConfig constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( IManageConfigValues $config , L10n $l10n ) { $this -> config = $config ; $this -> l10n = $l10n ; } public function getFileName () : string { return $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); } public function getOptions () { $filename = $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); return [ 'filename' => [ 'input' , // will use a simple text input $this -> l10n -> t ( 'The file to return' ), // the label $filename , // the current value $this -> l10n -> t ( 'Enter the path to a file' ), // the help text // no extra data for 'input' type.. ], ]; } public function saveOptions ( array $data ) { // the keys in $data are the same keys we defined in getOptions() $newfilename = trim ( $data [ 'filename' ]); // this function should always validate the data. // in this example we check if file exists if ( ! file_exists ( $newfilename )) { // in case of error we return an array with // ['optionname' => 'error message'] return [ 'filename' => 'The file doesn\\'t exists' ]; } $this -> config -> set ( 'storage' , 'samplestorage' , $newfilename ); // no errors, return empty array return []; } } Now the plugin main file. Here we register and unregister the backend class. The file is addon/samplestorage/samplestorage.php <?php /** * Name: Sample Storage Addon * Description: A sample addon which implements an unusefull storage backend * Version: 1.0.0 * Author: Alice <https://alice.social/~alice> */ use Friendica\\Addon\\samplestorage\\SampleStorageBackend ; use Friendica\\Addon\\samplestorage\\SampleStorageBackendConfig ; use Friendica\\DI ; function samplestorage_install () { Hook :: register ( 'storage_instance' , __FILE__ , 'samplestorage_storage_instance' ); Hook :: register ( 'storage_config' , __FILE__ , 'samplestorage_storage_config' ); DI :: storageManager () -> register ( SampleStorageBackend :: class ); } function samplestorage_storage_uninstall () { DI :: storageManager () -> unregister ( SampleStorageBackend :: class ); } function samplestorage_storage_instance ( App $a , array & $data ) { $config = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); $data [ 'storage' ] = new SampleStorageBackendConfig ( $config -> getFileName ()); } function samplestorage_storage_config ( App $a , array & $data ) { $data [ 'storage_config' ] = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); } **Theoretically - until tests for Addons are enabled too - create a test class with the name addon/tests/SampleStorageTest.php : use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; use Friendica\\Test\\src\\Core\\Storage\\StorageTest; class SampleStorageTest extends StorageTest { // returns an instance of your newly created storage class protected function getInstance() { // create a new SampleStorageBackend instance with all it's dependencies // Have a look at DatabaseStorageTest or FilesystemStorageTest for further insights return new SampleStorageBackend(); } // Assertion for the option array you return for your new StorageClass protected function assertOption(ICanWriteToStorage $storage) { $this->assertEquals([ 'filename' => [ 'input', 'The file to return', 'sample.jpg', 'Enter the path to a file' ], ], $storage->getOptions()); } }","title":"Addon Storage Backend"},{"location":"developer/addon-storage-backend/#friendica-storage-backend-addon-development","text":"Storage backends can be added via addons. A storage backend is implemented as a class, and the plugin register the class to make it available to the system.","title":"Friendica Storage Backend Addon development"},{"location":"developer/addon-storage-backend/#the-storage-backend-class","text":"The class must live in Friendica\\Addon\\youraddonname namespace, where youraddonname the folder name of your addon. There are two different interfaces you need to implement.","title":"The Storage Backend Class"},{"location":"developer/addon-storage-backend/#icanwritetostorage","text":"The class must implement Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage interface. All method in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; interface ICanWriteToStorage { public function get ( string $reference ); public function put ( string $data , string $reference = '' ); public function delete ( string $reference ); public function __toString (); public static function getName (); } get(string $reference) returns data pointed by $reference put(string $data, string $reference) saves data in $data to position $reference , or a new position if $reference is empty. delete(string $reference) delete data pointed by $reference","title":"ICanWriteToStorage"},{"location":"developer/addon-storage-backend/#icanconfigurestorage","text":"Each storage backend can have options the admin can set in admin page. To make the options possible, you need to implement the Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage interface. All methods in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; interface ICanConfigureStorage { public function getOptions (); public function saveOptions ( array $data ); } getOptions() returns an array with details about each option to build the interface. saveOptions(array $data) get $data from admin page, validate it and save it. The array returned by getOptions() is defined as: [ 'option1name' => [ ..info.. ], 'option2name' => [ ..info.. ], ... ] An empty array can be returned if backend doesn't have any options. The info array for each option is defined as: [ 'type', define the field used in form, and the type of data. one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea' 'label', Translatable label of the field. This label will be shown in admin page value, Current value of the option 'help text', Translatable description for the field. Will be shown in admin page extra data Optional. Depends on which 'type' this option is: 'select': array [ value => label ] of choices 'intcheckbox': value of input element 'select_raw': prebuild html string of <option > tags Each label should be translatable ]; See doxygen documentation of IWritableStorage interface for details about each method.","title":"ICanConfigureStorage"},{"location":"developer/addon-storage-backend/#register-a-storage-backend-class","text":"Each backend must be registered in the system when the plugin is installed, to be aviable. DI::facStorage()->register(string $class) is used to register the backend class. When the plugin is uninstalled, registered backends must be unregistered using DI::facStorage()->unregister(string $class) . You have to register a new hook in your addon, listening on storage_instance(App $a, array $data) . In case $data['name'] is your storage class name, you have to instance a new instance of your Friendica\\Core\\Storage\\Capability\\ICanReadFromStorage class. Set the instance of your class as $data['storage'] to pass it back to the backend. This is necessary because it isn't always clear, if you need further construction arguments.","title":"Register a storage backend class"},{"location":"developer/addon-storage-backend/#adding-tests","text":"Currently testing is limited to core Friendica only, this shows theoretically how tests should work in the future Each new Storage class should be added to the test-environment at Storage Tests . Add a new test class which's naming convention is StorageClassTest , which extend the StorageTest in the same directory. Override the two necessary instances: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; abstract class StorageTest { // returns an instance of your newly created storage class abstract protected function getInstance(); // Assertion for the option array you return for your new StorageClass abstract protected function assertOption(ICanWriteToStorage $storage); }","title":"Adding tests"},{"location":"developer/addon-storage-backend/#exception-handling","text":"There are two intended types of exceptions for storages","title":"Exception handling"},{"location":"developer/addon-storage-backend/#referencestorageexecption","text":"This storage exception should be used in case the caller tries to use an invalid references. This could happen in case the caller tries to delete or update an unknown reference. The implementation of the storage backend must not ignore invalid references. Avoid throwing the common StorageExecption instead of the ReferenceStorageException at this particular situation!","title":"ReferenceStorageExecption"},{"location":"developer/addon-storage-backend/#storageexception","text":"This is the common exception in case unexpected errors happen using the storage backend. If there's a predecessor to this exception (e.g. you caught an exception and are throwing this execption), you should add the predecessor for transparency reasons. Example: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; class ExampleStorage implements ICanWriteToStorage { public function get(string $reference) : string { try { throw new Exception('a real bad exception'); } catch (Exception $exception) { throw new \\Friendica\\Core\\Storage\\Exception\\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception); } } }","title":"StorageException"},{"location":"developer/addon-storage-backend/#example","text":"Here is a hypothetical addon which register a useless storage backend. Let's call it samplestorage . This backend will discard all data we try to save and will return always the same image when we ask for some data. The image returned can be set by the administrator in admin page. First, the backend class. The file will be addon/samplestorage/SampleStorageBackend.php : <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackend implements ICanWriteToStorage { const NAME = 'Sample Storage' ; /** @var string */ private $filename ; /** * SampleStorageBackend constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( string $filename ) { $this -> filename = $filename ; } public function get ( string $reference ) { // we return always the same image data. Which file we load is defined by // a config key return file_get_contents ( $this -> filename ); } public function put ( string $data , string $reference = '' ) { if ( $reference === '' ) { $reference = 'sample' ; } // we don't save $data ! return $reference ; } public function delete ( string $reference ) { // we pretend to delete the data return true ; } public function __toString () { return self :: NAME ; } public static function getName () { return self :: NAME ; } } <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackendConfig implements ICanConfigureStorage { /** @var \\Friendica\\Core\\Config\\Capability\\IManageConfigValues */ private $config ; /** @var L10n */ private $l10n ; /** * SampleStorageBackendConfig constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( IManageConfigValues $config , L10n $l10n ) { $this -> config = $config ; $this -> l10n = $l10n ; } public function getFileName () : string { return $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); } public function getOptions () { $filename = $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); return [ 'filename' => [ 'input' , // will use a simple text input $this -> l10n -> t ( 'The file to return' ), // the label $filename , // the current value $this -> l10n -> t ( 'Enter the path to a file' ), // the help text // no extra data for 'input' type.. ], ]; } public function saveOptions ( array $data ) { // the keys in $data are the same keys we defined in getOptions() $newfilename = trim ( $data [ 'filename' ]); // this function should always validate the data. // in this example we check if file exists if ( ! file_exists ( $newfilename )) { // in case of error we return an array with // ['optionname' => 'error message'] return [ 'filename' => 'The file doesn\\'t exists' ]; } $this -> config -> set ( 'storage' , 'samplestorage' , $newfilename ); // no errors, return empty array return []; } } Now the plugin main file. Here we register and unregister the backend class. The file is addon/samplestorage/samplestorage.php <?php /** * Name: Sample Storage Addon * Description: A sample addon which implements an unusefull storage backend * Version: 1.0.0 * Author: Alice <https://alice.social/~alice> */ use Friendica\\Addon\\samplestorage\\SampleStorageBackend ; use Friendica\\Addon\\samplestorage\\SampleStorageBackendConfig ; use Friendica\\DI ; function samplestorage_install () { Hook :: register ( 'storage_instance' , __FILE__ , 'samplestorage_storage_instance' ); Hook :: register ( 'storage_config' , __FILE__ , 'samplestorage_storage_config' ); DI :: storageManager () -> register ( SampleStorageBackend :: class ); } function samplestorage_storage_uninstall () { DI :: storageManager () -> unregister ( SampleStorageBackend :: class ); } function samplestorage_storage_instance ( App $a , array & $data ) { $config = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); $data [ 'storage' ] = new SampleStorageBackendConfig ( $config -> getFileName ()); } function samplestorage_storage_config ( App $a , array & $data ) { $data [ 'storage_config' ] = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); } **Theoretically - until tests for Addons are enabled too - create a test class with the name addon/tests/SampleStorageTest.php : use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; use Friendica\\Test\\src\\Core\\Storage\\StorageTest; class SampleStorageTest extends StorageTest { // returns an instance of your newly created storage class protected function getInstance() { // create a new SampleStorageBackend instance with all it's dependencies // Have a look at DatabaseStorageTest or FilesystemStorageTest for further insights return new SampleStorageBackend(); } // Assertion for the option array you return for your new StorageClass protected function assertOption(ICanWriteToStorage $storage) { $this->assertEquals([ 'filename' => [ 'input', 'The file to return', 'sample.jpg', 'Enter the path to a file' ], ], $storage->getOptions()); } }","title":"Example"},{"location":"developer/autoloader/","tags":["developer","composer"],"text":"Autoloader with Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Using Composer A quick introduction to class auto-loading # The autoloader dynamically includes the file defining a class when it is first referenced, either by instantiating an object or simply making sure that it is available, without the need to explicitly use \"require_once\". Once it is set up you don't have to directly use it, you can directly use any class that is covered by the autoloader (currently vendor and src ) Under the hood, Composer registers a callback with spl_autoload_register() that receives a class name as an argument and includes the corresponding class definition file. For more info about PHP autoloading, please refer to the official PHP documentation . Example # Let's say you have a PHP file in src/ that define a very useful class: // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager { public function getAll () { ... } public function getByID ( $id ) { ... } } The class ItemsManager has been declared in the Friendica namespace. Namespaces are useful to keep classes separated and avoid names conflicts (could be that a library you want to use also defines a class named ItemsManager , but as long as it is in another namespace, you don't have any problem) Let's say now that you need to load some items in a view, maybe in a fictional mod/network.php . In order for the Composer autoloader to work, it must first be included. In Friendica this is already done at the top of boot.php , with require_once('vendor/autoload.php'); . The code will be something like: // mod/network.php <?php use Friendica\\App ; function network_content ( App $a ) { $itemsmanager = new \\Friendica\\ItemsManager (); $items = $itemsmanager -> getAll (); // pass $items to template // return result } That's a quite simple example, but look: no require() ! If you need to use a class, you can simply use it, and you don't need to do anything else. Going further: now we have a bunch of *Manager classes that cause some code duplication. Let's define a BaseManager class, where we move all common code between all managers: // src/BaseManager.php <?php namespace Friendica ; class BaseManager { public function thatFunctionEveryManagerUses () { ... } } and then let's change the ItemsManager class to use this code // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager extends BaseManager { public function getAll () { ... } public function getByID ( $id ) { ... } } Even though we didn't explicitly include the src/BaseManager.php file, the autoloader will when this class is first defined, because it is referenced as a parent class. It works with the \"BaseManager\" example here, and it works when we need to call static methods: // src/Dfrn.php <?php namespace Friendica ; class Dfrn { public static function mail ( $item , $owner ) { ... } } // mod/mail.php <?php mail_post ( $a ){ ... Friendica\\Protocol\\DFRN :: mail ( $item , $owner ); ... } If your code is in same namespace as the class you need, you don't need to prepend it: // include/delivery.php <?php namespace Friendica ; use Friendica\\Protocol\\DFRN ; // this is the same content of current include/delivery.php, // but has been declared to be in \"Friendica\" namespace [ ... ] switch ( $contact [ 'network' ]) { case NETWORK_DFRN : if ( $mail ) { $item [ 'body' ] = ... $atom = DFRN :: mail ( $item , $owner ); } elseif ( $fsuggest ) { $atom = DFRN :: fsuggest ( $item , $owner ); q ( \"DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1\" , intval ( $item [ 'id' ])); } elseif ( $relocate ) $atom = DFRN :: relocate ( $owner , $uid ); [ ... ] This is the current code of include/delivery.php , and since the code is declared to be in the \"Friendica\" namespace, you don't need to write it when you need to use the \"Dfrn\" class. But if you want to use classes from another library, you need to use the full namespace, e.g. // src/Diaspora.php <?php namespace Friendica ; class Diaspora { public function md2bbcode () { $html = \\Michelf\\MarkdownExtra :: defaultTransform ( $text ); } } if you use that class in many places of the code, and you don't want to write the full path to the class every time, you can use the \"use\" PHP keyword // src/Diaspora.php <?php namespace Friendica ; use \\Michelf\\MarkdownExtra ; class Diaspora { public function md2bbcode () { $html = MarkdownExtra :: defaultTransform ( $text ); } } Note that namespaces are like paths in filesystem, separated by \"\\\", with the first \"\\\" being the global scope. You can go deeper if you want to, like: // src/Network/Dfrn.php <?php namespace Friendica\\Network ; class Dfrn { } Please note that the location of the file defining the class must be placed in the appropriate sub-folders of src if the namespace isn't plain Friendica . or // src/Dba/Mysql <?php namespace Friendica\\Dba ; class Mysql { } So you can think of namespaces as folders in a Unix file system, with global scope as the root (\"\\\"). Related # Using Composer How To Move Classes to src","title":"Autoloader"},{"location":"developer/autoloader/#autoloader-with-composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Using Composer","title":"Autoloader with Composer"},{"location":"developer/autoloader/#a-quick-introduction-to-class-auto-loading","text":"The autoloader dynamically includes the file defining a class when it is first referenced, either by instantiating an object or simply making sure that it is available, without the need to explicitly use \"require_once\". Once it is set up you don't have to directly use it, you can directly use any class that is covered by the autoloader (currently vendor and src ) Under the hood, Composer registers a callback with spl_autoload_register() that receives a class name as an argument and includes the corresponding class definition file. For more info about PHP autoloading, please refer to the official PHP documentation .","title":"A quick introduction to class auto-loading"},{"location":"developer/autoloader/#example","text":"Let's say you have a PHP file in src/ that define a very useful class: // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager { public function getAll () { ... } public function getByID ( $id ) { ... } } The class ItemsManager has been declared in the Friendica namespace. Namespaces are useful to keep classes separated and avoid names conflicts (could be that a library you want to use also defines a class named ItemsManager , but as long as it is in another namespace, you don't have any problem) Let's say now that you need to load some items in a view, maybe in a fictional mod/network.php . In order for the Composer autoloader to work, it must first be included. In Friendica this is already done at the top of boot.php , with require_once('vendor/autoload.php'); . The code will be something like: // mod/network.php <?php use Friendica\\App ; function network_content ( App $a ) { $itemsmanager = new \\Friendica\\ItemsManager (); $items = $itemsmanager -> getAll (); // pass $items to template // return result } That's a quite simple example, but look: no require() ! If you need to use a class, you can simply use it, and you don't need to do anything else. Going further: now we have a bunch of *Manager classes that cause some code duplication. Let's define a BaseManager class, where we move all common code between all managers: // src/BaseManager.php <?php namespace Friendica ; class BaseManager { public function thatFunctionEveryManagerUses () { ... } } and then let's change the ItemsManager class to use this code // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager extends BaseManager { public function getAll () { ... } public function getByID ( $id ) { ... } } Even though we didn't explicitly include the src/BaseManager.php file, the autoloader will when this class is first defined, because it is referenced as a parent class. It works with the \"BaseManager\" example here, and it works when we need to call static methods: // src/Dfrn.php <?php namespace Friendica ; class Dfrn { public static function mail ( $item , $owner ) { ... } } // mod/mail.php <?php mail_post ( $a ){ ... Friendica\\Protocol\\DFRN :: mail ( $item , $owner ); ... } If your code is in same namespace as the class you need, you don't need to prepend it: // include/delivery.php <?php namespace Friendica ; use Friendica\\Protocol\\DFRN ; // this is the same content of current include/delivery.php, // but has been declared to be in \"Friendica\" namespace [ ... ] switch ( $contact [ 'network' ]) { case NETWORK_DFRN : if ( $mail ) { $item [ 'body' ] = ... $atom = DFRN :: mail ( $item , $owner ); } elseif ( $fsuggest ) { $atom = DFRN :: fsuggest ( $item , $owner ); q ( \"DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1\" , intval ( $item [ 'id' ])); } elseif ( $relocate ) $atom = DFRN :: relocate ( $owner , $uid ); [ ... ] This is the current code of include/delivery.php , and since the code is declared to be in the \"Friendica\" namespace, you don't need to write it when you need to use the \"Dfrn\" class. But if you want to use classes from another library, you need to use the full namespace, e.g. // src/Diaspora.php <?php namespace Friendica ; class Diaspora { public function md2bbcode () { $html = \\Michelf\\MarkdownExtra :: defaultTransform ( $text ); } } if you use that class in many places of the code, and you don't want to write the full path to the class every time, you can use the \"use\" PHP keyword // src/Diaspora.php <?php namespace Friendica ; use \\Michelf\\MarkdownExtra ; class Diaspora { public function md2bbcode () { $html = MarkdownExtra :: defaultTransform ( $text ); } } Note that namespaces are like paths in filesystem, separated by \"\\\", with the first \"\\\" being the global scope. You can go deeper if you want to, like: // src/Network/Dfrn.php <?php namespace Friendica\\Network ; class Dfrn { } Please note that the location of the file defining the class must be placed in the appropriate sub-folders of src if the namespace isn't plain Friendica . or // src/Dba/Mysql <?php namespace Friendica\\Dba ; class Mysql { } So you can think of namespaces as folders in a Unix file system, with global scope as the root (\"\\\").","title":"Example"},{"location":"developer/autoloader/#related","text":"Using Composer How To Move Classes to src","title":"Related"},{"location":"developer/composer/","tags":["developer","composer"],"text":"Using Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Class autoloading How to use Composer # If you don't have Composer installed on your system, Friendica ships with a copy of it at bin/composer.phar . For the purpose of this help, all examples will use this path to run Composer commands, however feel free to replace them with your own way of calling Composer. Composer requires PHP CLI and the following examples assume it's available system-wide. Installing/Updating Friendica # From Archive # If you just unpacked a Friendica release archive, you don't have to use Composer at all, all the required libraries are already bundled in the archive. Installing with Git # If you prefer to use git , you will have to run Composer to fetch the required libraries and build the autoloader before you can run Friendica. Here are the typical commands you will have to run to do so: ~> git clone https://github.com/friendica/friendica.git friendica ~/friendica> cd friendica ~/friendica> bin/composer.phar install That's it! Composer will take care of fetching all the required libraries in the vendor folder and build the autoloader to make those libraries available to Friendica. Updating with Git # Updating Friendica to the current stable or the latest develop version is easy with Git, just remember to run Composer after every branch pull. ~> cd friendica ~/friendica> git pull ~/friendica> bin/composer.phar install And that's it. If any library used by Friendica has been upgraded, Composer will fetch the version currently used by Friendica and refresh the autoloader to ensure the best performances. Developing Friendica # First, thanks for contributing to Friendica! Composer is meant to be used by developers to maintain third-party libraries required by Friendica. If you don't need to use any third-party library, then you don't need to use Composer beyond what is above to install/update Friendica. Adding a third-party library to Friendica # Does your shiny new Addon need to rely on a third-party library not required by Friendica yet? First, this library should be available on Packagist so that Composer knows how to fetch it directly just by mentioning its name in composer.json . This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version. Here's a simplified version of the one we currently use on Friendica: { \"name\" : \"friendica/friendica\" , \"description\" : \"A decentralized social network part of The Federation\" , \"type\" : \"project\" , [ ... ] \"require\" : { \"ezyang/htmlpurifier\" : \"~4.7.0\" , \"mobiledetect/mobiledetectlib\" : \"2.8.*\" }, [ ... ] } The important part is under the require key, this is a list of all the libraries Friendica may need to run. As you can see, at the moment we only require two, HTMLPurifier and MobileDetect. Each library has a different target version, and per Composer documentation about version constraints , this means that: We will update HTMLPurifier up to version 4.8.0 excluded We will update MobileDetect up to version 2.9.0 excluded There are other operators you can use to allow Composer to update the package up to the next major version excluded. Or you can specify the exact version of the library if you code requires it, and Composer will never update it, although it isn't recommended. To add a library, just add its Packagist identifier to the require list and set a target version string. Then you should run bin/composer.phar update to add it to your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Updating an existing dependency # If a package needs to be updated, whether to the next minor version or to the next major version provided you changed the adequate code in Friendica, simply edit composer.json to update the target version string of the relevant library. Then you should run bin/composer.phar update to update it in your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Please note that you should commit both composer.json and composer.lock with your work every time you make a change to the former. Composer FAQ # I used the composer command and got a warning about not to run it as root. # See https://getcomposer.org/root . Composer should be run as the web server user, usually www-data with Apache or http with nginx. If you can't switch to the web server user using su - [web user] , you can directly run the Composer command with sudo -u [web user] . Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer # This is because sudo doesn't always change the HOME environment variable, which means that the command is run as the web server user but the system still uses root home directory. However, you can temporarily change environment variable for the execution of a single command. For Composer, this would be: $> COMPOSER_HOME = /var/tmp/composer sudo -u [ web user ] bin/composer.phar [ mode ] Related # Class autoloading How To Move Classes to src","title":"Composer"},{"location":"developer/composer/#using-composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Class autoloading","title":"Using Composer"},{"location":"developer/composer/#how-to-use-composer","text":"If you don't have Composer installed on your system, Friendica ships with a copy of it at bin/composer.phar . For the purpose of this help, all examples will use this path to run Composer commands, however feel free to replace them with your own way of calling Composer. Composer requires PHP CLI and the following examples assume it's available system-wide.","title":"How to use Composer"},{"location":"developer/composer/#installingupdating-friendica","text":"","title":"Installing/Updating Friendica"},{"location":"developer/composer/#from-archive","text":"If you just unpacked a Friendica release archive, you don't have to use Composer at all, all the required libraries are already bundled in the archive.","title":"From Archive"},{"location":"developer/composer/#installing-with-git","text":"If you prefer to use git , you will have to run Composer to fetch the required libraries and build the autoloader before you can run Friendica. Here are the typical commands you will have to run to do so: ~> git clone https://github.com/friendica/friendica.git friendica ~/friendica> cd friendica ~/friendica> bin/composer.phar install That's it! Composer will take care of fetching all the required libraries in the vendor folder and build the autoloader to make those libraries available to Friendica.","title":"Installing with Git"},{"location":"developer/composer/#updating-with-git","text":"Updating Friendica to the current stable or the latest develop version is easy with Git, just remember to run Composer after every branch pull. ~> cd friendica ~/friendica> git pull ~/friendica> bin/composer.phar install And that's it. If any library used by Friendica has been upgraded, Composer will fetch the version currently used by Friendica and refresh the autoloader to ensure the best performances.","title":"Updating with Git"},{"location":"developer/composer/#developing-friendica","text":"First, thanks for contributing to Friendica! Composer is meant to be used by developers to maintain third-party libraries required by Friendica. If you don't need to use any third-party library, then you don't need to use Composer beyond what is above to install/update Friendica.","title":"Developing Friendica"},{"location":"developer/composer/#adding-a-third-party-library-to-friendica","text":"Does your shiny new Addon need to rely on a third-party library not required by Friendica yet? First, this library should be available on Packagist so that Composer knows how to fetch it directly just by mentioning its name in composer.json . This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version. Here's a simplified version of the one we currently use on Friendica: { \"name\" : \"friendica/friendica\" , \"description\" : \"A decentralized social network part of The Federation\" , \"type\" : \"project\" , [ ... ] \"require\" : { \"ezyang/htmlpurifier\" : \"~4.7.0\" , \"mobiledetect/mobiledetectlib\" : \"2.8.*\" }, [ ... ] } The important part is under the require key, this is a list of all the libraries Friendica may need to run. As you can see, at the moment we only require two, HTMLPurifier and MobileDetect. Each library has a different target version, and per Composer documentation about version constraints , this means that: We will update HTMLPurifier up to version 4.8.0 excluded We will update MobileDetect up to version 2.9.0 excluded There are other operators you can use to allow Composer to update the package up to the next major version excluded. Or you can specify the exact version of the library if you code requires it, and Composer will never update it, although it isn't recommended. To add a library, just add its Packagist identifier to the require list and set a target version string. Then you should run bin/composer.phar update to add it to your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies.","title":"Adding a third-party library to Friendica"},{"location":"developer/composer/#updating-an-existing-dependency","text":"If a package needs to be updated, whether to the next minor version or to the next major version provided you changed the adequate code in Friendica, simply edit composer.json to update the target version string of the relevant library. Then you should run bin/composer.phar update to update it in your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Please note that you should commit both composer.json and composer.lock with your work every time you make a change to the former.","title":"Updating an existing dependency"},{"location":"developer/composer/#composer-faq","text":"","title":"Composer FAQ"},{"location":"developer/composer/#i-used-the-composer-command-and-got-a-warning-about-not-to-run-it-as-root","text":"See https://getcomposer.org/root . Composer should be run as the web server user, usually www-data with Apache or http with nginx. If you can't switch to the web server user using su - [web user] , you can directly run the Composer command with sudo -u [web user] .","title":"I used the composer command and got a warning about not to run it as root."},{"location":"developer/composer/#running-composer-with-sudo-complains-about-not-being-able-to-create-the-composer-cache-directory-in-rootcomposer","text":"This is because sudo doesn't always change the HOME environment variable, which means that the command is run as the web server user but the system still uses root home directory. However, you can temporarily change environment variable for the execution of a single command. For Composer, this would be: $> COMPOSER_HOME = /var/tmp/composer sudo -u [ web user ] bin/composer.phar [ mode ]","title":"Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer"},{"location":"developer/composer/#related","text":"Class autoloading How To Move Classes to src","title":"Related"},{"location":"developer/domain-driven-design/","tags":["developer","pattern"],"text":"Domain-Driven-Design # Friendica uses class structures inspired by Domain-Driven-Design programming patterns. This page is meant to explain what it means in practical terms for Friendica development. Inspiration # https://designpatternsphp.readthedocs.io/en/latest/Structural/DependencyInjection/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html https://designpatternsphp.readthedocs.io/en/latest/More/Repository/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/FactoryMethod/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/Prototype/README.html Core concepts # Models and Collections # Instead of anonymous arrays of database field values, we have Models and collections to take full advantage of PHP type hints. Before: <?php function doSomething ( array $intros ) { foreach ( $intros as $intro ) { $introId = $intro [ 'id' ]; } } $intros = \\Friendica\\Database\\DBA :: selectToArray ( 'intros' , [], [ 'uid' => local_user ()]); doSomething ( $intros ); After: <?php function doSomething ( \\Friendica\\Contact\\Introductions\\Collection\\Introductions $intros ) { foreach ( $intros as $intro ) { /** @var $intro \\Friendica\\Contact\\Introductions\\Entity\\Introduction */ $introId = $intro -> id ; } } /** @var $intros \\Friendica\\Contact\\Introductions\\Collection\\Introductions */ $intros = \\Friendica\\DI :: intro () -> selecForUser ( local_user ()); doSomething ( $intros ); Dependency Injection # Under this concept, we want class objects to carry with them the dependencies they will use. Instead of calling global/static function/methods, objects use their own class members. Before: <?php class Model { public $id ; function save () { return \\Friendica\\Database\\DBA :: update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } After: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } The main advantage is testability. Another one is avoiding dependency circles and avoid implicit initializing. In the first example the method save() has to be tested with the DBA::update() method, which may or may not have dependencies itself. In the second example we can mock \\Friendica\\Database\\Database , e.g. overload the class by replacing its methods by placeholders, which allows us to test only Model::save() and nothing else implicitly. The main drawback is lengthy constructors for dependency-heavy classes. To alleviate this issue we are using DiCe to simplify the instantiation of the higher level objects Friendica uses. We also added a convenience factory named \\Friendica\\DI that creates some of the most common objects used in modules. Factories # Since we added a bunch of parameters to class constructors, instantiating objects has become cumbersome. To keep it simple, we are using Factories. Factories are classes used to generate other objects, centralizing the dependencies required in their constructor. Factories encapsulate more or less complex creation of objects and create them redundancy free. Before: <?php $model = new Model ( \\Friendica\\DI :: dba ()); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); Here, DI::factory() returns an instance of Factory that can then be used to create a Model object without having to care about its dependencies. Repositories # Last building block of our code architecture, repositories are meant as the interface between models and how they are stored. In Friendica they are stored in a relational database but repositories allow models not to have to care about it. Repositories also act as factories for the Model they are managing. Before: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Model { public $id ; } class Repository extends Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } public function save ( Model $model ) { return $this -> dba -> update ( 'table' , get_object_vars ( $model ), [ 'id' => $model -> id ]); } } $model = \\Friendica\\DI :: repository () -> create (); $model -> id = 1 ; $model -> key = 'value' ; \\Friendica\\DI :: repository () -> save ( $model );","title":"DDD"},{"location":"developer/domain-driven-design/#domain-driven-design","text":"Friendica uses class structures inspired by Domain-Driven-Design programming patterns. This page is meant to explain what it means in practical terms for Friendica development.","title":"Domain-Driven-Design"},{"location":"developer/domain-driven-design/#inspiration","text":"https://designpatternsphp.readthedocs.io/en/latest/Structural/DependencyInjection/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html https://designpatternsphp.readthedocs.io/en/latest/More/Repository/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/FactoryMethod/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/Prototype/README.html","title":"Inspiration"},{"location":"developer/domain-driven-design/#core-concepts","text":"","title":"Core concepts"},{"location":"developer/domain-driven-design/#models-and-collections","text":"Instead of anonymous arrays of database field values, we have Models and collections to take full advantage of PHP type hints. Before: <?php function doSomething ( array $intros ) { foreach ( $intros as $intro ) { $introId = $intro [ 'id' ]; } } $intros = \\Friendica\\Database\\DBA :: selectToArray ( 'intros' , [], [ 'uid' => local_user ()]); doSomething ( $intros ); After: <?php function doSomething ( \\Friendica\\Contact\\Introductions\\Collection\\Introductions $intros ) { foreach ( $intros as $intro ) { /** @var $intro \\Friendica\\Contact\\Introductions\\Entity\\Introduction */ $introId = $intro -> id ; } } /** @var $intros \\Friendica\\Contact\\Introductions\\Collection\\Introductions */ $intros = \\Friendica\\DI :: intro () -> selecForUser ( local_user ()); doSomething ( $intros );","title":"Models and Collections"},{"location":"developer/domain-driven-design/#dependency-injection","text":"Under this concept, we want class objects to carry with them the dependencies they will use. Instead of calling global/static function/methods, objects use their own class members. Before: <?php class Model { public $id ; function save () { return \\Friendica\\Database\\DBA :: update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } After: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } The main advantage is testability. Another one is avoiding dependency circles and avoid implicit initializing. In the first example the method save() has to be tested with the DBA::update() method, which may or may not have dependencies itself. In the second example we can mock \\Friendica\\Database\\Database , e.g. overload the class by replacing its methods by placeholders, which allows us to test only Model::save() and nothing else implicitly. The main drawback is lengthy constructors for dependency-heavy classes. To alleviate this issue we are using DiCe to simplify the instantiation of the higher level objects Friendica uses. We also added a convenience factory named \\Friendica\\DI that creates some of the most common objects used in modules.","title":"Dependency Injection"},{"location":"developer/domain-driven-design/#factories","text":"Since we added a bunch of parameters to class constructors, instantiating objects has become cumbersome. To keep it simple, we are using Factories. Factories are classes used to generate other objects, centralizing the dependencies required in their constructor. Factories encapsulate more or less complex creation of objects and create them redundancy free. Before: <?php $model = new Model ( \\Friendica\\DI :: dba ()); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); Here, DI::factory() returns an instance of Factory that can then be used to create a Model object without having to care about its dependencies.","title":"Factories"},{"location":"developer/domain-driven-design/#repositories","text":"Last building block of our code architecture, repositories are meant as the interface between models and how they are stored. In Friendica they are stored in a relational database but repositories allow models not to have to care about it. Repositories also act as factories for the Model they are managing. Before: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Model { public $id ; } class Repository extends Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } public function save ( Model $model ) { return $this -> dba -> update ( 'table' , get_object_vars ( $model ), [ 'id' => $model -> id ]); } } $model = \\Friendica\\DI :: repository () -> create (); $model -> id = 1 ; $model -> key = 'value' ; \\Friendica\\DI :: repository () -> save ( $model );","title":"Repositories"},{"location":"developer/github/","tags":["developer","upstream","git"],"text":"Friendica on GitHub # Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum. Introduction to the workflow with our GitHub repository # Install git on the system you will be developing on. Create your own GitHub account. Fork the Friendica repository from https://github.com/friendica/friendica.git . Clone your fork from your GitHub account to your machine. Follow the instructions provided here: http://help.github.com/fork-a-repo/ to create and use your own tracking fork on GitHub Run bin/composer.phar install in Friendica's folder. Commit your changes to your fork. Then go to your GitHub page and create a \"Pull request\" to notify us to merge your work. Our Git Branches # There are two relevant branches in the main repo on GitHub: stable: This branch contains stable releases only. develop: This branch contains the latest code. This is what you want to work with. Fast-forwarding # Fast forwarding is enabled by default in git. When you merge with fast-forwarding it does not add a new commit to mark when you've performed the merge and how. This means in your commit history you can't know exactly what happened in terms of merges. It's best to turn off fast-forwarding. This is done by running \"git merge --no-ff\". Here is an explanation on how to configure git to turn off fast-forwarding by default. You can find some more background reading here . Release branches # A release branch is created when the develop branch contains all features it should have. A release branch is used for a few things. It allows last-minute bug fixing before the release goes to stable branch. It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes. It makes sure the develop branch can receive new features that are not part of this release. That last point is important because... The moment a release branch is created, develop is now intended for the version after this release . So please don't ever merge develop into a release! An example: If a release branch \"release-3.4\" is created, \"develop\" becomes either 3.5 or 4.0. If you were to merge develop into release-3.4 at this point, features and bug-fixes intended for 3.5 or 4.0 might leak into this release branch. This might introduce new bugs, too. Which defeats the purpose of the release branch. Some important reminders # 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. Test your changes . Don't assume that a simple fix won't break anything else. If possible get an experienced Friendica developer to review the code. Don't hesitate to ask us in case of doubt. Check your code for typos. There is a console command called typo for this. $> php bin/console.php typo Check out how to work with our Vagrant to save a lot of setup time!","title":"GitHub"},{"location":"developer/github/#friendica-on-github","text":"Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum.","title":"Friendica on GitHub"},{"location":"developer/github/#introduction-to-the-workflow-with-our-github-repository","text":"Install git on the system you will be developing on. Create your own GitHub account. Fork the Friendica repository from https://github.com/friendica/friendica.git . Clone your fork from your GitHub account to your machine. Follow the instructions provided here: http://help.github.com/fork-a-repo/ to create and use your own tracking fork on GitHub Run bin/composer.phar install in Friendica's folder. Commit your changes to your fork. Then go to your GitHub page and create a \"Pull request\" to notify us to merge your work.","title":"Introduction to the workflow with our GitHub repository"},{"location":"developer/github/#our-git-branches","text":"There are two relevant branches in the main repo on GitHub: stable: This branch contains stable releases only. develop: This branch contains the latest code. This is what you want to work with.","title":"Our Git Branches"},{"location":"developer/github/#fast-forwarding","text":"Fast forwarding is enabled by default in git. When you merge with fast-forwarding it does not add a new commit to mark when you've performed the merge and how. This means in your commit history you can't know exactly what happened in terms of merges. It's best to turn off fast-forwarding. This is done by running \"git merge --no-ff\". Here is an explanation on how to configure git to turn off fast-forwarding by default. You can find some more background reading here .","title":"Fast-forwarding"},{"location":"developer/github/#release-branches","text":"A release branch is created when the develop branch contains all features it should have. A release branch is used for a few things. It allows last-minute bug fixing before the release goes to stable branch. It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes. It makes sure the develop branch can receive new features that are not part of this release. That last point is important because... The moment a release branch is created, develop is now intended for the version after this release . So please don't ever merge develop into a release! An example: If a release branch \"release-3.4\" is created, \"develop\" becomes either 3.5 or 4.0. If you were to merge develop into release-3.4 at this point, features and bug-fixes intended for 3.5 or 4.0 might leak into this release branch. This might introduce new bugs, too. Which defeats the purpose of the release branch.","title":"Release branches"},{"location":"developer/github/#some-important-reminders","text":"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. Test your changes . Don't assume that a simple fix won't break anything else. If possible get an experienced Friendica developer to review the code. Don't hesitate to ask us in case of doubt. Check your code for typos. There is a console command called typo for this. $> php bin/console.php typo Check out how to work with our Vagrant to save a lot of setup time!","title":"Some important reminders"},{"location":"developer/how-to-move-classes-to-src/","tags":["developer","refactoring"],"text":"How To Move Classes to src # Friendica uses Composer to manage autoloading. This means that all the PHP class files moved to the src folder will be automatically included when the class it defines is first used in the flow. This is an improvement over the current require usage since files will be included on an actual usage basis instead of the presence of a require call. However, there are a significant number of items to check when moving a class file from the include folder to the src folder, and this page is there to list them. Decide the namespace # This isn't the most technical decision of them all, but it has long-lasting consequences as it will be the name that will be used to refer to this class from now on. There is a shared Ethercalc sheet to suggest namespace/class names that lists all the already moved class files for inspiration. A few pointers though: * Friendica is the base namespace for all classes in the src folder * Namespaces match the directory structure, with Friendica namespace being the base src directory. The Config class set in the Friendica\\Core namespace is expected to be found at src/Core/Config.php . * Namespaces can help group classes with a similar purpose or relevant to a particular feature When you're done deciding the namespace, it's time to use it. Let's say we choose Friendica\\Core for the Config class. Use the namespace # To declare the namespace, the file src/Core/Config.php must start with the following statement: namespace Friendica\\Core; From now on, the Config class can be referred to as Friendica\\Core\\Config , however it isn't very practical, especially when the class was previously used as Config . Thankfully, PHP provides namespace shortcuts through use . This language construct just provides a different naming scheme for a namespace or a class, but doesn't trigger the autoload-mechanism on its own. Here are the different ways you can use use : // No use $config = new Friendica\\Core\\Config(); // Namespace shortcut use Friendica\\Core; $config = new Core\\Config(); // Class name shortcut use Friendica\\Core\\Config; $config = new Config(); // Aliasing use Friendica\\Core\\Config as Cfg; $config = new Cfg(); Whatever the style chosen, a repository-wide search has to be done to find all the class name usage and either use the fully-qualified class name (including the namespace) or add a use statement at the start of each relevant file. Escape non-namespace classes # The class file you just moved is now in the Friendica namespace, but it probably isn't the case for all the classes referenced in this file. Since we added a namespace Friendica\\Core; to the file, all the class names still declared in include will be implicitly understood as Friendica\\Core\\ClassName , which is rarely what we expect. To avoid Class Friendica\\Core\\ClassName not found errors, all the include -declared class names have to be prepended with a \\ , it tells the autoloader not to look for the class in the namespace but in the global space where non-namespaced classes are set. If there are only a handful of references to a single non-namespaced class, just prepending \\ is enough. However, if there are many instance, we can use use again. namespace Friendica\\Core; ... if (\\DBM::is_result($r)) { ... } namespace Friendica\\Core; use Friendica\\Database\\DBM; if (DBM::is_result($r)) { ... } Remove any useless require # Now that you successfully moved your class to the autoloaded src folder, there's no need to include this file anywhere in the app ever again. Please remove all the require_once mentions of the former file, as they will provoke a Fatal Error even if the class isn't used. Miscellaneous tips # When you are done with moving the class, please run php bin/console.php typo from the Friendica base directory to check for obvious mistakes. However, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one. Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica. Check the class file for any magic constant __FILE__ or __DIR__ , as their value changed since you moved the class in the file tree. Most of the time it's used for debugging purposes but there can be instances where it's used to create cache folders for example. Related # Class autoloading Using Composer","title":"src Migration"},{"location":"developer/how-to-move-classes-to-src/#how-to-move-classes-to-src","text":"Friendica uses Composer to manage autoloading. This means that all the PHP class files moved to the src folder will be automatically included when the class it defines is first used in the flow. This is an improvement over the current require usage since files will be included on an actual usage basis instead of the presence of a require call. However, there are a significant number of items to check when moving a class file from the include folder to the src folder, and this page is there to list them.","title":"How To Move Classes to src"},{"location":"developer/how-to-move-classes-to-src/#decide-the-namespace","text":"This isn't the most technical decision of them all, but it has long-lasting consequences as it will be the name that will be used to refer to this class from now on. There is a shared Ethercalc sheet to suggest namespace/class names that lists all the already moved class files for inspiration. A few pointers though: * Friendica is the base namespace for all classes in the src folder * Namespaces match the directory structure, with Friendica namespace being the base src directory. The Config class set in the Friendica\\Core namespace is expected to be found at src/Core/Config.php . * Namespaces can help group classes with a similar purpose or relevant to a particular feature When you're done deciding the namespace, it's time to use it. Let's say we choose Friendica\\Core for the Config class.","title":"Decide the namespace"},{"location":"developer/how-to-move-classes-to-src/#use-the-namespace","text":"To declare the namespace, the file src/Core/Config.php must start with the following statement: namespace Friendica\\Core; From now on, the Config class can be referred to as Friendica\\Core\\Config , however it isn't very practical, especially when the class was previously used as Config . Thankfully, PHP provides namespace shortcuts through use . This language construct just provides a different naming scheme for a namespace or a class, but doesn't trigger the autoload-mechanism on its own. Here are the different ways you can use use : // No use $config = new Friendica\\Core\\Config(); // Namespace shortcut use Friendica\\Core; $config = new Core\\Config(); // Class name shortcut use Friendica\\Core\\Config; $config = new Config(); // Aliasing use Friendica\\Core\\Config as Cfg; $config = new Cfg(); Whatever the style chosen, a repository-wide search has to be done to find all the class name usage and either use the fully-qualified class name (including the namespace) or add a use statement at the start of each relevant file.","title":"Use the namespace"},{"location":"developer/how-to-move-classes-to-src/#escape-non-namespace-classes","text":"The class file you just moved is now in the Friendica namespace, but it probably isn't the case for all the classes referenced in this file. Since we added a namespace Friendica\\Core; to the file, all the class names still declared in include will be implicitly understood as Friendica\\Core\\ClassName , which is rarely what we expect. To avoid Class Friendica\\Core\\ClassName not found errors, all the include -declared class names have to be prepended with a \\ , it tells the autoloader not to look for the class in the namespace but in the global space where non-namespaced classes are set. If there are only a handful of references to a single non-namespaced class, just prepending \\ is enough. However, if there are many instance, we can use use again. namespace Friendica\\Core; ... if (\\DBM::is_result($r)) { ... } namespace Friendica\\Core; use Friendica\\Database\\DBM; if (DBM::is_result($r)) { ... }","title":"Escape non-namespace classes"},{"location":"developer/how-to-move-classes-to-src/#remove-any-useless-require","text":"Now that you successfully moved your class to the autoloaded src folder, there's no need to include this file anywhere in the app ever again. Please remove all the require_once mentions of the former file, as they will provoke a Fatal Error even if the class isn't used.","title":"Remove any useless require"},{"location":"developer/how-to-move-classes-to-src/#miscellaneous-tips","text":"When you are done with moving the class, please run php bin/console.php typo from the Friendica base directory to check for obvious mistakes. However, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one. Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica. Check the class file for any magic constant __FILE__ or __DIR__ , as their value changed since you moved the class in the file tree. Most of the time it's used for debugging purposes but there can be instances where it's used to create cache folders for example.","title":"Miscellaneous tips"},{"location":"developer/how-to-move-classes-to-src/#related","text":"Class autoloading Using Composer","title":"Related"},{"location":"developer/smarty3-templates/","tags":["developer","templates","themes"],"text":"Friendica Templating Documentation # Friendica uses Smarty 3 as PHP templating engine. The main templates are found in /view/templates theme authors may overwrite the default templates by putting a files with the same name into the /view/themes/$themename/templates directory. Templates that are only used by addons shall be placed in the /addon/$addonname/templates directory. To render a template use the function getMarkupTemplate to load the template and replaceMacros to replace the macros/variables in the just loaded template file. $tpl = Renderer::getMarkupTemplate('install_settings.tpl'); $o .= Renderer::replaceMacros($tpl, array( ... )); the array consists of an association of an identifier and the value for that identifier, i.e. '$title' => $install_title, where the value may as well be an array by its own. Form Templates # To guarantee a consistent look and feel for input forms, i.e. in the settings sections, there are templates for the basic form fields. They are initialized with an array of data, depending on the style of the field. All of these take an array holding the values, e.g. for a one line text input field, which is required and should be used to type email addresses use something along the lines of: '$adminmail' => array('adminmail', DI::l10n()->t('Site administrator email address'), $adminmail, DI::l10n()->t('Your account email address must match this in order to use the web admin panel.'), 'required', '', 'email'), To evaluate the input value, you can then use the $_POST array, more precisely the $_POST['adminemail'] variable. Listed below are the template file names, the general purpose of the template and their field parameters. field_checkbox.tpl # A checkbox. If the checkbox is checked its value is 1 . Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Help text for the checkbox. field_combobox.tpl # A combobox, combining a pull down selection and a textual input field. Field parameter: Name of the combobox, Label for the combobox, Current value of the variable, Help text for the combobox, Array holding the possible values for the textual input, Array holding the possible values for the pull down selection. field_custom.tpl # A customizable template to include a custom element in the form with the usual surroundings, Field parameter: Name of the field, Label for the field, the field, Help text for the field. field_input.tpl # A single line input field for any type of input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor into this box once the page is loaded, if set, it will be used for the input type, default is text (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types). field_intcheckbox.tpl # A checkbox (see above) but you can define the value of it. Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Value of the checkbox, Help text for the checkbox. field_openid.tpl # An input box (see above) but prepared for special CSS styling for openID input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input field. field_password.tpl # A single line input field (see above) for textual input. The characters typed in will not be shown by the browser. Field parameter: Name of the field, Label for the field, Value for the field, e.g. the old password, Help text for the input field, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor automatically into this input field. field_radio.tpl # A radio button. Field parameter: Name of the radio button, Label for the radio button, Current value of the variable, Help text for the button, if set, the radio button will be checked. field_richtext.tpl # A multi-line input field for rich textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box. field_select.tpl # A drop-down selection box. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Array holding the possible values of the selection drop-down. field_select_raw.tpl # A drop-down selection box (see above) but you have to prepare the values yourself. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Possible values of the selection drop-down. field_textarea.tpl # A multi-line input field for (plain) textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required.","title":"Smarty3"},{"location":"developer/smarty3-templates/#friendica-templating-documentation","text":"Friendica uses Smarty 3 as PHP templating engine. The main templates are found in /view/templates theme authors may overwrite the default templates by putting a files with the same name into the /view/themes/$themename/templates directory. Templates that are only used by addons shall be placed in the /addon/$addonname/templates directory. To render a template use the function getMarkupTemplate to load the template and replaceMacros to replace the macros/variables in the just loaded template file. $tpl = Renderer::getMarkupTemplate('install_settings.tpl'); $o .= Renderer::replaceMacros($tpl, array( ... )); the array consists of an association of an identifier and the value for that identifier, i.e. '$title' => $install_title, where the value may as well be an array by its own.","title":"Friendica Templating Documentation"},{"location":"developer/smarty3-templates/#form-templates","text":"To guarantee a consistent look and feel for input forms, i.e. in the settings sections, there are templates for the basic form fields. They are initialized with an array of data, depending on the style of the field. All of these take an array holding the values, e.g. for a one line text input field, which is required and should be used to type email addresses use something along the lines of: '$adminmail' => array('adminmail', DI::l10n()->t('Site administrator email address'), $adminmail, DI::l10n()->t('Your account email address must match this in order to use the web admin panel.'), 'required', '', 'email'), To evaluate the input value, you can then use the $_POST array, more precisely the $_POST['adminemail'] variable. Listed below are the template file names, the general purpose of the template and their field parameters.","title":"Form Templates"},{"location":"developer/smarty3-templates/#field_checkboxtpl","text":"A checkbox. If the checkbox is checked its value is 1 . Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Help text for the checkbox.","title":"field_checkbox.tpl"},{"location":"developer/smarty3-templates/#field_comboboxtpl","text":"A combobox, combining a pull down selection and a textual input field. Field parameter: Name of the combobox, Label for the combobox, Current value of the variable, Help text for the combobox, Array holding the possible values for the textual input, Array holding the possible values for the pull down selection.","title":"field_combobox.tpl"},{"location":"developer/smarty3-templates/#field_customtpl","text":"A customizable template to include a custom element in the form with the usual surroundings, Field parameter: Name of the field, Label for the field, the field, Help text for the field.","title":"field_custom.tpl"},{"location":"developer/smarty3-templates/#field_inputtpl","text":"A single line input field for any type of input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor into this box once the page is loaded, if set, it will be used for the input type, default is text (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types).","title":"field_input.tpl"},{"location":"developer/smarty3-templates/#field_intcheckboxtpl","text":"A checkbox (see above) but you can define the value of it. Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Value of the checkbox, Help text for the checkbox.","title":"field_intcheckbox.tpl"},{"location":"developer/smarty3-templates/#field_openidtpl","text":"An input box (see above) but prepared for special CSS styling for openID input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input field.","title":"field_openid.tpl"},{"location":"developer/smarty3-templates/#field_passwordtpl","text":"A single line input field (see above) for textual input. The characters typed in will not be shown by the browser. Field parameter: Name of the field, Label for the field, Value for the field, e.g. the old password, Help text for the input field, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor automatically into this input field.","title":"field_password.tpl"},{"location":"developer/smarty3-templates/#field_radiotpl","text":"A radio button. Field parameter: Name of the radio button, Label for the radio button, Current value of the variable, Help text for the button, if set, the radio button will be checked.","title":"field_radio.tpl"},{"location":"developer/smarty3-templates/#field_richtexttpl","text":"A multi-line input field for rich textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box.","title":"field_richtext.tpl"},{"location":"developer/smarty3-templates/#field_selecttpl","text":"A drop-down selection box. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Array holding the possible values of the selection drop-down.","title":"field_select.tpl"},{"location":"developer/smarty3-templates/#field_select_rawtpl","text":"A drop-down selection box (see above) but you have to prepare the values yourself. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Possible values of the selection drop-down.","title":"field_select_raw.tpl"},{"location":"developer/smarty3-templates/#field_textareatpl","text":"A multi-line input field for (plain) textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required.","title":"field_textarea.tpl"},{"location":"developer/tests/","tags":["developer","testing"],"text":"Tests # You can run unit tests with PHPUnit : phpunit Some tests require access to a MySQL database. You can specify the database credentials in environment variables: USER = database_user PASS = database_password DB = database_name phpunit Warning : This will empty all the tables! Never use this on a production database.","title":"Tests"},{"location":"developer/tests/#tests","text":"You can run unit tests with PHPUnit : phpunit Some tests require access to a MySQL database. You can specify the database credentials in environment variables: USER = database_user PASS = database_password DB = database_name phpunit Warning : This will empty all the tables! Never use this on a production database.","title":"Tests"},{"location":"developer/themes/","tags":["developer","themes","templates"],"text":"Themes # To change the look of friendica you have to touch the themes. The current default theme is Vier but there are numerous others. Have a look at github.com/bkil/friendica-themes for an overview of the existing themes. In case none of them suits your needs, there are several ways to change a theme. So, how to work on the UI of friendica. You can either directly edit an existing theme. But you might lose your changes when the theme is updated by the friendica team. If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheritance most of the properties of the parent theme and change just minor stuff. The below for a more detailed description of theme heritage. Some themes also allow users to select variants of the theme. Those theme variants most often contain an additional CSS file to override some styling of the default theme values. From the themes in the main repository duepunto zero and vier are using these methods for variations. Quattro is using a slightly different approach. Third you can start your theme from scratch. Which is the most complex way to change friendicas look. But it leaves you the most freedom. So below for a detailed description and the meaning of some special files. Styling # If you want to change the styling of a theme, have a look at the themes CSS file. In most cases, you can find these in /view/theme/**your-theme-name**/style.css sometimes, there is also a file called style.php in the theme directory. This is only needed if the theme allows the user to change certain things of the theme dynamically. Say the font size or set a background image. Templates # If you want to change the structure of the theme, you need to change the templates used by the theme. Friendica themes are using SMARTY3 for templating. The default template can be found in /view/templates if you want to override any template within your theme create your version of the template in /view/theme/**your-theme-name**/templates any template that exists there will be used instead of the default one. Javascript # The same rule applies to the JavaScript files found in /js they will be overwritten by files in /view/theme/**your-theme-name**/js. Expand an existing Theme # Theme Variations # Many themes are more theme families than only one theme. duepunto zero and vier allow easily to add new theme variation. We will go through the process of creating a new variation for duepunto zero . The same (well almost, some names change) procedure applies to the vier theme. And similar steps are needed for quattro but this theme is using lesscss to maintain the CSS files. In /view/theme/duepuntozero/deriv you find a couple of CSS files that define color derivations from the duepunto theme. These resemble some now as unsupported marked themes, that were inherited by the duepunto theme. Darkzero and Easter Bunny for example. The selection of the colorset is done in a combination of a template for a new form in the settings and some functions in the theme.php file. The template (theme_settings.tpl) {{ '{{include file=\"field_select.tpl\" field=$colorset}}' }} < div class = \"settings-submit-wrapper\" > {{ ' < input type = \"submit\" value = \"{{$submit}}\" class = \"settings-submit\" name = \"duepuntozero-settings-submit\" /> ' }} </ div > defines a formular consisting of a select pull-down which contains all available variants and s submit button. See the documentation about SMARTY3 templates for a summary of friendica specific blocks other than the select element. But we don't really need to change anything at the template itself. The template alone won't work though. You make friendica aware of its existence and tell it how to use the template file, by defining a config.php file. It needs to define at least the following functions theme_content theme_post and may also define functions for the admin interface theme_admin theme_admin_post. theme_content and theme_admin are used to make the form available in the settings, respectively the admin panel. The _post functions handle the processing of the send-form, in this case they save to selected variant in friendicas database. To make your own variation appear in the menu, all you need to do is to create a new CSS file in the deriv-directory and include it in the array in the config.php: $colorset = array( 'default'=>DI::l10n()->t('default'), 'greenzero'=>DI::l10n()->t('greenzero'), 'purplezero'=>DI::l10n()->t('purplezero'), 'easterbunny'=>DI::l10n()->t('easterbunny'), 'darkzero'=>DI::l10n()->t('darkzero'), 'comix'=>DI::l10n()->t('comix'), 'slackr'=>DI::l10n()->t('slackr'), ); ``` the 1st part of the line is the name of the CSS file (without the .css) the 2nd part is the common name of the variant. Calling the DI::l10n()->t() function with the common name makes the string translatable. The selected 1st part will be saved in the database by the theme_post function. ```php <?php function theme_post ( App $a ){ // non-local users shall not pass if ( ! local_user ()) { return ; } // if the one specific submit button was pressed then proceed if ( isset ( $_POST [ 'duepuntozero-settings-submit' ])){ // and save the selection key into the personal config of the user DI :: pConfig () -> set ( local_user (), 'duepuntozero' , 'colorset' , $_POST [ 'duepuntozero_colorset' ]); } } Now that this information is set in the database, what should friendica do with it? For this, have a look at the theme.php file of the duepunto zero . There you'll find something alike <?php $colorset = DI :: pConfig () -> get ( local_user (), 'duepuntozero' , 'colorset' ); if ( ! $colorset ) $colorset = DI :: config () -> get ( 'duepuntozero' , 'colorset' ); if ( $colorset ) { if ( $colorset == 'greenzero' ) DI :: page ()[ 'htmlhead' ] .= '<link rel=\"stylesheet\" href=\"view/theme/duepuntozero/deriv/greenzero.css\" type=\"text/css\" media=\"screen\" />' . \" \\n \" ; /* some more variants */ } which tells friendica to get the personal config of a user. Check if it is set and if not look for the global config. And finally if a config for the colorset was found, apply it by adding a link to the CSS file into the HTML header of the page. So you'll just need to add an if selection, fitting your variant keyword and link to the CSS file of it. Done. Now you can use the variant on your system. But remember once the theme.php or the config.php you have to re-add your variant to them. If you think your color variation could be beneficial for other friendica users as well, feel free to generate a pull request at GitHub, so we can include your work into the repository. Inheritance # Say, you like the duepuntozero, but you want to have the content of the outer columns left and right exchanged. That would be not a color variation as shown above. Instead, we will create a new theme, duepuntozero_lr, inherit the properties of duepuntozero and make small changes to the underlying php files. So create a directory called duepunto_lr and create a file called theme.php with your favorite text editor. The content of this file should be something like <?php /* meta information for the theme, see below */ use Friendica\\App ; function duepuntozero_lr_init ( App $a ) { $a -> setThemeInfoValue ( 'extends' , 'duepuntozero' ); $a -> set_template_engine ( 'smarty3' ); /* and more stuff e.g. the JavaScript function for the header */ } Next take the default.php file found in the /view directory and exchange the aside and right_aside elements. So the central part of the file now looks like this: < body > <?php if(!empty($page['nav'])) echo $page['nav']; ?> < aside > <?php if(!empty($page['right_aside'])) echo $page['right_aside']; ?> </ aside > < section > <?php if(!empty($page['content'])) echo $page['content']; ?> < div id = \"page-footer\" ></ div > </ section > < right_aside > <?php if(!empty($page['aside'])) echo $page['aside']; ?> </ right_aside > < footer > <?php if(!empty($page['footer'])) echo $page['footer']; ?> </ footer > </ body > Finally, we need a style.css file, inheriting the definitions from the parent theme and containing out changes for the new theme. Note :You need to create the style.css and at lest import the base CSS file from the parent theme. @import url('../duepuntozero/style.css'); Done. But I agree it is not really useful at this state. Nevertheless, to use it, you just need to activate in the admin panel. That done, you can select it in the settings like any other activated theme. Creating a Theme from Scratch # Keep patient. Basically what you have to do is identify which template you have to change, so it looks more like what you want. Adopt the CSS of the theme accordingly. And iterate the process until you have the theme the way you want it. Use the source Luke. and don't hesitate to ask in @ developers or @ helpers . Special Files # unsupported # If a file with this name (which might be empty) exists in the theme directory, the theme is marked as unsupported . An unsupported theme may not be selected by a user in the settings. Users who are already using it won't notice anything. README(.md) # The contents of this file, with or without the .md which indicates Markdown syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica. This file should contain information you want to let others know about your theme. screenshot.[png|jpg] # If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name. Supported formats are PNG and JPEG. theme.php # This is the main definition file of the theme. In the header of that file, some meta information is stored. For example, have a look at the theme.php of the quattro theme: <?php /** * Name: Quattro * Version: 0.6 * Author: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Tobias <https://f.diekershoff.de/profile/tobias> */ ``` You see the definition of the theme's name, it's version and the initial author of the theme. These three pieces of information should be listed. If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well. The information from the theme header will be displayed in the admin panel. The first thing in file is to import the ` App ` class from ` \\Friendica\\ ` namespace. ``` php use Friendica\\App ; This will make our job a little easier, as we don't have to specify the full name every time we need to use the App class. The next crucial part of the theme.php file is a definition of an init function. The name of the function is _init. So in the case of quattro it is <?php function quattro_init ( App $a ) { $a -> theme_info = array (); $a -> set_template_engine ( 'smarty3' ); } Here we have set the basic theme information, in this case they are empty. But the array needs to be set. And we have set the template engine that should be used by friendica for this theme. At the moment you should use the smarty3 engine. There once was a friendica specific templating engine as well but that is not used anymore. If you like to use another templating engine, please implement it. When you want to inherit stuff from another theme you have to announce this in the theme_info: $a->setThemeInfoValue('extends', 'duepuntozero'); which declares duepuntozero as parent of the theme. If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file. To do so, add something alike DI::page()['htmlhead'] .= <<< EOT /* stuff you want to add to the header */ EOT; The $a variable holds the friendica application. So you can access the properties of this friendica session from the theme.php file as well. default.php # This file covers the structure of the underlying HTML layout. The default file is in /view/default.php if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory. As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.","title":"Themes"},{"location":"developer/themes/#themes","text":"To change the look of friendica you have to touch the themes. The current default theme is Vier but there are numerous others. Have a look at github.com/bkil/friendica-themes for an overview of the existing themes. In case none of them suits your needs, there are several ways to change a theme. So, how to work on the UI of friendica. You can either directly edit an existing theme. But you might lose your changes when the theme is updated by the friendica team. If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheritance most of the properties of the parent theme and change just minor stuff. The below for a more detailed description of theme heritage. Some themes also allow users to select variants of the theme. Those theme variants most often contain an additional CSS file to override some styling of the default theme values. From the themes in the main repository duepunto zero and vier are using these methods for variations. Quattro is using a slightly different approach. Third you can start your theme from scratch. Which is the most complex way to change friendicas look. But it leaves you the most freedom. So below for a detailed description and the meaning of some special files.","title":"Themes"},{"location":"developer/themes/#styling","text":"If you want to change the styling of a theme, have a look at the themes CSS file. In most cases, you can find these in /view/theme/**your-theme-name**/style.css sometimes, there is also a file called style.php in the theme directory. This is only needed if the theme allows the user to change certain things of the theme dynamically. Say the font size or set a background image.","title":"Styling"},{"location":"developer/themes/#templates","text":"If you want to change the structure of the theme, you need to change the templates used by the theme. Friendica themes are using SMARTY3 for templating. The default template can be found in /view/templates if you want to override any template within your theme create your version of the template in /view/theme/**your-theme-name**/templates any template that exists there will be used instead of the default one.","title":"Templates"},{"location":"developer/themes/#javascript","text":"The same rule applies to the JavaScript files found in /js they will be overwritten by files in /view/theme/**your-theme-name**/js.","title":"Javascript"},{"location":"developer/themes/#expand-an-existing-theme","text":"","title":"Expand an existing Theme"},{"location":"developer/themes/#theme-variations","text":"Many themes are more theme families than only one theme. duepunto zero and vier allow easily to add new theme variation. We will go through the process of creating a new variation for duepunto zero . The same (well almost, some names change) procedure applies to the vier theme. And similar steps are needed for quattro but this theme is using lesscss to maintain the CSS files. In /view/theme/duepuntozero/deriv you find a couple of CSS files that define color derivations from the duepunto theme. These resemble some now as unsupported marked themes, that were inherited by the duepunto theme. Darkzero and Easter Bunny for example. The selection of the colorset is done in a combination of a template for a new form in the settings and some functions in the theme.php file. The template (theme_settings.tpl) {{ '{{include file=\"field_select.tpl\" field=$colorset}}' }} < div class = \"settings-submit-wrapper\" > {{ ' < input type = \"submit\" value = \"{{$submit}}\" class = \"settings-submit\" name = \"duepuntozero-settings-submit\" /> ' }} </ div > defines a formular consisting of a select pull-down which contains all available variants and s submit button. See the documentation about SMARTY3 templates for a summary of friendica specific blocks other than the select element. But we don't really need to change anything at the template itself. The template alone won't work though. You make friendica aware of its existence and tell it how to use the template file, by defining a config.php file. It needs to define at least the following functions theme_content theme_post and may also define functions for the admin interface theme_admin theme_admin_post. theme_content and theme_admin are used to make the form available in the settings, respectively the admin panel. The _post functions handle the processing of the send-form, in this case they save to selected variant in friendicas database. To make your own variation appear in the menu, all you need to do is to create a new CSS file in the deriv-directory and include it in the array in the config.php: $colorset = array( 'default'=>DI::l10n()->t('default'), 'greenzero'=>DI::l10n()->t('greenzero'), 'purplezero'=>DI::l10n()->t('purplezero'), 'easterbunny'=>DI::l10n()->t('easterbunny'), 'darkzero'=>DI::l10n()->t('darkzero'), 'comix'=>DI::l10n()->t('comix'), 'slackr'=>DI::l10n()->t('slackr'), ); ``` the 1st part of the line is the name of the CSS file (without the .css) the 2nd part is the common name of the variant. Calling the DI::l10n()->t() function with the common name makes the string translatable. The selected 1st part will be saved in the database by the theme_post function. ```php <?php function theme_post ( App $a ){ // non-local users shall not pass if ( ! local_user ()) { return ; } // if the one specific submit button was pressed then proceed if ( isset ( $_POST [ 'duepuntozero-settings-submit' ])){ // and save the selection key into the personal config of the user DI :: pConfig () -> set ( local_user (), 'duepuntozero' , 'colorset' , $_POST [ 'duepuntozero_colorset' ]); } } Now that this information is set in the database, what should friendica do with it? For this, have a look at the theme.php file of the duepunto zero . There you'll find something alike <?php $colorset = DI :: pConfig () -> get ( local_user (), 'duepuntozero' , 'colorset' ); if ( ! $colorset ) $colorset = DI :: config () -> get ( 'duepuntozero' , 'colorset' ); if ( $colorset ) { if ( $colorset == 'greenzero' ) DI :: page ()[ 'htmlhead' ] .= '<link rel=\"stylesheet\" href=\"view/theme/duepuntozero/deriv/greenzero.css\" type=\"text/css\" media=\"screen\" />' . \" \\n \" ; /* some more variants */ } which tells friendica to get the personal config of a user. Check if it is set and if not look for the global config. And finally if a config for the colorset was found, apply it by adding a link to the CSS file into the HTML header of the page. So you'll just need to add an if selection, fitting your variant keyword and link to the CSS file of it. Done. Now you can use the variant on your system. But remember once the theme.php or the config.php you have to re-add your variant to them. If you think your color variation could be beneficial for other friendica users as well, feel free to generate a pull request at GitHub, so we can include your work into the repository.","title":"Theme Variations"},{"location":"developer/themes/#inheritance","text":"Say, you like the duepuntozero, but you want to have the content of the outer columns left and right exchanged. That would be not a color variation as shown above. Instead, we will create a new theme, duepuntozero_lr, inherit the properties of duepuntozero and make small changes to the underlying php files. So create a directory called duepunto_lr and create a file called theme.php with your favorite text editor. The content of this file should be something like <?php /* meta information for the theme, see below */ use Friendica\\App ; function duepuntozero_lr_init ( App $a ) { $a -> setThemeInfoValue ( 'extends' , 'duepuntozero' ); $a -> set_template_engine ( 'smarty3' ); /* and more stuff e.g. the JavaScript function for the header */ } Next take the default.php file found in the /view directory and exchange the aside and right_aside elements. So the central part of the file now looks like this: < body > <?php if(!empty($page['nav'])) echo $page['nav']; ?> < aside > <?php if(!empty($page['right_aside'])) echo $page['right_aside']; ?> </ aside > < section > <?php if(!empty($page['content'])) echo $page['content']; ?> < div id = \"page-footer\" ></ div > </ section > < right_aside > <?php if(!empty($page['aside'])) echo $page['aside']; ?> </ right_aside > < footer > <?php if(!empty($page['footer'])) echo $page['footer']; ?> </ footer > </ body > Finally, we need a style.css file, inheriting the definitions from the parent theme and containing out changes for the new theme. Note :You need to create the style.css and at lest import the base CSS file from the parent theme. @import url('../duepuntozero/style.css'); Done. But I agree it is not really useful at this state. Nevertheless, to use it, you just need to activate in the admin panel. That done, you can select it in the settings like any other activated theme.","title":"Inheritance"},{"location":"developer/themes/#creating-a-theme-from-scratch","text":"Keep patient. Basically what you have to do is identify which template you have to change, so it looks more like what you want. Adopt the CSS of the theme accordingly. And iterate the process until you have the theme the way you want it. Use the source Luke. and don't hesitate to ask in @ developers or @ helpers .","title":"Creating a Theme from Scratch"},{"location":"developer/themes/#special-files","text":"","title":"Special Files"},{"location":"developer/themes/#unsupported","text":"If a file with this name (which might be empty) exists in the theme directory, the theme is marked as unsupported . An unsupported theme may not be selected by a user in the settings. Users who are already using it won't notice anything.","title":"unsupported"},{"location":"developer/themes/#readmemd","text":"The contents of this file, with or without the .md which indicates Markdown syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica. This file should contain information you want to let others know about your theme.","title":"README(.md)"},{"location":"developer/themes/#screenshotpngjpg","text":"If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name. Supported formats are PNG and JPEG.","title":"screenshot.[png|jpg]"},{"location":"developer/themes/#themephp","text":"This is the main definition file of the theme. In the header of that file, some meta information is stored. For example, have a look at the theme.php of the quattro theme: <?php /** * Name: Quattro * Version: 0.6 * Author: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Tobias <https://f.diekershoff.de/profile/tobias> */ ``` You see the definition of the theme's name, it's version and the initial author of the theme. These three pieces of information should be listed. If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well. The information from the theme header will be displayed in the admin panel. The first thing in file is to import the ` App ` class from ` \\Friendica\\ ` namespace. ``` php use Friendica\\App ; This will make our job a little easier, as we don't have to specify the full name every time we need to use the App class. The next crucial part of the theme.php file is a definition of an init function. The name of the function is _init. So in the case of quattro it is <?php function quattro_init ( App $a ) { $a -> theme_info = array (); $a -> set_template_engine ( 'smarty3' ); } Here we have set the basic theme information, in this case they are empty. But the array needs to be set. And we have set the template engine that should be used by friendica for this theme. At the moment you should use the smarty3 engine. There once was a friendica specific templating engine as well but that is not used anymore. If you like to use another templating engine, please implement it. When you want to inherit stuff from another theme you have to announce this in the theme_info: $a->setThemeInfoValue('extends', 'duepuntozero'); which declares duepuntozero as parent of the theme. If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file. To do so, add something alike DI::page()['htmlhead'] .= <<< EOT /* stuff you want to add to the header */ EOT; The $a variable holds the friendica application. So you can access the properties of this friendica session from the theme.php file as well.","title":"theme.php"},{"location":"developer/themes/#defaultphp","text":"This file covers the structure of the underlying HTML layout. The default file is in /view/default.php if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory. As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.","title":"default.php"},{"location":"developer/translations/","tags":["developer","translations"],"text":"Friendica translations # Overview # The Friendica translation process is based on gettext PO files. Basic workflow: 1. xgettext is used to collect translation strings across the project in the authoritative PO file located in view/lang/C/messages.po . 2. This file makes translations strings available at the Transifex Friendica page . 3. The translation itself is done at Transifex by volunteers. 4. The resulting PO files by languages are manually updated in view/lang/<language>/messages.po . 5. PO files are converted to PHP arrays in view/lang/<language>/strings.php that are ultimately used by Friendica to display the translations. Translate Friendica in your favorite language # Thank you for your interest in improving Friendica's translation! Please register a free Transifex account and ask over at the Transifex Friendica page to join the translation team for your favorite language. As a rule of thumb, we add support for a language in Friendica when at least 50% of the strings have been translated to avoid a scattered experience. For addons, we add support for a language when if we already support the language in Friendica. Add new translation strings # Core # Once you have added new translation strings in your code changes, please run bin/run_xgettext.sh from the base Friendica directory and commit the updated view/lang/C/messages.po to your branch. Addon # If you have the friendica-addons repository in the addon directory of your Friendica cloned repository, just run bin/run_xgettext.sh -a <addon_name> from the base Friendica directory. Otherwise: cd /path/to/friendica-addons/<addon_name> /path/to/friendica/bin/run_xgettext.sh -s In either case, you need to commit the updated <addon_name>/lang/C/messages.po to your working branch. Update translations from Transifex # Please download the Transifex file \"for use\" in view/lang/<language>/messages.po . Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch. Using the Transifex client # Transifex has a client program which allows you to sync files between your cloned Friendica repository and Transifex. Help for the client can be found at the Transifex Help Center . Here we will only cover basic usage. After installation of the client, you should have a tx command available on your system. To use it, first create a configuration file with your credentials. On Linux this file should be placed into your home directory ~/.transifexrc . The content of the file should be something like the following: [https://www.transifex.com] username = user token = password = p@ssw0rd hostname = https://www.transifex.com Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository in .tx/config . To update the PO files after you have translated strings of e.g. Esperanto on the Transifex website you can use tx to download the updated PO-file in the right location. tx pull -l eo Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch. Translation functions usage # Basic usage # Friendica\\DI::l10n()->t('Label') => Label Friendica\\DI::l10n()->t('Label %s', 'test') => Label test Plural # Friendica\\DI::l10n()->tt('Label', 'Labels', 1) => Label Friendica\\DI::l10n()->tt('Label', 'Labels', 3) => Labels Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 1) => 1 Label Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 3) => 3 Labels Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 1, 'test', 'test2') => Label test test2 Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 3, 'test', 'test2') => Labels test test2","title":"Translations"},{"location":"developer/translations/#friendica-translations","text":"","title":"Friendica translations"},{"location":"developer/translations/#overview","text":"The Friendica translation process is based on gettext PO files. Basic workflow: 1. xgettext is used to collect translation strings across the project in the authoritative PO file located in view/lang/C/messages.po . 2. This file makes translations strings available at the Transifex Friendica page . 3. The translation itself is done at Transifex by volunteers. 4. The resulting PO files by languages are manually updated in view/lang/<language>/messages.po . 5. PO files are converted to PHP arrays in view/lang/<language>/strings.php that are ultimately used by Friendica to display the translations.","title":"Overview"},{"location":"developer/translations/#translate-friendica-in-your-favorite-language","text":"Thank you for your interest in improving Friendica's translation! Please register a free Transifex account and ask over at the Transifex Friendica page to join the translation team for your favorite language. As a rule of thumb, we add support for a language in Friendica when at least 50% of the strings have been translated to avoid a scattered experience. For addons, we add support for a language when if we already support the language in Friendica.","title":"Translate Friendica in your favorite language"},{"location":"developer/translations/#add-new-translation-strings","text":"","title":"Add new translation strings"},{"location":"developer/translations/#core","text":"Once you have added new translation strings in your code changes, please run bin/run_xgettext.sh from the base Friendica directory and commit the updated view/lang/C/messages.po to your branch.","title":"Core"},{"location":"developer/translations/#addon","text":"If you have the friendica-addons repository in the addon directory of your Friendica cloned repository, just run bin/run_xgettext.sh -a <addon_name> from the base Friendica directory. Otherwise: cd /path/to/friendica-addons/<addon_name> /path/to/friendica/bin/run_xgettext.sh -s In either case, you need to commit the updated <addon_name>/lang/C/messages.po to your working branch.","title":"Addon"},{"location":"developer/translations/#update-translations-from-transifex","text":"Please download the Transifex file \"for use\" in view/lang/<language>/messages.po . Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch.","title":"Update translations from Transifex"},{"location":"developer/translations/#using-the-transifex-client","text":"Transifex has a client program which allows you to sync files between your cloned Friendica repository and Transifex. Help for the client can be found at the Transifex Help Center . Here we will only cover basic usage. After installation of the client, you should have a tx command available on your system. To use it, first create a configuration file with your credentials. On Linux this file should be placed into your home directory ~/.transifexrc . The content of the file should be something like the following: [https://www.transifex.com] username = user token = password = p@ssw0rd hostname = https://www.transifex.com Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository in .tx/config . To update the PO files after you have translated strings of e.g. Esperanto on the Transifex website you can use tx to download the updated PO-file in the right location. tx pull -l eo Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch.","title":"Using the Transifex client"},{"location":"developer/translations/#translation-functions-usage","text":"","title":"Translation functions usage"},{"location":"developer/translations/#basic-usage","text":"Friendica\\DI::l10n()->t('Label') => Label Friendica\\DI::l10n()->t('Label %s', 'test') => Label test","title":"Basic usage"},{"location":"developer/translations/#plural","text":"Friendica\\DI::l10n()->tt('Label', 'Labels', 1) => Label Friendica\\DI::l10n()->tt('Label', 'Labels', 3) => Labels Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 1) => 1 Label Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 3) => 3 Labels Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 1, 'test', 'test2') => Label test test2 Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 3, 'test', 'test2') => Labels test test2","title":"Plural"},{"location":"developer/vagrant/","tags":["developer","testing"],"text":"Vagrant for Friendica Developers # Getting started # Vagrant is a virtualization solution for developers. No need to set up a webserver, database etc. before actually starting. Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica. It brings a Debian Bullseye with PHP 7.4 and MariaDB 10.5.11. What you need to do: Install VirtualBox and vagrant. Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. Git clone your Friendica repository. Inside, you'll find a Vagrantfile and some scripts in the bin/dev folder. Pull the PHP requirements with bin/composer install . Run vagrant up from inside the friendica clone. This will start the virtual machine. Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. Run vagrant ssh to log into the virtual machine to log in to the VM in case you need to debug something on the server. Open you test installation in a browser. Go to friendica.local (or 192.168.22.10). friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page. The mysql database is called \"friendica\", the mysql user and password both are \"friendica\". Work on Friendica's code in your git clone on your machine (not in the VM). Your local working directory is set up as a shared directory with the VM (/vagrant). Check the changes in your browser in the VM. Find the Friendica log file /vagrant/logfile.out on the VM or in the logfile.out in you local Friendica directory. Commit and push your changes directly back to GitHub. If you want to stop vagrant after finishing your work, run the following command vagrant halt in the development directory. This will not delete the virtual machine. 9. To ultimately delete the virtual machine run vagrant destroy rm /vagrant/config/local.config.php to make sure that you can start from scratch with another \"vagrant up\". Default User Accounts # By default, the provision script will set up two user accounts. admin, password admin friendica, password friendica Trouble Shooting # If you see a version mismatch for the VirtualBox Guest Additions between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. Stack Overflow ). Stop the Vagrant VM and run the following command: vagrant plugin install vagrant-vbguest On the next Vagrant up, the version problem should be fixed. If friendica.local is not resolved, you may need to add an entry to the /etc/hosts file (or similar configuration depending on the OS you are using). For further documentation of vagrant, please see the vagrant docs .","title":"Vagrant"},{"location":"developer/vagrant/#vagrant-for-friendica-developers","text":"","title":"Vagrant for Friendica Developers"},{"location":"developer/vagrant/#getting-started","text":"Vagrant is a virtualization solution for developers. No need to set up a webserver, database etc. before actually starting. Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica. It brings a Debian Bullseye with PHP 7.4 and MariaDB 10.5.11. What you need to do: Install VirtualBox and vagrant. Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. Git clone your Friendica repository. Inside, you'll find a Vagrantfile and some scripts in the bin/dev folder. Pull the PHP requirements with bin/composer install . Run vagrant up from inside the friendica clone. This will start the virtual machine. Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. Run vagrant ssh to log into the virtual machine to log in to the VM in case you need to debug something on the server. Open you test installation in a browser. Go to friendica.local (or 192.168.22.10). friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page. The mysql database is called \"friendica\", the mysql user and password both are \"friendica\". Work on Friendica's code in your git clone on your machine (not in the VM). Your local working directory is set up as a shared directory with the VM (/vagrant). Check the changes in your browser in the VM. Find the Friendica log file /vagrant/logfile.out on the VM or in the logfile.out in you local Friendica directory. Commit and push your changes directly back to GitHub. If you want to stop vagrant after finishing your work, run the following command vagrant halt in the development directory. This will not delete the virtual machine. 9. To ultimately delete the virtual machine run vagrant destroy rm /vagrant/config/local.config.php to make sure that you can start from scratch with another \"vagrant up\".","title":"Getting started"},{"location":"developer/vagrant/#default-user-accounts","text":"By default, the provision script will set up two user accounts. admin, password admin friendica, password friendica","title":"Default User Accounts"},{"location":"developer/vagrant/#trouble-shooting","text":"If you see a version mismatch for the VirtualBox Guest Additions between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. Stack Overflow ). Stop the Vagrant VM and run the following command: vagrant plugin install vagrant-vbguest On the next Vagrant up, the version problem should be fixed. If friendica.local is not resolved, you may need to add an entry to the /etc/hosts file (or similar configuration depending on the OS you are using). For further documentation of vagrant, please see the vagrant docs .","title":"Trouble Shooting"},{"location":"","text":"Friendica Documentation and Resources # User Manual # General functions - first steps Account Basics New User Quick Start Creating posts BBCode tag reference Comment, sort and delete posts Accesskey reference Events You and other users Connectors Making Friends Groups and Privacy Tags and Mentions Community Forums Chats Further information Move your account Export / Import of followed Contacts Delete your account Frequently asked questions (FAQ) Admin Manual # Install Update Settings & Admin Panel Installing Connectors (Twitter/GNU Social) Install an ejabberd server (XMPP chat) with synchronized credentials Using SSL with Friendica Config values that can only be set in config/local.config.php Improve Performance Migrate Administration Tools Admin FAQ Developer Manual # Get started Set up development environment Help on Github Help on Vagrant Bugs and Issues Code structure Domain-Driven-Design Addon Development Theme Development Smarty 3 Templates Storage backend addon How To Translate Friendica Use Composer Move classes to src Run tests Reference API endpoints Code (Doxygen generated - sets cookies) Protocol Documentation Database schema documentation Class Autoloading External Resources # Main Website Ways to get Support Friendica Support Forum: @helpers@forum.friendi.ca Mailing List Archive you can subscribe to the list by sending an email to support-request(at)friendi.ca?subject=subscribe Community chat rooms (the IRC, Matrix and XMPP rooms are bridget) these public chats are logged from IRC and Matrix XMPP/Jabber MUC: support(at)forum.friendi.ca IRC: #friendica at libera.chat Matrix: #friendi.ca or #friendica-en at matrix.org","title":"Home"},{"location":"#friendica-documentation-and-resources","text":"","title":"Friendica Documentation and Resources"},{"location":"#user-manual","text":"General functions - first steps Account Basics New User Quick Start Creating posts BBCode tag reference Comment, sort and delete posts Accesskey reference Events You and other users Connectors Making Friends Groups and Privacy Tags and Mentions Community Forums Chats Further information Move your account Export / Import of followed Contacts Delete your account Frequently asked questions (FAQ)","title":"User Manual"},{"location":"#admin-manual","text":"Install Update Settings & Admin Panel Installing Connectors (Twitter/GNU Social) Install an ejabberd server (XMPP chat) with synchronized credentials Using SSL with Friendica Config values that can only be set in config/local.config.php Improve Performance Migrate Administration Tools Admin FAQ","title":"Admin Manual"},{"location":"#developer-manual","text":"Get started Set up development environment Help on Github Help on Vagrant Bugs and Issues Code structure Domain-Driven-Design Addon Development Theme Development Smarty 3 Templates Storage backend addon How To Translate Friendica Use Composer Move classes to src Run tests Reference API endpoints Code (Doxygen generated - sets cookies) Protocol Documentation Database schema documentation Class Autoloading","title":"Developer Manual"},{"location":"#external-resources","text":"Main Website Ways to get Support Friendica Support Forum: @helpers@forum.friendi.ca Mailing List Archive you can subscribe to the list by sending an email to support-request(at)friendi.ca?subject=subscribe Community chat rooms (the IRC, Matrix and XMPP rooms are bridget) these public chats are logged from IRC and Matrix XMPP/Jabber MUC: support(at)forum.friendi.ca IRC: #friendica at libera.chat Matrix: #friendi.ca or #friendica-en at matrix.org","title":"External Resources"},{"location":"bugs-and-issues/","tags":["developer","user","issues"],"text":"Bugs and Issues # If your server has a support page, you should report any bugs/issues you encounter there first. Reporting to your support page before reporting to the developers makes their job easier, as they don't have to deal with bug reports that might not have anything to do with them. Reducing the workload in this way helps us get new features faster. You can also contact the friendica support forum and report your problem there. Bugs are rarely limited to one person, and the chances are somebody from another node has encountered the issue too, and will be able to help you. If you're a technical user, or your site doesn't have a support page, you'll need to use the Bug Tracker . This is also used for issues with addons. Please perform a search to see if there's already an open bug that matches yours before submitting anything. Try to provide as much information as you can about the bug, including the full text of any error messages or notices, and any steps required to replicate the problem in as much detail as possible. It's generally better to provide too much information than not enough. See this article to learn more about submitting good bug reports. The better your bug report, the more likely we are to be able to actually fix it. And last but not least: It is better to report an issue you encountered even if you can't write the perfect bug report!","title":"Bugs and Issues"},{"location":"bugs-and-issues/#bugs-and-issues","text":"If your server has a support page, you should report any bugs/issues you encounter there first. Reporting to your support page before reporting to the developers makes their job easier, as they don't have to deal with bug reports that might not have anything to do with them. Reducing the workload in this way helps us get new features faster. You can also contact the friendica support forum and report your problem there. Bugs are rarely limited to one person, and the chances are somebody from another node has encountered the issue too, and will be able to help you. If you're a technical user, or your site doesn't have a support page, you'll need to use the Bug Tracker . This is also used for issues with addons. Please perform a search to see if there's already an open bug that matches yours before submitting anything. Try to provide as much information as you can about the bug, including the full text of any error messages or notices, and any steps required to replicate the problem in as much detail as possible. It's generally better to provide too much information than not enough. See this article to learn more about submitting good bug reports. The better your bug report, the more likely we are to be able to actually fix it. And last but not least: It is better to report an issue you encountered even if you can't write the perfect bug report!","title":"Bugs and Issues"},{"location":"admin/faq/","tags":["admin","faq"],"text":"Frequently Asked Questions (Admin) - FAQ # Can I configure multiple domains with the same code instance? # No, this function is no longer supported as of Friendica 3.3 onwards. Where can I find the source code of friendica, addons and themes? # You can find the main repository here . There you will always find the current stable version of friendica. Addons are listed at this page . If you are searching for new themes, you can find them at github.com/bkil/friendica-themes I've changed my email address now the admin panel is gone? # Have a look into your config/local.config.php and fix your email address there. Can there be more than one admin for a node? # Yes. You just have to list more than one email address in the config/local.config.php file. The listed emails need to be separated by a comma. The Database structure seems not to be updated. What can I do? # Please have a look at the Admin panel under DB updates ( /admin/dbsync/ ) and follow the link to check database structure . This will start a background process to check if the structure is up to the current definition. You can manually execute the structure update from the CLI in the base directory of your Friendica installation by running the following command: bin/console dbstructure update if there occur any errors, please contact the support forum .","title":"FAQ"},{"location":"admin/faq/#frequently-asked-questions-admin-faq","text":"","title":"Frequently Asked Questions (Admin) - FAQ"},{"location":"admin/faq/#can-i-configure-multiple-domains-with-the-same-code-instance","text":"No, this function is no longer supported as of Friendica 3.3 onwards.","title":"Can I configure multiple domains with the same code instance?"},{"location":"admin/faq/#where-can-i-find-the-source-code-of-friendica-addons-and-themes","text":"You can find the main repository here . There you will always find the current stable version of friendica. Addons are listed at this page . If you are searching for new themes, you can find them at github.com/bkil/friendica-themes","title":"Where can I find the source code of friendica, addons and themes?"},{"location":"admin/faq/#ive-changed-my-email-address-now-the-admin-panel-is-gone","text":"Have a look into your config/local.config.php and fix your email address there.","title":"I've changed my email address now the admin panel is gone?"},{"location":"admin/faq/#can-there-be-more-than-one-admin-for-a-node","text":"Yes. You just have to list more than one email address in the config/local.config.php file. The listed emails need to be separated by a comma.","title":"Can there be more than one admin for a node?"},{"location":"admin/faq/#the-database-structure-seems-not-to-be-updated-what-can-i-do","text":"Please have a look at the Admin panel under DB updates ( /admin/dbsync/ ) and follow the link to check database structure . This will start a background process to check if the structure is up to the current definition. You can manually execute the structure update from the CLI in the base directory of your Friendica installation by running the following command: bin/console dbstructure update if there occur any errors, please contact the support forum .","title":"The Database structure seems not to be updated. What can I do?"},{"location":"admin/improve-performance/","tags":["admin","performance"],"text":"How to improve the performance of a Friendica site # Feel free to ask in the Friendica support forum if you need some clarification about the following instructions or if you need help in any other way. System configuration # Please go to /admin/site/ on your system and change the following values: Set \"JPEG image quality\" to 50. This value reduces the data that is sent from the server to the client. 50 is a value that doesn't influence image quality too much. Set \"OStatus conversation completion interval\" to \"never\". If you have many OStatus contacts then completing of conversations can take some time. Since you will miss several comments in OStatus threads, you maybe should consider the option \"At post arrival\" instead. Enable \"Use MySQL full text engine\" When using MyISAM (default) or InnoDB on MariaDB 10 this speeds up search. Addons # Active the following addons: rendertime rendertime # This addon doesn't speed up your system. It helps to analyze your bottlenecks. When enabled you see some values at the bottom of every page. They show your performance problems. Performance: Database: 0.244, Network: 0.002, Rendering: 0.044, Parser: 0.001, I/O: 0.021, Other: 0.237, Total: 0.548 Database: This is the time for all database queries Network: Time that is needed to fetch content from external sites Rendering: Time for theme rendering Parser: The time that the BBCode parser needed to create the output I/O: Time for local file access Others: Everything else :) Total: The sum of all above values Apache Webserver # The following Apache modules are recommended: Cache-Control # This module tells the client to cache the content of static files so that they aren't fetched with every request. Enable the module mod_expires by typing in a2enmod expires as root. Please add the following lines to your site configuration in the \"directory\" context. ExpiresActive on ExpiresDefault \"access plus 1 week\" Also see the Apache 2.2 / 2.4 documentation. Compress content # This module compresses the traffic between the web server and the client. Enable the module mod_deflate by typing in a2enmod deflate as root. Also see the Apache 2.2 / 2.4 documentation. PHP # FCGI # When using Apache think about using FCGI. In a Debian-based distribution you will need to install the packages named php5-cgi and libapache2-mod-fcgid . Please refer to external documentation for a more detailed explanation how to set up a system based upon FCGI. Database # There are scripts like tuning-primer.sh and mysqltuner.pl that analyze your database server and give hints on values that could be changed. Please enable the slow query log. This helps to find performance problems.","title":"Improve Performance"},{"location":"admin/improve-performance/#how-to-improve-the-performance-of-a-friendica-site","text":"Feel free to ask in the Friendica support forum if you need some clarification about the following instructions or if you need help in any other way.","title":"How to improve the performance of a Friendica site"},{"location":"admin/improve-performance/#system-configuration","text":"Please go to /admin/site/ on your system and change the following values: Set \"JPEG image quality\" to 50. This value reduces the data that is sent from the server to the client. 50 is a value that doesn't influence image quality too much. Set \"OStatus conversation completion interval\" to \"never\". If you have many OStatus contacts then completing of conversations can take some time. Since you will miss several comments in OStatus threads, you maybe should consider the option \"At post arrival\" instead. Enable \"Use MySQL full text engine\" When using MyISAM (default) or InnoDB on MariaDB 10 this speeds up search.","title":"System configuration"},{"location":"admin/improve-performance/#addons","text":"Active the following addons: rendertime","title":"Addons"},{"location":"admin/improve-performance/#rendertime","text":"This addon doesn't speed up your system. It helps to analyze your bottlenecks. When enabled you see some values at the bottom of every page. They show your performance problems. Performance: Database: 0.244, Network: 0.002, Rendering: 0.044, Parser: 0.001, I/O: 0.021, Other: 0.237, Total: 0.548 Database: This is the time for all database queries Network: Time that is needed to fetch content from external sites Rendering: Time for theme rendering Parser: The time that the BBCode parser needed to create the output I/O: Time for local file access Others: Everything else :) Total: The sum of all above values","title":"rendertime"},{"location":"admin/improve-performance/#apache-webserver","text":"The following Apache modules are recommended:","title":"Apache Webserver"},{"location":"admin/improve-performance/#cache-control","text":"This module tells the client to cache the content of static files so that they aren't fetched with every request. Enable the module mod_expires by typing in a2enmod expires as root. Please add the following lines to your site configuration in the \"directory\" context. ExpiresActive on ExpiresDefault \"access plus 1 week\" Also see the Apache 2.2 / 2.4 documentation.","title":"Cache-Control"},{"location":"admin/improve-performance/#compress-content","text":"This module compresses the traffic between the web server and the client. Enable the module mod_deflate by typing in a2enmod deflate as root. Also see the Apache 2.2 / 2.4 documentation.","title":"Compress content"},{"location":"admin/improve-performance/#php","text":"","title":"PHP"},{"location":"admin/improve-performance/#fcgi","text":"When using Apache think about using FCGI. In a Debian-based distribution you will need to install the packages named php5-cgi and libapache2-mod-fcgid . Please refer to external documentation for a more detailed explanation how to set up a system based upon FCGI.","title":"FCGI"},{"location":"admin/improve-performance/#database","text":"There are scripts like tuning-primer.sh and mysqltuner.pl that analyze your database server and give hints on values that could be changed. Please enable the slow query log. This helps to find performance problems.","title":"Database"},{"location":"admin/install/","tags":["admin","install"],"text":"Friendica Installation # We've tried very hard to ensure that Friendica will run on commodity hosting platforms - such as those used to host WordPress blogs and Drupal websites. We offer a manual and an automatic installation. But be aware that Friendica 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 Friendica. Many will. But please review the requirements and confirm these with your hosting provider prior to installation. Support # If you encounter installation issues, please let us know via the helper or the developer forum or file an issue . 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. Prerequisites # Choose a domain name or subdomain name for your server. Put some thought into this. While changing it after installation is supported, things still might break. Setup HTTPS on your domain. Requirements # Apache with mod-rewrite enabled and \"Options All\" so you can use a local .htaccess file PHP 7.3+ (PHP8 is not fully supported yet) PHP command line access with register_argc_argv set to true in the php.ini file Curl, GD, GMP, PDO, mbstrings, MySQLi, hash, xml, zip and OpenSSL extensions The POSIX module of PHP needs to be activated (e.g. RHEL, CentOS have disabled it) Some form of email server or email gateway such that PHP mail() works. If you cannot set up your own email server, you can use the phpmailer addon and use a remote SMTP server. MySQL 5.6+ or an equivalent alternative for MySQL (MariaDB, Percona Server etc.) ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows) installation into a top-level domain or subdomain (without a directory/path component in the URL) is RECOMMENDED. Directory paths will not be as convenient to use and have not been thoroughly tested. This is REQUIRED if you wish to communicate with the Diaspora network. If your hosting provider doesn't allow Unix shell access, you might have trouble getting everything to work. For alternative server configurations (such as Nginx server and MariaDB database engine), refer to the Friendica wiki . Optional # PHP ImageMagick extension (php-imagick) for animated GIF support. Installation procedure # Alternative Installation Methods # This guide will walk you through the manual installation process of Friendica. If this is nothing for you, you might be interested in the Friendica Docker image or how to install Friendica with YunoHost . Get Friendica # Download the full archive of the stable release of Friendica core and the addons from the project homepage . Make sure that the version of the Friendica archive and the addons match. Unpack the Friendica files into the root of your web server document area. If you copy the directory tree to your webserver, make sure that you also copy .htaccess-dist - as \"dot\" files are often hidden and aren't normally copied. OR Clone the friendica/friendica GitHub repository and import dependencies. This makes the software much easier to update. The Linux commands to clone the repository into a directory \"mywebsite\" would be git clone https://github.com/friendica/friendica.git -b stable mywebsite cd mywebsite bin/composer.phar install --no-dev Make sure the folder view/smarty3 exists and is writable by the webserver user, in this case www-data mkdir -p view/smarty3 chown www-data:www-data view/smarty3 chmod 775 view/smarty3 Get the addons by going into your website folder. cd mywebsite Clone the addon repository (separately): git clone https://github.com/friendica/friendica-addons.git -b stable addon If you want to use the development version of Friendica you can switch to the develop branch in the repository by running git checkout develop bin/composer.phar install cd addon git checkout develop Be aware that the develop branch is unstable and may break your Friendica node at any time. You should have a recent backup before updating. If you encounter a bug, please let us know. Create a database # Create an empty database and note the access details (hostname, username, password, database name). Generate a strong password, then enter mysql with: mysql Then use the following script using the password you just generated: CREATE DATABASE friendicadb; CREATE USER 'friendica'@'localhost' IDENTIFIED BY '<<your mysql password here>>'; GRANT ALL ON friendicadb.* TO 'friendica'@'localhost'; FLUSH PRIVILEGES; EXIT; Friendica needs the permission to create and delete fields and tables in its own database. Please check the troubleshooting section if running on MySQL 5.7.17 or newer. Option A: Run the installer # Before you point your web browser to the new site you need to copy .htaccess-dist to .htaccess for Apache installs. Follow the instructions. Please note any error messages and correct these before continuing. If you need to specify a port for the connection to the database, you can do so in the host name setting for the database. If the manual installation fails for any reason, check the following: Does config/local.config.php exist? If not, edit config/local-sample.config.php and change the system settings. Rename to config/local.config.php . Is the database populated? If not, import the contents of database.sql with phpmyadmin or the mysql command line. At this point visit your website again, and register your personal account. Registration errors should all be recoverable automatically. If you get any critical failure at this point, it generally indicates the database was not installed correctly. You might wish to move/rename config/local.config.php to another name and empty (called 'dropping') the database tables, so that you can start fresh. Option B: Run the automatic installation script # You have the following options to automatically install Friendica: - creating a prepared config file (f.e. prepared.config.php ) - using environment variables (f.e. MYSQL_HOST ) - using options (f.e. --dbhost <host> ) You can combine environment variables and options, but be aware that options are prioritized over environment variables. For more information during the installation, you can use this command line option bin/console autoinstall -v If you wish to include all optional checks, use -a like this statement: bin/console autoinstall -a If the automatic installation fails for any reason, check the following: Does config/local.config.php already exist? If yes, the automatic installation won't start Are the options in the config/local.config.php correct? If not, edit them directly. Is the empty MySQL-database created? If not, create it. B.1: Config file # You can use a prepared config file like \"local-sample.config.php\". Navigate to the main Friendica directory and execute the following command: bin/console autoinstall -f <prepared.config.php> B.2: Environment variables # There are two types of environment variables. - those you can use in normal mode too (Currently just database credentials ) - those you can only use during installation (because Friendica will normally ignore it) You can use the options during installation too and skip some environment variables. Database credentials if you don't use the option --savedb during installation, the DB credentials will not be saved in the config/local.config.php . MYSQL_HOST The host of the mysql/mariadb database MYSQL_PORT The port of the mysql/mariadb database MYSQL_USERNAME The username of the mysql database login (used for mysql) MYSQL_USER The username of the mysql database login (used for mariadb) MYSQL_PASSWORD The password of the mysql/mariadb database login MYSQL_DATABASE The name of the mysql/mariadb database Friendica settings These variables won't be used at normal Friendica runtime. Instead, they get saved into config/local.config.php . FRIENDICA_URL_PATH The URL path of Friendica (f.e. '/friendica') FRIENDICA_PHP_PATH The path of the PHP binary FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access) FRIENDICA_TZ The timezone of Friendica FRIENDICA_LANG The language of Friendica Navigate to the main Friendica directory and execute the following command: bin/console autoinstall [--savedb] B.3: Execution options # All options will be saved in the config/local.config.php and are overruling the associated environment variables. -H|--dbhost <host> The host of the mysql/mariadb database (env MYSQL_HOST ) -p|--dbport <port> The port of the mysql/mariadb database (env MYSQL_PORT ) -U|--dbuser <username> The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME ) -P|--dbpass <password> The password of the mysql/mariadb database login (env MYSQL_PASSWORD ) -d|--dbdata <database> The name of the mysql/mariadb database (env MYSQL_DATABASE ) -u|--urlpath <url_path> The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH ) -b|--phppath <php_path> The path of the PHP binary (env FRIENDICA_PHP_PATH ) -A|--admin <mail> The admin email address of Friendica (env FRIENDICA_ADMIN_MAIL ) -T|--tz <timezone> The timezone of Friendica (env FRIENDICA_TZ ) -L|--lang <language> The language of Friendica (env FRIENDICA_LANG ) Navigate to the main Friendica directory and execute the following command: bin/console autoinstall [options] Prepare .htaccess file # Copy .htaccess-dist to .htaccess (be careful under Windows) to have working mod-rewrite again. If you have installed Friendica into a subdirectory, like /friendica/ set this path in RewriteBase accordingly. Example: cp .htacces-dist .htaccess Note : Do not rename the .htaccess-dist file as it is tracked by GIT and renaming will cause a dirty working directory. Verify the \"host-meta\" page is working # Friendica should respond automatically to important addresses under the /.well-known/ rewrite path. One critical URL would look like, for example: https://example.com/.well-known/host-meta It must be visible to the public and must respond with an XML file that is automatically customized to your site. If that URL is not working, it is possible that some other software is using the /.well-known/ path. Other symptoms may include an error message in the Admin settings that says \"host-meta is not reachable on your system. This is a severe configuration issue that prevents server to server communication.\" Another common error related to host-meta is the \"Invalid profile URL.\" Check for a .well-known directory that did not come with Friendica. The preferred configuration is to remove the directory, however this is not always possible. If there is any /.well-known/.htaccess file, it could interfere with this Friendica core requirement. You should remove any RewriteRules from that file, or remove that whole file if appropriate. It may be necessary to chmod the /.well-known/.htaccess file if you were not given write permissions by default. Register the admin account # At this point visit your website again, and register your personal account with the same email as in the config.admin_email config value. Registration errors should all be recoverable automatically. If you get any critical failure at this point, it generally indicates the database was not installed correctly. You might wish to delete/rename config/local.config.php to another name and drop all the database tables so that you can start fresh. Post Install Configuration # (REQUIRED) Background tasks # Set up a cron job or scheduled task to run the worker once every 5-10 minutes in order to perform background processing. Example: cd /base/directory; /path/to/php bin/worker.php Change \"/base/directory\", and \"/path/to/php\" as appropriate for your situation. cron job for worker # If you are using a Linux server, run \"crontab -e\" and add a line like the one shown, substituting for your unique paths and settings: */10 * * * * cd /home/myname/mywebsite; /usr/bin/php bin/worker.php You can generally find the location of PHP by executing \"which php\". If you run into trouble with this section please contact your hosting provider for assistance. Friendica will not work correctly if you cannot perform this step. If it is not possible to set up a cron job then please activate the \"frontend worker\" in the administration interface. Once you have installed Friendica and created an admin account as part of the process, you can access the admin panel of your installation and do most of the server wide configuration from there. worker alternative: daemon # Otherwise, you\u2019ll need to use the command line on your remote server and start the Friendica daemon (background task) using the following command: cd /path/to/friendica; php bin/daemon.php start Once started, you can check the daemon status using the following command: cd /path/to/friendica; php bin/daemon.php status After a server restart or any other failure, the daemon needs to be restarted. This could be achieved by a cronjob. (RECOMMENDED) Logging & Log Rotation # At this point it is recommended that you set up logging and logrotate. To do so please visit Settings and search the 'Logs' section for more information. (RECOMMENDED) Set up a backup plan # Bad things will happen. Let there be a hardware failure, a corrupted database or whatever you can think of. So once the installation of your Friendica node is done, you should make yourself a backup plan. The most important file is the config/local.config.php file. As it stores all your data, you should also have a recent dump of your Friendica database at hand, should you have to recover your node. (OPTIONAL) Reverse-proxying and HTTPS # Friendica looks for some well-known HTTP headers indicating a reverse-proxy terminating an HTTPS connection. While the standard from RFC 7239 specifies the use of the Forwarded header. Forwarded: for=192.0.2.1; proto=https; by=192.0.2.2 Friendica also supports a number on non-standard headers in common use. X-Forwarded-Proto: https Front-End-Https: on X-Forwarded-Ssl: on It is however preferable to use the standard approach if configuring a new server. Troubleshooting # \"System is currently unavailable. Please try again later\" # Check your database settings. It usually means your database could not be opened or accessed. If the database resides on the same machine, check that the database server name is \"localhost\". 500 Internal Error # This could be the result of one of our Apache directives not being supported by your version of Apache. Examine your apache server logs. You might remove the line \"Options -Indexes\" from the .htaccess file if you are using a Windows server as this has been known to cause problems. Also check your file permissions. Your website and all contents must generally be world-readable. It is likely that your web server reported the source of the problem in its error log files. Please review these system error logs to determine what caused the issue. Often this will need to be resolved with your hosting provider or (if self-hosted) your web server configuration. 400 and 4xx \"File not found\" errors # First check your file permissions. Your website and all contents must generally be world-readable. Ensure that mod-rewrite is installed and working, and that your .htaccess file is being used. To verify the latter, create a file test.out containing the word \"test\" in the top directory of Friendica, make it world readable and point your web browser to http://yoursitenamehere.com/test.out This file should be blocked. You should get a permission denied message. If you see the word \"test\" your Apache configuration is not allowing your .htaccess file to be used (there are rules in this file to block access to any file with .out at the end, as these are typically used for system logs). Make certain the .htaccess file exists and is readable by everybody, then look for the existence of \"AllowOverride None\" in the Apache server configuration for your site. This will need to be changed to \"AllowOverride All\". If you do not see the word \"test\", your .htaccess is working, but it is likely that mod-rewrite is not installed in your web server or is not working. On most Linux flavors: % a2enmod rewrite % /etc/init.d/apache2 restart Consult your hosting provider, experts on your particular Linux distribution or (if Windows) the provider of your Apache server software if you need to change either of these and can not figure out how. There is a lot of help available on the web. Search \"mod-rewrite\" along with the name of your operating system distribution or Apache package (if using Windows). Unable to write the file config/local.config.php due to permissions issues # Create an empty config/local.config.php file and apply world-write permission. On Linux: % touch config/local.config.php % chmod 664 config/local.config.php Retry the installation. As soon as the database has been created, * this is important * ** % chmod 644 config/local.config.php Suhosin issues # Some configurations with \"suhosin\" security are configured without an ability to run external processes. Friendica requires this ability. Following are some notes provided by one of our members. On my server I use the php protection system Suhosin [http://www.hardened-php.net/suhosin/]. One of the things it does is to block certain functions like proc_open, as configured in /etc/php5/conf.d/suhosin.ini : suhosin.executor.func.blacklist = proc_open, ... For those sites like Friendica that really need these functions they can be enabled, e.g. in /etc/apache2/sites-available/friendica : php_admin_value suhosin.executor.func.blacklist none php_admin_value suhosin.executor.eval.blacklist none This enables every function for Friendica if accessed via browser, but not for the cronjob that is called via php command line. I attempted to enable it for cron by using something like: /10 * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php \\ -d suhosin.executor.func.blacklist=none \\ -d suhosin.executor.eval.blacklist=none -f bin/worker.php This worked well for simple test cases, but the friendica-cron still failed with a fatal error: suhosin[22962]: ALERT - function within blacklist called: proc_open() (attacker 'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php', line 1341) After a while I noticed, that bin/worker.php calls further PHP scripts via proc_open . These scripts themselves also use proc_open and fail, because they are NOT called with -d suhosin.executor.func.blacklist=none . So the simple solution is to put the correct parameters into config/local.config.php : 'config' => [ //Location of PHP command line processor 'php_path' => '/usr/bin/php -d suhosin.executor.func.blacklist=none \\ -d suhosin.executor.eval.blacklist=none', ], This is obvious as soon as you notice that the friendica-cron uses proc_open to execute PHP scripts that also use proc_open , but it took me quite some time to find that out. I hope this saves some time for other people using suhosin with function blocklists. Unable to create all mysql tables on MySQL 5.7.17 or newer # If the setup fails to create all the database tables and/or manual creation from the command line fails, with this error: ERROR 1067 (42000) at line XX: Invalid default value for 'created' You need to adjust your my.cnf and add the following setting under the [mysqld] section: sql_mode = ''; After that, restart mysql and try again. Your worker never or rarely runs # Friendica is coded to always play nice. It checks whether the host machine is idle enough and if it seems to be overloaded, it intermittently refuses to process the worker queue. Such checks originate from the days of single-user single-core machines and involves thresholds that you should adjust based on the number of exclusive CPU cores you have. See this issue for more information: https://github.com/friendica/friendica/issues/10131 If you want to be neighborly and are using a shared web hosting PaaS provider, especially within the free tier, you need to set maxloadavg to say twice the maximum value of /proc/loadavg during peak hours. If you have the whole (virtual) machine for yourself such as in case of an IaaS VPS, you can set it to orders of magnitude higher than its commonly observed value, such as 1000. You should instead enact limits in your web server configuration based on the number of entry processes to cap the concurrent memory usage of your PHP processes. See RLimitMEM , RLimitCPU , RLimitNPROC , StartServers , ServerLimit , MaxRequestsPerChild , pm.max_children , pm.start_servers and related options in your server. Error uploading even small image files # You tried to upload an image up to 100kB, and it failed. You may not have the ownership or file mode set correctly if you are using the file system storage backend. Change the backend to database. If this solves it, that is what needs to be fixed. Error uploading large files # You may find 413 Request Entity Too Large or 500 Internal Error in the network inspector of the browser if the file is too large, for example if it is a video. First try to upload a very small file, up to 100kB. If that succeeds, you will need to increase limits at multiple places, including on any web proxy that you are using. In your PHP ini: upload_max_filesize : defaults to 2MB post_max_size : defaults to 8MB, must be greater than upload_max_filesize memory_limit : defaults to 128MB, must be greater than post_max_size You should verify whether you changed them in the right file by checking the web interface at the end of the overview on the Admin panel. For Apache2: LimitRequestBody : defaults to unlimited SSLRenegBufferSize : defaults to 128kB, only if your site uses TLS and perhaps only when using SSLVerifyClient or SSLVerifyDepth For nginx: client_max_body_size : defaults to 1MB If you are using the database backend for storage, increase this in your SQL configuration: max_allowed_packet : defaults to 32MB If you use the ModSecurity WAF: SecRequestBodyLimit : defaults to 12MB SecRequestBodyNoFilesLimit : defaults to 128kB, should not apply to Friendica","title":"Installation"},{"location":"admin/install/#friendica-installation","text":"We've tried very hard to ensure that Friendica will run on commodity hosting platforms - such as those used to host WordPress blogs and Drupal websites. We offer a manual and an automatic installation. But be aware that Friendica 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 Friendica. Many will. But please review the requirements and confirm these with your hosting provider prior to installation.","title":"Friendica Installation"},{"location":"admin/install/#support","text":"If you encounter installation issues, please let us know via the helper or the developer forum or file an issue . 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.","title":"Support"},{"location":"admin/install/#prerequisites","text":"Choose a domain name or subdomain name for your server. Put some thought into this. While changing it after installation is supported, things still might break. Setup HTTPS on your domain.","title":"Prerequisites"},{"location":"admin/install/#requirements","text":"Apache with mod-rewrite enabled and \"Options All\" so you can use a local .htaccess file PHP 7.3+ (PHP8 is not fully supported yet) PHP command line access with register_argc_argv set to true in the php.ini file Curl, GD, GMP, PDO, mbstrings, MySQLi, hash, xml, zip and OpenSSL extensions The POSIX module of PHP needs to be activated (e.g. RHEL, CentOS have disabled it) Some form of email server or email gateway such that PHP mail() works. If you cannot set up your own email server, you can use the phpmailer addon and use a remote SMTP server. MySQL 5.6+ or an equivalent alternative for MySQL (MariaDB, Percona Server etc.) ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows) installation into a top-level domain or subdomain (without a directory/path component in the URL) is RECOMMENDED. Directory paths will not be as convenient to use and have not been thoroughly tested. This is REQUIRED if you wish to communicate with the Diaspora network. If your hosting provider doesn't allow Unix shell access, you might have trouble getting everything to work. For alternative server configurations (such as Nginx server and MariaDB database engine), refer to the Friendica wiki .","title":"Requirements"},{"location":"admin/install/#optional","text":"PHP ImageMagick extension (php-imagick) for animated GIF support.","title":"Optional"},{"location":"admin/install/#installation-procedure","text":"","title":"Installation procedure"},{"location":"admin/install/#alternative-installation-methods","text":"This guide will walk you through the manual installation process of Friendica. If this is nothing for you, you might be interested in the Friendica Docker image or how to install Friendica with YunoHost .","title":"Alternative Installation Methods"},{"location":"admin/install/#get-friendica","text":"Download the full archive of the stable release of Friendica core and the addons from the project homepage . Make sure that the version of the Friendica archive and the addons match. Unpack the Friendica files into the root of your web server document area. If you copy the directory tree to your webserver, make sure that you also copy .htaccess-dist - as \"dot\" files are often hidden and aren't normally copied. OR Clone the friendica/friendica GitHub repository and import dependencies. This makes the software much easier to update. The Linux commands to clone the repository into a directory \"mywebsite\" would be git clone https://github.com/friendica/friendica.git -b stable mywebsite cd mywebsite bin/composer.phar install --no-dev Make sure the folder view/smarty3 exists and is writable by the webserver user, in this case www-data mkdir -p view/smarty3 chown www-data:www-data view/smarty3 chmod 775 view/smarty3 Get the addons by going into your website folder. cd mywebsite Clone the addon repository (separately): git clone https://github.com/friendica/friendica-addons.git -b stable addon If you want to use the development version of Friendica you can switch to the develop branch in the repository by running git checkout develop bin/composer.phar install cd addon git checkout develop Be aware that the develop branch is unstable and may break your Friendica node at any time. You should have a recent backup before updating. If you encounter a bug, please let us know.","title":"Get Friendica"},{"location":"admin/install/#create-a-database","text":"Create an empty database and note the access details (hostname, username, password, database name). Generate a strong password, then enter mysql with: mysql Then use the following script using the password you just generated: CREATE DATABASE friendicadb; CREATE USER 'friendica'@'localhost' IDENTIFIED BY '<<your mysql password here>>'; GRANT ALL ON friendicadb.* TO 'friendica'@'localhost'; FLUSH PRIVILEGES; EXIT; Friendica needs the permission to create and delete fields and tables in its own database. Please check the troubleshooting section if running on MySQL 5.7.17 or newer.","title":"Create a database"},{"location":"admin/install/#option-a-run-the-installer","text":"Before you point your web browser to the new site you need to copy .htaccess-dist to .htaccess for Apache installs. Follow the instructions. Please note any error messages and correct these before continuing. If you need to specify a port for the connection to the database, you can do so in the host name setting for the database. If the manual installation fails for any reason, check the following: Does config/local.config.php exist? If not, edit config/local-sample.config.php and change the system settings. Rename to config/local.config.php . Is the database populated? If not, import the contents of database.sql with phpmyadmin or the mysql command line. At this point visit your website again, and register your personal account. Registration errors should all be recoverable automatically. If you get any critical failure at this point, it generally indicates the database was not installed correctly. You might wish to move/rename config/local.config.php to another name and empty (called 'dropping') the database tables, so that you can start fresh.","title":"Option A: Run the installer"},{"location":"admin/install/#option-b-run-the-automatic-installation-script","text":"You have the following options to automatically install Friendica: - creating a prepared config file (f.e. prepared.config.php ) - using environment variables (f.e. MYSQL_HOST ) - using options (f.e. --dbhost <host> ) You can combine environment variables and options, but be aware that options are prioritized over environment variables. For more information during the installation, you can use this command line option bin/console autoinstall -v If you wish to include all optional checks, use -a like this statement: bin/console autoinstall -a If the automatic installation fails for any reason, check the following: Does config/local.config.php already exist? If yes, the automatic installation won't start Are the options in the config/local.config.php correct? If not, edit them directly. Is the empty MySQL-database created? If not, create it.","title":"Option B: Run the automatic installation script"},{"location":"admin/install/#b1-config-file","text":"You can use a prepared config file like \"local-sample.config.php\". Navigate to the main Friendica directory and execute the following command: bin/console autoinstall -f <prepared.config.php>","title":"B.1: Config file"},{"location":"admin/install/#b2-environment-variables","text":"There are two types of environment variables. - those you can use in normal mode too (Currently just database credentials ) - those you can only use during installation (because Friendica will normally ignore it) You can use the options during installation too and skip some environment variables. Database credentials if you don't use the option --savedb during installation, the DB credentials will not be saved in the config/local.config.php . MYSQL_HOST The host of the mysql/mariadb database MYSQL_PORT The port of the mysql/mariadb database MYSQL_USERNAME The username of the mysql database login (used for mysql) MYSQL_USER The username of the mysql database login (used for mariadb) MYSQL_PASSWORD The password of the mysql/mariadb database login MYSQL_DATABASE The name of the mysql/mariadb database Friendica settings These variables won't be used at normal Friendica runtime. Instead, they get saved into config/local.config.php . FRIENDICA_URL_PATH The URL path of Friendica (f.e. '/friendica') FRIENDICA_PHP_PATH The path of the PHP binary FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access) FRIENDICA_TZ The timezone of Friendica FRIENDICA_LANG The language of Friendica Navigate to the main Friendica directory and execute the following command: bin/console autoinstall [--savedb]","title":"B.2: Environment variables"},{"location":"admin/install/#b3-execution-options","text":"All options will be saved in the config/local.config.php and are overruling the associated environment variables. -H|--dbhost <host> The host of the mysql/mariadb database (env MYSQL_HOST ) -p|--dbport <port> The port of the mysql/mariadb database (env MYSQL_PORT ) -U|--dbuser <username> The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME ) -P|--dbpass <password> The password of the mysql/mariadb database login (env MYSQL_PASSWORD ) -d|--dbdata <database> The name of the mysql/mariadb database (env MYSQL_DATABASE ) -u|--urlpath <url_path> The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH ) -b|--phppath <php_path> The path of the PHP binary (env FRIENDICA_PHP_PATH ) -A|--admin <mail> The admin email address of Friendica (env FRIENDICA_ADMIN_MAIL ) -T|--tz <timezone> The timezone of Friendica (env FRIENDICA_TZ ) -L|--lang <language> The language of Friendica (env FRIENDICA_LANG ) Navigate to the main Friendica directory and execute the following command: bin/console autoinstall [options]","title":"B.3: Execution options"},{"location":"admin/install/#prepare-htaccess-file","text":"Copy .htaccess-dist to .htaccess (be careful under Windows) to have working mod-rewrite again. If you have installed Friendica into a subdirectory, like /friendica/ set this path in RewriteBase accordingly. Example: cp .htacces-dist .htaccess Note : Do not rename the .htaccess-dist file as it is tracked by GIT and renaming will cause a dirty working directory.","title":"Prepare .htaccess file"},{"location":"admin/install/#verify-the-host-meta-page-is-working","text":"Friendica should respond automatically to important addresses under the /.well-known/ rewrite path. One critical URL would look like, for example: https://example.com/.well-known/host-meta It must be visible to the public and must respond with an XML file that is automatically customized to your site. If that URL is not working, it is possible that some other software is using the /.well-known/ path. Other symptoms may include an error message in the Admin settings that says \"host-meta is not reachable on your system. This is a severe configuration issue that prevents server to server communication.\" Another common error related to host-meta is the \"Invalid profile URL.\" Check for a .well-known directory that did not come with Friendica. The preferred configuration is to remove the directory, however this is not always possible. If there is any /.well-known/.htaccess file, it could interfere with this Friendica core requirement. You should remove any RewriteRules from that file, or remove that whole file if appropriate. It may be necessary to chmod the /.well-known/.htaccess file if you were not given write permissions by default.","title":"Verify the \"host-meta\" page is working"},{"location":"admin/install/#register-the-admin-account","text":"At this point visit your website again, and register your personal account with the same email as in the config.admin_email config value. Registration errors should all be recoverable automatically. If you get any critical failure at this point, it generally indicates the database was not installed correctly. You might wish to delete/rename config/local.config.php to another name and drop all the database tables so that you can start fresh.","title":"Register the admin account"},{"location":"admin/install/#post-install-configuration","text":"","title":"Post Install Configuration"},{"location":"admin/install/#required-background-tasks","text":"Set up a cron job or scheduled task to run the worker once every 5-10 minutes in order to perform background processing. Example: cd /base/directory; /path/to/php bin/worker.php Change \"/base/directory\", and \"/path/to/php\" as appropriate for your situation.","title":"(REQUIRED) Background tasks"},{"location":"admin/install/#cron-job-for-worker","text":"If you are using a Linux server, run \"crontab -e\" and add a line like the one shown, substituting for your unique paths and settings: */10 * * * * cd /home/myname/mywebsite; /usr/bin/php bin/worker.php You can generally find the location of PHP by executing \"which php\". If you run into trouble with this section please contact your hosting provider for assistance. Friendica will not work correctly if you cannot perform this step. If it is not possible to set up a cron job then please activate the \"frontend worker\" in the administration interface. Once you have installed Friendica and created an admin account as part of the process, you can access the admin panel of your installation and do most of the server wide configuration from there.","title":"cron job for worker"},{"location":"admin/install/#worker-alternative-daemon","text":"Otherwise, you\u2019ll need to use the command line on your remote server and start the Friendica daemon (background task) using the following command: cd /path/to/friendica; php bin/daemon.php start Once started, you can check the daemon status using the following command: cd /path/to/friendica; php bin/daemon.php status After a server restart or any other failure, the daemon needs to be restarted. This could be achieved by a cronjob.","title":"worker alternative: daemon"},{"location":"admin/install/#recommended-logging-log-rotation","text":"At this point it is recommended that you set up logging and logrotate. To do so please visit Settings and search the 'Logs' section for more information.","title":"(RECOMMENDED) Logging &amp; Log Rotation"},{"location":"admin/install/#recommended-set-up-a-backup-plan","text":"Bad things will happen. Let there be a hardware failure, a corrupted database or whatever you can think of. So once the installation of your Friendica node is done, you should make yourself a backup plan. The most important file is the config/local.config.php file. As it stores all your data, you should also have a recent dump of your Friendica database at hand, should you have to recover your node.","title":"(RECOMMENDED) Set up a backup plan"},{"location":"admin/install/#optional-reverse-proxying-and-https","text":"Friendica looks for some well-known HTTP headers indicating a reverse-proxy terminating an HTTPS connection. While the standard from RFC 7239 specifies the use of the Forwarded header. Forwarded: for=192.0.2.1; proto=https; by=192.0.2.2 Friendica also supports a number on non-standard headers in common use. X-Forwarded-Proto: https Front-End-Https: on X-Forwarded-Ssl: on It is however preferable to use the standard approach if configuring a new server.","title":"(OPTIONAL) Reverse-proxying and HTTPS"},{"location":"admin/install/#troubleshooting","text":"","title":"Troubleshooting"},{"location":"admin/install/#system-is-currently-unavailable-please-try-again-later","text":"Check your database settings. It usually means your database could not be opened or accessed. If the database resides on the same machine, check that the database server name is \"localhost\".","title":"\"System is currently unavailable. Please try again later\""},{"location":"admin/install/#500-internal-error","text":"This could be the result of one of our Apache directives not being supported by your version of Apache. Examine your apache server logs. You might remove the line \"Options -Indexes\" from the .htaccess file if you are using a Windows server as this has been known to cause problems. Also check your file permissions. Your website and all contents must generally be world-readable. It is likely that your web server reported the source of the problem in its error log files. Please review these system error logs to determine what caused the issue. Often this will need to be resolved with your hosting provider or (if self-hosted) your web server configuration.","title":"500 Internal Error"},{"location":"admin/install/#400-and-4xx-file-not-found-errors","text":"First check your file permissions. Your website and all contents must generally be world-readable. Ensure that mod-rewrite is installed and working, and that your .htaccess file is being used. To verify the latter, create a file test.out containing the word \"test\" in the top directory of Friendica, make it world readable and point your web browser to http://yoursitenamehere.com/test.out This file should be blocked. You should get a permission denied message. If you see the word \"test\" your Apache configuration is not allowing your .htaccess file to be used (there are rules in this file to block access to any file with .out at the end, as these are typically used for system logs). Make certain the .htaccess file exists and is readable by everybody, then look for the existence of \"AllowOverride None\" in the Apache server configuration for your site. This will need to be changed to \"AllowOverride All\". If you do not see the word \"test\", your .htaccess is working, but it is likely that mod-rewrite is not installed in your web server or is not working. On most Linux flavors: % a2enmod rewrite % /etc/init.d/apache2 restart Consult your hosting provider, experts on your particular Linux distribution or (if Windows) the provider of your Apache server software if you need to change either of these and can not figure out how. There is a lot of help available on the web. Search \"mod-rewrite\" along with the name of your operating system distribution or Apache package (if using Windows).","title":"400 and 4xx \"File not found\" errors"},{"location":"admin/install/#unable-to-write-the-file-configlocalconfigphp-due-to-permissions-issues","text":"Create an empty config/local.config.php file and apply world-write permission. On Linux: % touch config/local.config.php % chmod 664 config/local.config.php Retry the installation. As soon as the database has been created, * this is important * ** % chmod 644 config/local.config.php","title":"Unable to write the file config/local.config.php due to permissions issues"},{"location":"admin/install/#suhosin-issues","text":"Some configurations with \"suhosin\" security are configured without an ability to run external processes. Friendica requires this ability. Following are some notes provided by one of our members. On my server I use the php protection system Suhosin [http://www.hardened-php.net/suhosin/]. One of the things it does is to block certain functions like proc_open, as configured in /etc/php5/conf.d/suhosin.ini : suhosin.executor.func.blacklist = proc_open, ... For those sites like Friendica that really need these functions they can be enabled, e.g. in /etc/apache2/sites-available/friendica : php_admin_value suhosin.executor.func.blacklist none php_admin_value suhosin.executor.eval.blacklist none This enables every function for Friendica if accessed via browser, but not for the cronjob that is called via php command line. I attempted to enable it for cron by using something like: /10 * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php \\ -d suhosin.executor.func.blacklist=none \\ -d suhosin.executor.eval.blacklist=none -f bin/worker.php This worked well for simple test cases, but the friendica-cron still failed with a fatal error: suhosin[22962]: ALERT - function within blacklist called: proc_open() (attacker 'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php', line 1341) After a while I noticed, that bin/worker.php calls further PHP scripts via proc_open . These scripts themselves also use proc_open and fail, because they are NOT called with -d suhosin.executor.func.blacklist=none . So the simple solution is to put the correct parameters into config/local.config.php : 'config' => [ //Location of PHP command line processor 'php_path' => '/usr/bin/php -d suhosin.executor.func.blacklist=none \\ -d suhosin.executor.eval.blacklist=none', ], This is obvious as soon as you notice that the friendica-cron uses proc_open to execute PHP scripts that also use proc_open , but it took me quite some time to find that out. I hope this saves some time for other people using suhosin with function blocklists.","title":"Suhosin issues"},{"location":"admin/install/#unable-to-create-all-mysql-tables-on-mysql-5717-or-newer","text":"If the setup fails to create all the database tables and/or manual creation from the command line fails, with this error: ERROR 1067 (42000) at line XX: Invalid default value for 'created' You need to adjust your my.cnf and add the following setting under the [mysqld] section: sql_mode = ''; After that, restart mysql and try again.","title":"Unable to create all mysql tables on MySQL 5.7.17 or newer"},{"location":"admin/install/#your-worker-never-or-rarely-runs","text":"Friendica is coded to always play nice. It checks whether the host machine is idle enough and if it seems to be overloaded, it intermittently refuses to process the worker queue. Such checks originate from the days of single-user single-core machines and involves thresholds that you should adjust based on the number of exclusive CPU cores you have. See this issue for more information: https://github.com/friendica/friendica/issues/10131 If you want to be neighborly and are using a shared web hosting PaaS provider, especially within the free tier, you need to set maxloadavg to say twice the maximum value of /proc/loadavg during peak hours. If you have the whole (virtual) machine for yourself such as in case of an IaaS VPS, you can set it to orders of magnitude higher than its commonly observed value, such as 1000. You should instead enact limits in your web server configuration based on the number of entry processes to cap the concurrent memory usage of your PHP processes. See RLimitMEM , RLimitCPU , RLimitNPROC , StartServers , ServerLimit , MaxRequestsPerChild , pm.max_children , pm.start_servers and related options in your server.","title":"Your worker never or rarely runs"},{"location":"admin/install/#error-uploading-even-small-image-files","text":"You tried to upload an image up to 100kB, and it failed. You may not have the ownership or file mode set correctly if you are using the file system storage backend. Change the backend to database. If this solves it, that is what needs to be fixed.","title":"Error uploading even small image files"},{"location":"admin/install/#error-uploading-large-files","text":"You may find 413 Request Entity Too Large or 500 Internal Error in the network inspector of the browser if the file is too large, for example if it is a video. First try to upload a very small file, up to 100kB. If that succeeds, you will need to increase limits at multiple places, including on any web proxy that you are using. In your PHP ini: upload_max_filesize : defaults to 2MB post_max_size : defaults to 8MB, must be greater than upload_max_filesize memory_limit : defaults to 128MB, must be greater than post_max_size You should verify whether you changed them in the right file by checking the web interface at the end of the overview on the Admin panel. For Apache2: LimitRequestBody : defaults to unlimited SSLRenegBufferSize : defaults to 128kB, only if your site uses TLS and perhaps only when using SSLVerifyClient or SSLVerifyDepth For nginx: client_max_body_size : defaults to 1MB If you are using the database backend for storage, increase this in your SQL configuration: max_allowed_packet : defaults to 32MB If you use the ModSecurity WAF: SecRequestBodyLimit : defaults to 12MB SecRequestBodyNoFilesLimit : defaults to 128kB, should not apply to Friendica","title":"Error uploading large files"},{"location":"admin/settings/","tags":["admin"],"text":"Settings # If you are the admin of a Friendica node, you have access to the Admin Panel where you can configure your Friendica node. Overview # In the main page of the admin panel you will see an information summary about your node. Queues # The three numbers shown are respectively: - The retry queue: These outgoing messages couldn't be received by the remote host, and will be resent at longer intervals before being dropped entirely after 30 days. - The deferred queue: These internal tasks failed and will be retried at most 14 times. - The task queue: These internal tasks are queued for execution during the next background worker run. Additional information # Then you get an overview of the accounts on your node, which can be moderated in the \"Users\" section of the panel. As well as an overview of the currently active addons. The list is linked, so you can have quick access to the Addon settings. And finally you are informed about the version of Friendica you have installed. If you contact the developers with a bug or problem, please also mention the version of your node. The admin panel is separated into subsections accessible from the sidebar of the panel. Site # This section of the admin panel contains the main configuration of your Friendica node. It is separated into several subsection beginning with the basic settings at the top, advancing towards the bottom of the page. Most configuration options have a help text in the admin panel. Therefore, this document does not yet cover all the options Basic Settings # Banner/Logo # Set the content for the site banner. The default logo is the Friendica logo and name. You may wish to provide HTML/CSS to style and/or position this content, as it may not be themed by default. Language # This option will set the default language for the node. It is used as fall back setting should Friendica fail to recognize the visitors preferences and can be overwritten by user settings. The Friendica community offers some translations. Some more complete than others. See this help page for more information about the translation process. System Theme # Choose a theme to be the default system theme. This can be over-ridden by user profiles. Default theme is vier at the moment. You may also want to set a special theme for mobile interfaces. Which may or may not be necessary depending on the mobile friendliness of the desktop theme you have chosen. The vier theme for instance is mobile friendly. Registration # Register policy # With this dropdown selector you can set the nodes' registration policy. You can choose between the following modes: open : Everybody can register a new account and start using it right away. requires approval : Everybody can register a new account, but the admin has to approve it before it can be used. closed : No new registrations are possible. Invitation based registry # Additionally, to the setting in the admin panel, you can decide if registrations are only possible using an invitation code or not. To enable invitation based registration, you have to set the invitation_only setting to true in the system section of the config/local.config.php file. If you want to use this method, the registration policy has to be set to either open or requires approval . Check Full Names # You may find a lot of spammers trying to register on your site. During testing we discovered that since these registrations were automatic, the \"Full Name\" field was often set to just an account name with no space between first and last name. If you would like to support people with only one name as their full name, you may change this setting to true. Default is false. OpenID # By default, OpenID may be used for both registration and logins. If you do not wish to make OpenID facilities available on your system (at all), set 'no_openid' to true. Default is false. Multiple Registrations # The ability to create \"Pages\" requires a person to register more than once. Your site configuration can block registration (or require approval to register). By default, logged-in users can register additional accounts for use as pages. These will still require approval if the registration policy is set to require approval You may prohibit logged-in users from creating additional accounts by setting block multiple registrations to true. Default is false. File upload # File storage backend # Set the backend used by Friendica to store uploaded file data. Two storage backends are available with Friendica: Database : Data is stored in a dedicated table in database ( storage ) Filesystem : Data is stored as file on the filesystem. More storage backends can be available from third-party addons. If you use those, please refer to the documentation of those addons for further information. Default value is 'Database (legacy)': it's the legacy way used to store data directly in database. Existing data can be moved to the current active backend using the 'storage move' console command If selected backend has configurable options, new fields are shown here. Filesystem: Storage base path # The base path where Filesystem storage backend saves data. For maximum security, this path should be outside the folder tree served by the web server: this way files can't be downloaded bypassing the privacy checks. Default value is storage , that is the storage folder in Friendica code root folder. Maximum Image Size # Maximum size in bytes of uploaded images. The default is set to 0, which means no limits. Policies # Global Directory # This configures the URL to update the global directory, and is supplied in the default configuration. The undocumented part is that if this is not set, the global directory is completely unavailable to the application. This allows a private community to be completely isolated from the global network. Force Publish # By default, each user can choose on their Settings page whether to have their profile published in the site directory. This setting forces all profiles on this site to be listed in the site directory and there is no option provided to the user to change it. Default is false. Block Public # Set to true to block public access to all otherwise public personal pages on this site unless you are currently logged in. This blocks the viewing of profiles, friends, photos, the site directory and search pages to unauthorised persons. A side effect is that entries from this site will not appear in the global directory. We recommend specifically disabling that also (setting is described elsewhere on this page). Note: this is specifically for sites that desire to be \"standalone\" and do not wish to be connected to any other Friendica sites. Unauthorised persons will also not be able to request friendship with site members. Default is false. Available in version 2.2 or greater. Community pages for Visitors # The community pages show all public postings, separated by their origin being local or the entire network. With this setting you can select which community pages will be shown to visitors of your Friendica node. Your local users will always have access to both pages. Note : Several settings, like users hiding their contacts from the public will prevent the postings to show up on the global community page. Allowed Friend Domains # Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. By default, any (valid) domain may establish friendships with this site. This is useful if you want to set up a closed network for educational groups, cooperatives and similar communities that don't want to communicate with the rest of the network. Allowed Email Domains # Comma separated list of domains which are allowed in email addresses for registrations to this site. This can lockout those who are not part of this organisation from registering here. Wildcards are accepted. By default, any (valid) email address is allowed in registrations. Allow Users to set remote_self # If you enable the Allow Users to set remote_self users can select Atom feeds from their contact list being their remote self in the contact settings. Which means that postings by the remote self are automatically reposted by Friendica in their names. This feature can be used to let the user mirror e.g. blog postings into their Friendica postings. It is disabled by default, as it causes additional load on the server and may be misused to distribute SPAM. As admin of the node you can also set this flag directly in the database. Before doing so, you should be sure you know what you do and have a backup of the database. Explicit Content # If you are running a node with explicit content, you can announce this with this option. When checked an information flag will be set in the published information about your node. (Should Publish Server Information be enabled.) Additionally, a note will be displayed on the registration page for new users. Advanced # Proxy Configuration Settings # If your site uses a proxy to connect to the internet, you may use these settings to communicate with the outside world. The outside world still needs to be able to see your website, or this will not be very useful. Network Timeout # How long to wait on a network communication before timing out. Value is in seconds. Default is 60 seconds. Set to 0 for unlimited (not recommended). Verify SSL Certificates # By default, Friendica allows SSL communication between websites that have \"self-signed\" SSL certificates. For the widest compatibility with browsers and other networks we do not recommend using self-signed certificates, but we will not prevent you from using them. SSL encrypts all the data transmitted between sites (and to your browser). This allows you to have completely encrypted communications, and also protect your login session from hijacking. Self-signed certificates can be generated for free, without paying top-dollar for a website SSL certificate. However, these aren't looked upon favourably in the security community because they can be subject to so-called \"man-in-the-middle\" attacks. If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites. Check upstream version # If this option is enabled your Friendica node will check the upstream version once per day from the GitHub repository. You can select if the stable version or the development version should be checked out. If there is a new version published, you will get notified in the admin panel summary page. Auto Discovered Contact Directory # Performance # Worker # This section allows you to configure the background process that is triggered by the cron job that was created during the installation. The process does check the available system resources before creating a new worker for a task. Because of this, it may happen that the maximum number of worker processes you allow will not be reached. The tasks for the background process have priorities. To guarantee that important tasks are executed even though the system has a lot of work to do, it is useful to enable the fastlane . Relocate # Users # This section of the panel let the admin control the users registered on the node. If you have selected \"Requires approval\" for the Register policy in the general nodes' configuration, new registrations will be listed at the top of the page. There the admin can then approve or disapprove the request. Below the new registration block the current accounts on the Friendica node are listed. You can sort the user list by name, email, registration date, date of last login, date of last posting and the account type. Here the admin can also block/unblock users from accessing the node or delete the accounts entirely. In the last section of the page admins can create new accounts on the node. The password for the new account will be sent by email to the chosen email address. Addons # This page is for selecting and configuration of extensions for Friendica which have to be placed into the /addon subdirectory of your Friendica installation. You are presented with a long list of available addons. The name of each addon is linked to a separate page for that addon which offers more information and configuration possibilities. Also shown is the version of the addon and an indicator if the addon is currently active or not. When you update your node and the addons they may have to be reloaded. To simplify this process there is a button at the top of the page to reload all active Addons. Themes # The Themes' section of the admin panel works similar to the Addons section but let you control the themes on your Friendica node. Each theme has a dedicated subpage showing the current status, some information about the theme and a screenshot of the Friendica interface using the theme. Should the theme offer special settings, admins can set a global default value here. You can activate and deactivate themes on their dedicated sub-pages thus making them available for the users of the node. To select a default theme for the Friendica node, see the Site section of the admin panel. Additional Features # There are several optional features in Friendica like the dislike button. In this section of the admin panel you can select a default setting for your node and eventually fix it, so users cannot change the setting anymore. DB Updates # Should the database structure of Friendica change, it will apply the changes automatically. In case you are suspecting the update might not have worked, you can use this section of the admin panel to check the situation. Inspect Queue # In the admin panel summary there are two numbers for the message queues. The second number represents messages which could not be delivered and are queued for later retry. If this number goes sky-rocking you might ask yourself which recipient is not receiving. Behind the inspect queue section of the admin panel you will find a list of the messages that could not be delivered. The listing is sorted by the recipient name so identifying potential broken communication lines should be simple. These lines might be broken for various reasons. The receiving end might be off-line, there might be a high system load and so on. Don't panic! Friendica will not queue messages for all time but will sort out dead nodes automatically after a while and remove messages from the queue then. Server Blocklist # This page allows to block all communications (inbound and outbound) with a specific domain name. Each blocked domain entry requires a reason that will be displayed on the friendica ( /friendica ) page. Matching is exact, blocking a domain doesn't block subdomains. Federation Statistics # The federation statistics page gives you a short summery of the nodes/servers/pods of the decentralized social network federation your node knows. These numbers are not complete and only contain nodes from networks Friendica federates directly with. Delete Item # Using this page an admin can delete postings and eventually associated discussion threads from their Friendica node. To do so, they need to know the GUID of the posting. This can be found on the /display page of the posting, it is the last part of the URL displayed in the browsers' navigation bar. You can get to the /display page by following the Link to source . Addon Features # Some addons you can install for your Friendica node have settings which have to be set by the admin. All those addons will be listed in this area of the admin panels sidebar with their names. Logs # The log section of the admin panel is separated into two pages. On the first, following the \"log\" link, you can configure how much Friendica shall log. And on the second you can read the log. You should not place your logs into any directory that is accessible from the web. If you have to, and you are using the default configuration from Apache, you should choose a name for the logfile ending in .log or .out . Should you use another web server, please make sure that you have the correct access rules in place so that your log files are not accessible. There are five different log levels: Normal, Trace, Debug, Data and All. Specifying different verbosity of information and data written out to the log file. Normally you should not need to log at all. The DEBUG level will show a good deal of information about system activity but will not include detailed data. In the ALL level Friendica will log everything to the file. But due to the volume of information we recommend only enabling this when you are tracking down a specific problem. The amount of data can grow the filesize of the logfile quickly . You should set up some kind of log rotation to keep the log file from growing too big. Known Issues : The filename friendica.log can cause problems depending on your server configuration (see issue 2209 ). By default, PHP warnings and error messages are suppressed. If you want to enable those, you have to activate them in the config/local.config.php file. Use the following settings to redirect PHP errors to a file. Config: <?php error_reporting ( E_ERROR | E_WARNING | E_PARSE ); ini_set ( 'error_log' , 'php.out' ); ini_set ( 'log_errors' , '1' ); ini_set ( 'display_errors' , '0' ); This will put all PHP errors in the file php.out (which must be writeable by the webserver). Undeclared variables are occasionally referenced in the program, and therefore we do not recommend using E_NOTICE or E_ALL . The vast majority of issues reported at these levels are completely harmless. Please report to the developers any errors you encounter in the logs using the recommended settings above. They generally indicate issues which need to be resolved. If you encounter a blank (white) page when using the application, view the PHP logs - as this almost always indicates an error has occurred. Diagnostics # In this section of the admin panel you find two tools to investigate what Friendica sees for certain resources. These tools can help to clarify communication problems. For the probe address Friendica will display information for the address provided. With the second tool check webfinger you can request information about the thing identified by a webfinger ( someone@example.com ). Exceptions to the rule # There are four exceptions to the rule, that all the config will be read from the database. These are the database settings, the admin account settings, the path of PHP and information about an eventual installation of the node in a subdirectory of the (sub)domain. DB Settings # With the following settings, you specify the database server, the username and password for Friendica and the database to use. 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'mysqldatabasename', 'charset' => 'utf8mb4', ], Admin users # You can set one, or more, accounts to be Admin . By default, this will be the one account you create during the installation process. But you can expand the list of email addresses by any used email address you want. Registration of new accounts with a listed email address is not possible. 'config' => [ 'admin_email' => 'you@example.com, buddy@example.com', ], PHP Path # Some of Friendica's processes are running in the background. For this you need to specify the path to the PHP binary to be used. 'config' => [ 'php_path' => '/usr/bin/php', ], Subdirectory configuration # It is possible to install Friendica into a subdirectory of your web server. We strongly discourage you from doing so, as this will break federation to other networks (e.g. Diaspora, GNU Social, Hubzilla) Say you have a subdirectory for tests and put Friendica into a further subdirectory, the config would be: 'system' => [ 'urlpath' => 'tests/friendica', ], Other exceptions # Furthermore, there are some experimental settings, you can read-up in the Config values that can only be set in config/local.config.php section of the documentation.","title":"Settings"},{"location":"admin/settings/#settings","text":"If you are the admin of a Friendica node, you have access to the Admin Panel where you can configure your Friendica node.","title":"Settings"},{"location":"admin/settings/#overview","text":"In the main page of the admin panel you will see an information summary about your node.","title":"Overview"},{"location":"admin/settings/#queues","text":"The three numbers shown are respectively: - The retry queue: These outgoing messages couldn't be received by the remote host, and will be resent at longer intervals before being dropped entirely after 30 days. - The deferred queue: These internal tasks failed and will be retried at most 14 times. - The task queue: These internal tasks are queued for execution during the next background worker run.","title":"Queues"},{"location":"admin/settings/#additional-information","text":"Then you get an overview of the accounts on your node, which can be moderated in the \"Users\" section of the panel. As well as an overview of the currently active addons. The list is linked, so you can have quick access to the Addon settings. And finally you are informed about the version of Friendica you have installed. If you contact the developers with a bug or problem, please also mention the version of your node. The admin panel is separated into subsections accessible from the sidebar of the panel.","title":"Additional information"},{"location":"admin/settings/#site","text":"This section of the admin panel contains the main configuration of your Friendica node. It is separated into several subsection beginning with the basic settings at the top, advancing towards the bottom of the page. Most configuration options have a help text in the admin panel. Therefore, this document does not yet cover all the options","title":"Site"},{"location":"admin/settings/#basic-settings","text":"","title":"Basic Settings"},{"location":"admin/settings/#bannerlogo","text":"Set the content for the site banner. The default logo is the Friendica logo and name. You may wish to provide HTML/CSS to style and/or position this content, as it may not be themed by default.","title":"Banner/Logo"},{"location":"admin/settings/#language","text":"This option will set the default language for the node. It is used as fall back setting should Friendica fail to recognize the visitors preferences and can be overwritten by user settings. The Friendica community offers some translations. Some more complete than others. See this help page for more information about the translation process.","title":"Language"},{"location":"admin/settings/#system-theme","text":"Choose a theme to be the default system theme. This can be over-ridden by user profiles. Default theme is vier at the moment. You may also want to set a special theme for mobile interfaces. Which may or may not be necessary depending on the mobile friendliness of the desktop theme you have chosen. The vier theme for instance is mobile friendly.","title":"System Theme"},{"location":"admin/settings/#registration","text":"","title":"Registration"},{"location":"admin/settings/#register-policy","text":"With this dropdown selector you can set the nodes' registration policy. You can choose between the following modes: open : Everybody can register a new account and start using it right away. requires approval : Everybody can register a new account, but the admin has to approve it before it can be used. closed : No new registrations are possible.","title":"Register policy"},{"location":"admin/settings/#invitation-based-registry","text":"Additionally, to the setting in the admin panel, you can decide if registrations are only possible using an invitation code or not. To enable invitation based registration, you have to set the invitation_only setting to true in the system section of the config/local.config.php file. If you want to use this method, the registration policy has to be set to either open or requires approval .","title":"Invitation based registry"},{"location":"admin/settings/#check-full-names","text":"You may find a lot of spammers trying to register on your site. During testing we discovered that since these registrations were automatic, the \"Full Name\" field was often set to just an account name with no space between first and last name. If you would like to support people with only one name as their full name, you may change this setting to true. Default is false.","title":"Check Full Names"},{"location":"admin/settings/#openid","text":"By default, OpenID may be used for both registration and logins. If you do not wish to make OpenID facilities available on your system (at all), set 'no_openid' to true. Default is false.","title":"OpenID"},{"location":"admin/settings/#multiple-registrations","text":"The ability to create \"Pages\" requires a person to register more than once. Your site configuration can block registration (or require approval to register). By default, logged-in users can register additional accounts for use as pages. These will still require approval if the registration policy is set to require approval You may prohibit logged-in users from creating additional accounts by setting block multiple registrations to true. Default is false.","title":"Multiple Registrations"},{"location":"admin/settings/#file-upload","text":"","title":"File upload"},{"location":"admin/settings/#file-storage-backend","text":"Set the backend used by Friendica to store uploaded file data. Two storage backends are available with Friendica: Database : Data is stored in a dedicated table in database ( storage ) Filesystem : Data is stored as file on the filesystem. More storage backends can be available from third-party addons. If you use those, please refer to the documentation of those addons for further information. Default value is 'Database (legacy)': it's the legacy way used to store data directly in database. Existing data can be moved to the current active backend using the 'storage move' console command If selected backend has configurable options, new fields are shown here.","title":"File storage backend"},{"location":"admin/settings/#filesystem-storage-base-path","text":"The base path where Filesystem storage backend saves data. For maximum security, this path should be outside the folder tree served by the web server: this way files can't be downloaded bypassing the privacy checks. Default value is storage , that is the storage folder in Friendica code root folder.","title":"Filesystem: Storage base path"},{"location":"admin/settings/#maximum-image-size","text":"Maximum size in bytes of uploaded images. The default is set to 0, which means no limits.","title":"Maximum Image Size"},{"location":"admin/settings/#policies","text":"","title":"Policies"},{"location":"admin/settings/#global-directory","text":"This configures the URL to update the global directory, and is supplied in the default configuration. The undocumented part is that if this is not set, the global directory is completely unavailable to the application. This allows a private community to be completely isolated from the global network.","title":"Global Directory"},{"location":"admin/settings/#force-publish","text":"By default, each user can choose on their Settings page whether to have their profile published in the site directory. This setting forces all profiles on this site to be listed in the site directory and there is no option provided to the user to change it. Default is false.","title":"Force Publish"},{"location":"admin/settings/#block-public","text":"Set to true to block public access to all otherwise public personal pages on this site unless you are currently logged in. This blocks the viewing of profiles, friends, photos, the site directory and search pages to unauthorised persons. A side effect is that entries from this site will not appear in the global directory. We recommend specifically disabling that also (setting is described elsewhere on this page). Note: this is specifically for sites that desire to be \"standalone\" and do not wish to be connected to any other Friendica sites. Unauthorised persons will also not be able to request friendship with site members. Default is false. Available in version 2.2 or greater.","title":"Block Public"},{"location":"admin/settings/#community-pages-for-visitors","text":"The community pages show all public postings, separated by their origin being local or the entire network. With this setting you can select which community pages will be shown to visitors of your Friendica node. Your local users will always have access to both pages. Note : Several settings, like users hiding their contacts from the public will prevent the postings to show up on the global community page.","title":"Community pages for Visitors"},{"location":"admin/settings/#allowed-friend-domains","text":"Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. By default, any (valid) domain may establish friendships with this site. This is useful if you want to set up a closed network for educational groups, cooperatives and similar communities that don't want to communicate with the rest of the network.","title":"Allowed Friend Domains"},{"location":"admin/settings/#allowed-email-domains","text":"Comma separated list of domains which are allowed in email addresses for registrations to this site. This can lockout those who are not part of this organisation from registering here. Wildcards are accepted. By default, any (valid) email address is allowed in registrations.","title":"Allowed Email Domains"},{"location":"admin/settings/#allow-users-to-set-remote_self","text":"If you enable the Allow Users to set remote_self users can select Atom feeds from their contact list being their remote self in the contact settings. Which means that postings by the remote self are automatically reposted by Friendica in their names. This feature can be used to let the user mirror e.g. blog postings into their Friendica postings. It is disabled by default, as it causes additional load on the server and may be misused to distribute SPAM. As admin of the node you can also set this flag directly in the database. Before doing so, you should be sure you know what you do and have a backup of the database.","title":"Allow Users to set remote_self"},{"location":"admin/settings/#explicit-content","text":"If you are running a node with explicit content, you can announce this with this option. When checked an information flag will be set in the published information about your node. (Should Publish Server Information be enabled.) Additionally, a note will be displayed on the registration page for new users.","title":"Explicit Content"},{"location":"admin/settings/#advanced","text":"","title":"Advanced"},{"location":"admin/settings/#proxy-configuration-settings","text":"If your site uses a proxy to connect to the internet, you may use these settings to communicate with the outside world. The outside world still needs to be able to see your website, or this will not be very useful.","title":"Proxy Configuration Settings"},{"location":"admin/settings/#network-timeout","text":"How long to wait on a network communication before timing out. Value is in seconds. Default is 60 seconds. Set to 0 for unlimited (not recommended).","title":"Network Timeout"},{"location":"admin/settings/#verify-ssl-certificates","text":"By default, Friendica allows SSL communication between websites that have \"self-signed\" SSL certificates. For the widest compatibility with browsers and other networks we do not recommend using self-signed certificates, but we will not prevent you from using them. SSL encrypts all the data transmitted between sites (and to your browser). This allows you to have completely encrypted communications, and also protect your login session from hijacking. Self-signed certificates can be generated for free, without paying top-dollar for a website SSL certificate. However, these aren't looked upon favourably in the security community because they can be subject to so-called \"man-in-the-middle\" attacks. If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.","title":"Verify SSL Certificates"},{"location":"admin/settings/#check-upstream-version","text":"If this option is enabled your Friendica node will check the upstream version once per day from the GitHub repository. You can select if the stable version or the development version should be checked out. If there is a new version published, you will get notified in the admin panel summary page.","title":"Check upstream version"},{"location":"admin/settings/#auto-discovered-contact-directory","text":"","title":"Auto Discovered Contact Directory"},{"location":"admin/settings/#performance","text":"","title":"Performance"},{"location":"admin/settings/#worker","text":"This section allows you to configure the background process that is triggered by the cron job that was created during the installation. The process does check the available system resources before creating a new worker for a task. Because of this, it may happen that the maximum number of worker processes you allow will not be reached. The tasks for the background process have priorities. To guarantee that important tasks are executed even though the system has a lot of work to do, it is useful to enable the fastlane .","title":"Worker"},{"location":"admin/settings/#relocate","text":"","title":"Relocate"},{"location":"admin/settings/#users","text":"This section of the panel let the admin control the users registered on the node. If you have selected \"Requires approval\" for the Register policy in the general nodes' configuration, new registrations will be listed at the top of the page. There the admin can then approve or disapprove the request. Below the new registration block the current accounts on the Friendica node are listed. You can sort the user list by name, email, registration date, date of last login, date of last posting and the account type. Here the admin can also block/unblock users from accessing the node or delete the accounts entirely. In the last section of the page admins can create new accounts on the node. The password for the new account will be sent by email to the chosen email address.","title":"Users"},{"location":"admin/settings/#addons","text":"This page is for selecting and configuration of extensions for Friendica which have to be placed into the /addon subdirectory of your Friendica installation. You are presented with a long list of available addons. The name of each addon is linked to a separate page for that addon which offers more information and configuration possibilities. Also shown is the version of the addon and an indicator if the addon is currently active or not. When you update your node and the addons they may have to be reloaded. To simplify this process there is a button at the top of the page to reload all active Addons.","title":"Addons"},{"location":"admin/settings/#themes","text":"The Themes' section of the admin panel works similar to the Addons section but let you control the themes on your Friendica node. Each theme has a dedicated subpage showing the current status, some information about the theme and a screenshot of the Friendica interface using the theme. Should the theme offer special settings, admins can set a global default value here. You can activate and deactivate themes on their dedicated sub-pages thus making them available for the users of the node. To select a default theme for the Friendica node, see the Site section of the admin panel.","title":"Themes"},{"location":"admin/settings/#additional-features","text":"There are several optional features in Friendica like the dislike button. In this section of the admin panel you can select a default setting for your node and eventually fix it, so users cannot change the setting anymore.","title":"Additional Features"},{"location":"admin/settings/#db-updates","text":"Should the database structure of Friendica change, it will apply the changes automatically. In case you are suspecting the update might not have worked, you can use this section of the admin panel to check the situation.","title":"DB Updates"},{"location":"admin/settings/#inspect-queue","text":"In the admin panel summary there are two numbers for the message queues. The second number represents messages which could not be delivered and are queued for later retry. If this number goes sky-rocking you might ask yourself which recipient is not receiving. Behind the inspect queue section of the admin panel you will find a list of the messages that could not be delivered. The listing is sorted by the recipient name so identifying potential broken communication lines should be simple. These lines might be broken for various reasons. The receiving end might be off-line, there might be a high system load and so on. Don't panic! Friendica will not queue messages for all time but will sort out dead nodes automatically after a while and remove messages from the queue then.","title":"Inspect Queue"},{"location":"admin/settings/#server-blocklist","text":"This page allows to block all communications (inbound and outbound) with a specific domain name. Each blocked domain entry requires a reason that will be displayed on the friendica ( /friendica ) page. Matching is exact, blocking a domain doesn't block subdomains.","title":"Server Blocklist"},{"location":"admin/settings/#federation-statistics","text":"The federation statistics page gives you a short summery of the nodes/servers/pods of the decentralized social network federation your node knows. These numbers are not complete and only contain nodes from networks Friendica federates directly with.","title":"Federation Statistics"},{"location":"admin/settings/#delete-item","text":"Using this page an admin can delete postings and eventually associated discussion threads from their Friendica node. To do so, they need to know the GUID of the posting. This can be found on the /display page of the posting, it is the last part of the URL displayed in the browsers' navigation bar. You can get to the /display page by following the Link to source .","title":"Delete Item"},{"location":"admin/settings/#addon-features","text":"Some addons you can install for your Friendica node have settings which have to be set by the admin. All those addons will be listed in this area of the admin panels sidebar with their names.","title":"Addon Features"},{"location":"admin/settings/#logs","text":"The log section of the admin panel is separated into two pages. On the first, following the \"log\" link, you can configure how much Friendica shall log. And on the second you can read the log. You should not place your logs into any directory that is accessible from the web. If you have to, and you are using the default configuration from Apache, you should choose a name for the logfile ending in .log or .out . Should you use another web server, please make sure that you have the correct access rules in place so that your log files are not accessible. There are five different log levels: Normal, Trace, Debug, Data and All. Specifying different verbosity of information and data written out to the log file. Normally you should not need to log at all. The DEBUG level will show a good deal of information about system activity but will not include detailed data. In the ALL level Friendica will log everything to the file. But due to the volume of information we recommend only enabling this when you are tracking down a specific problem. The amount of data can grow the filesize of the logfile quickly . You should set up some kind of log rotation to keep the log file from growing too big. Known Issues : The filename friendica.log can cause problems depending on your server configuration (see issue 2209 ). By default, PHP warnings and error messages are suppressed. If you want to enable those, you have to activate them in the config/local.config.php file. Use the following settings to redirect PHP errors to a file. Config: <?php error_reporting ( E_ERROR | E_WARNING | E_PARSE ); ini_set ( 'error_log' , 'php.out' ); ini_set ( 'log_errors' , '1' ); ini_set ( 'display_errors' , '0' ); This will put all PHP errors in the file php.out (which must be writeable by the webserver). Undeclared variables are occasionally referenced in the program, and therefore we do not recommend using E_NOTICE or E_ALL . The vast majority of issues reported at these levels are completely harmless. Please report to the developers any errors you encounter in the logs using the recommended settings above. They generally indicate issues which need to be resolved. If you encounter a blank (white) page when using the application, view the PHP logs - as this almost always indicates an error has occurred.","title":"Logs"},{"location":"admin/settings/#diagnostics","text":"In this section of the admin panel you find two tools to investigate what Friendica sees for certain resources. These tools can help to clarify communication problems. For the probe address Friendica will display information for the address provided. With the second tool check webfinger you can request information about the thing identified by a webfinger ( someone@example.com ).","title":"Diagnostics"},{"location":"admin/settings/#exceptions-to-the-rule","text":"There are four exceptions to the rule, that all the config will be read from the database. These are the database settings, the admin account settings, the path of PHP and information about an eventual installation of the node in a subdirectory of the (sub)domain.","title":"Exceptions to the rule"},{"location":"admin/settings/#db-settings","text":"With the following settings, you specify the database server, the username and password for Friendica and the database to use. 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'mysqldatabasename', 'charset' => 'utf8mb4', ],","title":"DB Settings"},{"location":"admin/settings/#admin-users","text":"You can set one, or more, accounts to be Admin . By default, this will be the one account you create during the installation process. But you can expand the list of email addresses by any used email address you want. Registration of new accounts with a listed email address is not possible. 'config' => [ 'admin_email' => 'you@example.com, buddy@example.com', ],","title":"Admin users"},{"location":"admin/settings/#php-path","text":"Some of Friendica's processes are running in the background. For this you need to specify the path to the PHP binary to be used. 'config' => [ 'php_path' => '/usr/bin/php', ],","title":"PHP Path"},{"location":"admin/settings/#subdirectory-configuration","text":"It is possible to install Friendica into a subdirectory of your web server. We strongly discourage you from doing so, as this will break federation to other networks (e.g. Diaspora, GNU Social, Hubzilla) Say you have a subdirectory for tests and put Friendica into a further subdirectory, the config would be: 'system' => [ 'urlpath' => 'tests/friendica', ],","title":"Subdirectory configuration"},{"location":"admin/settings/#other-exceptions","text":"Furthermore, there are some experimental settings, you can read-up in the Config values that can only be set in config/local.config.php section of the documentation.","title":"Other exceptions"},{"location":"admin/ssl/","tags":["admin","security","https"],"text":"Using SSL with Friendica # Disclaimer # This document has been updated in November 2016. SSL encryption is relevant for security. This means that recommended settings change fast. Keep your setup up to date and do not rely on this document being updated as fast as technologies change! Intro # If you are running your own Friendica site, you may want to use SSL (https) to encrypt communication between servers and between yourself and your server. There are basically two sorts of SSL certificates: Self-signed certificates and certificates signed by a certificate authority (CA). Technically, both provide the same valid encryption. There is a problem with self-signed certificates though: They are neither installed in browsers nor on other servers. That is why they provoke warnings about \"mistrusted certificates\". This is confusing and disturbing. For this reason, we recommend to get a certificate signed by a CA. Normally, you have to pay for them - and they are valid for a limited period of time (e.g. a year or two). There are ways to get a trusted certificate for free. Choose your domain name # Your SSL certificate will be valid for a domain or even only for a subdomain. Make your final decision about your domain resp. subdomain before ordering the certificate. Once you have it, changing the domain name means getting a new certificate. Shared hosts # If your Friendica instance is running on a shared hosting platform, you should first check with your hosting provider. They have instructions for you on how to do it there. You can always order a paid certificate with your provider. They will either install it for you or provide an easy way to upload the certificate and the key via a web interface. With some providers, you have to send them your certificate. They need the certificate, the key and the CA's intermediate certificate. To be sure, send those three files. You should send them to your provider via an encrypted channel! Own server # If you run your own server, we recommend to check out the \"Let's Encrypt\" initiative . Not only do they offer free SSL certificates, but also a way to automate their renewal. You need to install a client software on your server to use it. Instructions for the official client are here . Depending on your needs, you might want to look at the list of alternative LetsEncrypt clients . Web server settings # Visit the Mozilla's wiki for instructions on how to configure a secure webserver. They provide recommendations for different web servers . Test your SSL settings # When you are done, visit the test site SSL Labs to have them check if you succeeded. Configure Friendica # If you can successfully access your Friendica instance through https, there are a number of steps you can take to ensure your users will use SSL to access your instance. Web server redirection # This is the simplest way to enforce site-wide secure access. Every time a user tries to access any Friendica page by any mean (manual address bar entry or link), the web server issues a Permanent Redirect response with the secure protocol prepended to the requested URL. With Apache, enable the modules rewrite and ssl (with a shared hosting provider, this should be enabled already): sudo a2enmod rewrite ssl Add the following lines to the .htaccess file in the root folder of your Friendica instance (thanks to AlfredSK ): RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://your.friendica.domain/$1 [R=301,L] With nginx, configure your server directive this way ( documentation ): server { listen 80; server_name your.friendica.domain; return 301 https://$server_name$request_uri; } SSL Settings # In the Admin Settings, there are three SSL-related settings: SSL link policy : this affects how Friendica generates internal links. If your SSL installation was successful, we recommend \"Force all links to SSL\" just in case your web server configuration can't be altered like described above. Force SSL : This forces all external links to HTTPS, which may solve Mixed-Content issues, but not all websites support HTTPS yet. Use at your own risk. Verify SSL : Enabling this will prevent Friendica to interact with self-signed SSL sites. We recommend you leave it on as a self-signed SSL certificate can be a vector for a man-in-the-middle attack.","title":"SSL"},{"location":"admin/ssl/#using-ssl-with-friendica","text":"","title":"Using SSL with Friendica"},{"location":"admin/ssl/#disclaimer","text":"This document has been updated in November 2016. SSL encryption is relevant for security. This means that recommended settings change fast. Keep your setup up to date and do not rely on this document being updated as fast as technologies change!","title":"Disclaimer"},{"location":"admin/ssl/#intro","text":"If you are running your own Friendica site, you may want to use SSL (https) to encrypt communication between servers and between yourself and your server. There are basically two sorts of SSL certificates: Self-signed certificates and certificates signed by a certificate authority (CA). Technically, both provide the same valid encryption. There is a problem with self-signed certificates though: They are neither installed in browsers nor on other servers. That is why they provoke warnings about \"mistrusted certificates\". This is confusing and disturbing. For this reason, we recommend to get a certificate signed by a CA. Normally, you have to pay for them - and they are valid for a limited period of time (e.g. a year or two). There are ways to get a trusted certificate for free.","title":"Intro"},{"location":"admin/ssl/#choose-your-domain-name","text":"Your SSL certificate will be valid for a domain or even only for a subdomain. Make your final decision about your domain resp. subdomain before ordering the certificate. Once you have it, changing the domain name means getting a new certificate.","title":"Choose your domain name"},{"location":"admin/ssl/#shared-hosts","text":"If your Friendica instance is running on a shared hosting platform, you should first check with your hosting provider. They have instructions for you on how to do it there. You can always order a paid certificate with your provider. They will either install it for you or provide an easy way to upload the certificate and the key via a web interface. With some providers, you have to send them your certificate. They need the certificate, the key and the CA's intermediate certificate. To be sure, send those three files. You should send them to your provider via an encrypted channel!","title":"Shared hosts"},{"location":"admin/ssl/#own-server","text":"If you run your own server, we recommend to check out the \"Let's Encrypt\" initiative . Not only do they offer free SSL certificates, but also a way to automate their renewal. You need to install a client software on your server to use it. Instructions for the official client are here . Depending on your needs, you might want to look at the list of alternative LetsEncrypt clients .","title":"Own server"},{"location":"admin/ssl/#web-server-settings","text":"Visit the Mozilla's wiki for instructions on how to configure a secure webserver. They provide recommendations for different web servers .","title":"Web server settings"},{"location":"admin/ssl/#test-your-ssl-settings","text":"When you are done, visit the test site SSL Labs to have them check if you succeeded.","title":"Test your SSL settings"},{"location":"admin/ssl/#configure-friendica","text":"If you can successfully access your Friendica instance through https, there are a number of steps you can take to ensure your users will use SSL to access your instance.","title":"Configure Friendica"},{"location":"admin/ssl/#web-server-redirection","text":"This is the simplest way to enforce site-wide secure access. Every time a user tries to access any Friendica page by any mean (manual address bar entry or link), the web server issues a Permanent Redirect response with the secure protocol prepended to the requested URL. With Apache, enable the modules rewrite and ssl (with a shared hosting provider, this should be enabled already): sudo a2enmod rewrite ssl Add the following lines to the .htaccess file in the root folder of your Friendica instance (thanks to AlfredSK ): RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://your.friendica.domain/$1 [R=301,L] With nginx, configure your server directive this way ( documentation ): server { listen 80; server_name your.friendica.domain; return 301 https://$server_name$request_uri; }","title":"Web server redirection"},{"location":"admin/ssl/#ssl-settings","text":"In the Admin Settings, there are three SSL-related settings: SSL link policy : this affects how Friendica generates internal links. If your SSL installation was successful, we recommend \"Force all links to SSL\" just in case your web server configuration can't be altered like described above. Force SSL : This forces all external links to HTTPS, which may solve Mixed-Content issues, but not all websites support HTTPS yet. Use at your own risk. Verify SSL : Enabling this will prevent Friendica to interact with self-signed SSL sites. We recommend you leave it on as a self-signed SSL certificate can be a vector for a man-in-the-middle attack.","title":"SSL Settings"},{"location":"developer/","tags":["Developer","Intro"],"text":"Where to get started to help improve Friendica # Do you want to help us improve Friendica? Here we have compiled some hints on how to get started and some tasks to help you choose. A project like Friendica is the sum of many contributions. Very different skills are required to make good software, not all of them involve coding! We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons. Whether you feel like an expert or like a newbie - join us with your ideas! Contact us # The discussion of Friendica development takes place in the following Friendica forums: The main forum for Friendica development Help other users # Remember the questions you had when you first tried Friendica? A good place to start can be to help new people find their way around Friendica in the general support forum . Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can. Translation # The documentation contains help on how to translate Friendica at Transifex where the UI is translated. If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files? Design # Are you good at designing things? If you have seen Friendica you probably have ideas to improve it, haven't you? If you would like to work with us on enhancing the user interface, please join the forum for Friendica development . Make plans for a better Friendica interface design and share them with us. Tell us if you are able to realize your ideas or what kind of help you need. We can't promise we have the right skills in the group, but we'll try. Choose a thing to start with, e.g. work on the icon set of your favorite theme Programming # Friendica uses an implementation of Domain-Driven-Design , please make sure to check out the provided links for hints at the expected code architecture. Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . If you want to have git automatically update the dependencies with composer, you can use the post-merge git-hook with a script similar to this one: #!/usr/bin/env bash # MIT \u00a9 Sindre Sorhus - sindresorhus.com # forked by Gianluca Guarini # phponly by Ivo Bathke ;) # modified for Friendica by Tobias Diekershoff changed_files=\"$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)\" check_run() { echo \"$changed_files\" | grep --quiet \"$1\" && eval \"$2\" } # `composer install` if the `composer.lock` file gets changed # to update all the php dependencies check_run composer.lock \"bin/composer.phar install --no-dev\" just place it into .git/hooks/post-merge and make it executable. Class autoloading Using Composer How To Move Classes to src Coding standards # For the sake of consistency between contribution and general code readability, Friendica follows the widespread PSR-2 coding standards to the exception to a few rules. Here's a few primers if you are new to Friendica or to the PSR-2 coding standards: Indentation is tabs, period (not PSR-2). By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds). Operators are wrapped by spaces, e.g. $var === true , $var = 1 + 2 and 'string' . $concat . 'enation' Braces are mandatory in conditions Boolean operators are && and || for PHP conditions, AND and OR for SQL queries No closing PHP tag No trailing spaces Array declarations use the new square brackets syntax Quoting style is single quotes by default, except for needed string interpolation, SQL query strings by convention and comments that should stay in natural language. Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica. There are a few tools you can use to check or fix your files before you commit. For documentation, we use the standard of one sentence per line for the md files in the /doc and /doc/$lng subdirectories. Check with PHP Code Sniffer # This tool checks your files against a variety of coding standards, including PSR-2, and outputs a report of all the standard violations. You can simply install it through PEAR: pear install PHP_CodeSniffer Once it is installed and available in your PATH, here's the command to run before committing your work: $> phpcs --standard=ruleset.xml <file or directory> The output is a list of all the coding standards violations that you should fix before committing your work. Additionally, phpcs integrates with a few IDEs (Eclipse, Netbeans, PHPStorm...) so that you don't have to fiddle with the command line. Fix with PHP Code Beautifier and Fixer (phpbcf) included in PHP Code Sniffer # If you're getting a massive list of standards violations when running phpcs , it can be annoying to fix all the violations by hand. Thankfully, PHP Code Sniffer is shipped with an automatic code fixer that can take care of the tedious task for you. Here's the command to automatically fix the files you created/modified: $> phpcbf --standard=ruleset.xml <file or directory> If the command-line tools diff and patch are unavailable for you, phpcbf can use slightly slower PHP equivalents by using the --no-patch argument. Code documentation # If you are interested in having the documentation of the Friendica code outside the code files, you can use Doxygen to generate it. The configuration file for Doxygen is located in the base directory of the project sources. Run $> doxygen Doxyfile to generate the files which will be located in the doc/html subdirectory in the Friendica directory. You can browse these files with any browser. If you find missing documentation, don't hesitate to contact us and write it down to enhance the code documentation. Issues # Have a look at our issue tracker on GitHub! Try to reproduce a bug that needs more inquiries and write down what you find out. If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed. Fix a bug if you can. Please make the pull request against the develop branch of the repository. There is a Junior Job label for issues we think might be a good point to start with. But you don't have to limit yourself to those issues. Web interface # The thing many people want most is a better interface, preferably a responsive Friendica theme. This is a piece of work! If you want to get involved here: Look at the first steps that were made (e.g. the clean theme). Ask us to find out whom to talk to about their experiences. Talk to design people if you know any. Let us know about your plans in the dev forum Do not worry about cross-posting. Client software # As Friendica is using a Twitter/GNU Social compatible API any of the clients for those platforms should work with Friendica as well. Furthermore, there are several client projects, especially for use with Friendica. If you are interested in improving those clients, please contact the developers of the clients directly. Android / LinageOS: Friendiqa src / Google Play developed by Marco R iOS: currently no client SailfishOS: Friendiy src - developed by Fabio Windows: Friendica Mobile for Windows versions before 8.1 and Windows 10 - developed by Gerhard Seeber","title":"Get Started"},{"location":"developer/#where-to-get-started-to-help-improve-friendica","text":"Do you want to help us improve Friendica? Here we have compiled some hints on how to get started and some tasks to help you choose. A project like Friendica is the sum of many contributions. Very different skills are required to make good software, not all of them involve coding! We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons. Whether you feel like an expert or like a newbie - join us with your ideas!","title":"Where to get started to help improve Friendica"},{"location":"developer/#contact-us","text":"The discussion of Friendica development takes place in the following Friendica forums: The main forum for Friendica development","title":"Contact us"},{"location":"developer/#help-other-users","text":"Remember the questions you had when you first tried Friendica? A good place to start can be to help new people find their way around Friendica in the general support forum . Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can.","title":"Help other users"},{"location":"developer/#translation","text":"The documentation contains help on how to translate Friendica at Transifex where the UI is translated. If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files?","title":"Translation"},{"location":"developer/#design","text":"Are you good at designing things? If you have seen Friendica you probably have ideas to improve it, haven't you? If you would like to work with us on enhancing the user interface, please join the forum for Friendica development . Make plans for a better Friendica interface design and share them with us. Tell us if you are able to realize your ideas or what kind of help you need. We can't promise we have the right skills in the group, but we'll try. Choose a thing to start with, e.g. work on the icon set of your favorite theme","title":"Design"},{"location":"developer/#programming","text":"Friendica uses an implementation of Domain-Driven-Design , please make sure to check out the provided links for hints at the expected code architecture.","title":"Programming"},{"location":"developer/#composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . If you want to have git automatically update the dependencies with composer, you can use the post-merge git-hook with a script similar to this one: #!/usr/bin/env bash # MIT \u00a9 Sindre Sorhus - sindresorhus.com # forked by Gianluca Guarini # phponly by Ivo Bathke ;) # modified for Friendica by Tobias Diekershoff changed_files=\"$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)\" check_run() { echo \"$changed_files\" | grep --quiet \"$1\" && eval \"$2\" } # `composer install` if the `composer.lock` file gets changed # to update all the php dependencies check_run composer.lock \"bin/composer.phar install --no-dev\" just place it into .git/hooks/post-merge and make it executable. Class autoloading Using Composer How To Move Classes to src","title":"Composer"},{"location":"developer/#coding-standards","text":"For the sake of consistency between contribution and general code readability, Friendica follows the widespread PSR-2 coding standards to the exception to a few rules. Here's a few primers if you are new to Friendica or to the PSR-2 coding standards: Indentation is tabs, period (not PSR-2). By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds). Operators are wrapped by spaces, e.g. $var === true , $var = 1 + 2 and 'string' . $concat . 'enation' Braces are mandatory in conditions Boolean operators are && and || for PHP conditions, AND and OR for SQL queries No closing PHP tag No trailing spaces Array declarations use the new square brackets syntax Quoting style is single quotes by default, except for needed string interpolation, SQL query strings by convention and comments that should stay in natural language. Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica. There are a few tools you can use to check or fix your files before you commit. For documentation, we use the standard of one sentence per line for the md files in the /doc and /doc/$lng subdirectories.","title":"Coding standards"},{"location":"developer/#check-with-php-code-sniffer","text":"This tool checks your files against a variety of coding standards, including PSR-2, and outputs a report of all the standard violations. You can simply install it through PEAR: pear install PHP_CodeSniffer Once it is installed and available in your PATH, here's the command to run before committing your work: $> phpcs --standard=ruleset.xml <file or directory> The output is a list of all the coding standards violations that you should fix before committing your work. Additionally, phpcs integrates with a few IDEs (Eclipse, Netbeans, PHPStorm...) so that you don't have to fiddle with the command line.","title":"Check with PHP Code Sniffer"},{"location":"developer/#fix-with-php-code-beautifier-and-fixer-phpbcf-included-in-php-code-sniffer","text":"If you're getting a massive list of standards violations when running phpcs , it can be annoying to fix all the violations by hand. Thankfully, PHP Code Sniffer is shipped with an automatic code fixer that can take care of the tedious task for you. Here's the command to automatically fix the files you created/modified: $> phpcbf --standard=ruleset.xml <file or directory> If the command-line tools diff and patch are unavailable for you, phpcbf can use slightly slower PHP equivalents by using the --no-patch argument.","title":"Fix with PHP Code Beautifier and Fixer (phpbcf) included in PHP Code Sniffer"},{"location":"developer/#code-documentation","text":"If you are interested in having the documentation of the Friendica code outside the code files, you can use Doxygen to generate it. The configuration file for Doxygen is located in the base directory of the project sources. Run $> doxygen Doxyfile to generate the files which will be located in the doc/html subdirectory in the Friendica directory. You can browse these files with any browser. If you find missing documentation, don't hesitate to contact us and write it down to enhance the code documentation.","title":"Code documentation"},{"location":"developer/#issues","text":"Have a look at our issue tracker on GitHub! Try to reproduce a bug that needs more inquiries and write down what you find out. If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed. Fix a bug if you can. Please make the pull request against the develop branch of the repository. There is a Junior Job label for issues we think might be a good point to start with. But you don't have to limit yourself to those issues.","title":"Issues"},{"location":"developer/#web-interface","text":"The thing many people want most is a better interface, preferably a responsive Friendica theme. This is a piece of work! If you want to get involved here: Look at the first steps that were made (e.g. the clean theme). Ask us to find out whom to talk to about their experiences. Talk to design people if you know any. Let us know about your plans in the dev forum Do not worry about cross-posting.","title":"Web interface"},{"location":"developer/#client-software","text":"As Friendica is using a Twitter/GNU Social compatible API any of the clients for those platforms should work with Friendica as well. Furthermore, there are several client projects, especially for use with Friendica. If you are interested in improving those clients, please contact the developers of the clients directly. Android / LinageOS: Friendiqa src / Google Play developed by Marco R iOS: currently no client SailfishOS: Friendiy src - developed by Fabio Windows: Friendica Mobile for Windows versions before 8.1 and Windows 10 - developed by Gerhard Seeber","title":"Client software"},{"location":"developer/addons/","tags":["developer"],"text":"Friendica Addon development # Please see the sample addon 'randplace' for a working example of using some of these features. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path). Naming # Addon names are used in file paths and functions names, and as such: - Can't contain spaces or punctuation. - Can't start with a number. Metadata # You can provide human-readable information about your addon in the first multi-line comment of your addon file. Here's the structure: /** * Name: {Human-readable name} * Description: {Short description} * Version: 1.0 * Author: {Author1 Name} * Author: {Author2 Name} <{Author profile link}> * Maintainer: {Maintainer1 Name} * Maintainer: {Maintainer2 Name} <{Maintainer profile link}> * Status: {Unsupported|Arbitrary status} */ You can also provide a longer documentation in a README or README.md file. The latter will be converted from Markdown to HTML in the addon detail page. Install/Uninstall # If your addon uses hooks, they have to be registered in a <addon>_install() function. This function also allows to perform arbitrary actions your addon needs to function properly. Uninstalling an addon automatically unregisters any hook it registered, but if you need to provide specific uninstallation steps, you can add them in a <addon>_uninstall() function. The installation and uninstallation functions will be called (i.e. re-installed) if the addon changes after installation. Therefore, your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for \"setup\" amd \"remove\". PHP addon hooks # Register your addon hooks during installation. \\Friendica\\Core\\Hook::register($hookname, $file, $function); $hookname is a string and corresponds to a known Friendica PHP hook. $file is a pathname relative to the top-level Friendica directory. This should be 'addon/ addon_name / addon_name .php' in most cases and can be shortened to __FILE__ . $function is a string and is the name of the function which will be executed when the hook is called. Arguments # Your hook callback functions will be called with at least one and possibly two arguments function <addon>_<hookname>(App $a, &$b) { } If you wish to make changes to the calling data, you must declare them as reference variables (with & ) during function declaration. $a # $a is the Friendica App class. It contains a wealth of information about the current state of Friendica: which module has been called, configuration information, the page contents at the point the hook was invoked, profile and user information, etc. It is recommended you call this $a to match its usage elsewhere. $b # $b can be called anything you like. This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter. Remember to declare it with & if you wish to alter it. Admin settings # Your addon can provide user-specific settings via the addon_settings PHP hook, but it can also provide node-wide settings in the administration page of your addon. Simply declare a <addon>_addon_admin(App $a) function to display the form and a <addon>_addon_admin_post(App $a) function to process the data from the form. Global stylesheets # If your addon requires adding a stylesheet on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('head', __FILE__, '<addon>_head'); ... } function <addon>_head(App $a) { \\Friendica\\DI::page()->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css'); } __DIR__ is the folder path of your addon. JavaScript # Global scripts # If your addon requires adding a script on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('footer', __FILE__, '<addon>_footer'); ... } function <addon>_footer(App $a) { \\Friendica\\DI::page()->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js'); } __DIR__ is the folder path of your addon. JavaScript hooks # The main Friendica script provides hooks via events dispatched on the document property. In your Javascript file included as described above, add your event listener like this: document . addEventListener ( name , callback ); name is the name of the hook and corresponds to a known Friendica JavaScript hook. callback is a JavaScript anonymous function to execute. More info about Javascript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener Current JavaScript hooks # postprocess_liveupdate # Called at the end of the live update process (XmlHttpRequest) and on a post preview. No additional data is provided. Modules # Addons may also act as \"modules\" and intercept all page requests for a given URL path. In order for an addon to act as a module it needs to declare an empty function <addon>_module() . If this function exists, you will now receive all page requests for https://my.web.site/<addon> - with any number of URL components as additional arguments. These are parsed into the App\\Arguments object. So https://my.web.site/addon/arg1/arg2 would give this: DI::args()->getArgc(); // = 3 DI::args()->get(0); // = 'addon' DI::args()->get(1); // = 'arg1' DI::args()->get(2); // = 'arg2' To display a module page, you need to declare the function <addon>_content(App $a) , which defines and returns the page body content. They may also contain <addon>_post(App $a) which is called before the <addon>_content function and typically handles the results of POST forms. You may also have <addon>_init(App $a) which is called before <addon>_content and should include common logic to your module. Templates # If your addon needs some template, you can use the Friendica template system. Friendica uses smarty3 as a template engine. Put your tpl files in the templates/ sub-folder of your addon. In your code, like in the function addon_name_content(), load the template file and execute it passing needed values: use Friendica\\Core\\Renderer; # load template file. first argument is the template name, # second is the addon path relative to friendica top folder $tpl = Renderer::getMarkupTemplate('mytemplate.tpl', __DIR__); # apply template. first argument is the loaded template, # second an array of 'name' => 'values' to pass to template $output = Renderer::replaceMacros($tpl, array( 'title' => 'My beautiful addon', )); See also the wiki page Quick Template Guide . Current PHP hooks # authenticate # Called when a user attempts to login. $b is an array containing: username : the supplied username password : the supplied password authenticated : set this to non-zero to authenticate the user. user_record : successful authentication must also return a valid user record from the database logged_in # Called after a user has successfully logged in. $b contains the $a->user array. display_item # Called when formatting a post for display. $b is an array: item : The item (array) details pulled from the database output : the (string) HTML representation of this item prior to adding it to the page post_local # Called when a status post or comment is entered on the local system. $b is the item array of the information to be stored in the database. Please note: body contents are bbcode - not HTML. post_local_end # Called when a local status post or comment has been stored on the local system. $b is the item array of the information which has just been stored in the database. Please note: body contents are bbcode - not HTML post_remote # Called when receiving a post from another source. This may also be used to post local activity or system generated messages. $b is the item array of information to be stored in the database and the item body is bbcode. addon_settings # Called when generating the HTML for the addon settings page. $data is an array containing: addon (output): Required. The addon folder name. title (output): Required. The addon settings panel title. href (output): Optional. If set, will reduce the panel to a link pointing to this URL, can be relative. Incompatible with the following keys. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display. Examples # With link # $data = [ 'addon' => 'advancedcontentfilter', 'title' => DI::l10n()->t('Advanced Content Filter'), 'href' => 'advancedcontentfilter', ]; With default submit button # $data = [ 'addon' => 'fromapp', 'title' => DI::l10n()->t('FromApp Settings'), 'html' => $html, ]; With no HTML, just a submit button # $data = [ 'addon' => 'opmlexport', 'title' => DI::l10n()->t('OPML Export'), 'submit' => DI::l10n()->t('Export RSS/Atom contacts'), ]; With multiple submit buttons # $data = [ 'addon' => 'catavar', 'title' => DI::l10n()->t('Cat Avatar Settings'), 'html' => $html, 'submit' => [ 'catavatar-usecat' => DI::l10n()->t('Use Cat as Avatar'), 'catavatar-morecat' => DI::l10n()->t('Another random Cat!'), 'catavatar-emailcat' => DI::pConfig()->get(local_user(), 'catavatar', 'seed', false) ? DI::l10n()->t('Reset to email Cat') : null, ], ]; addon_settings_post # Called when the Addon Settings pages are submitted. $b is the $_POST array. connector_settings # Called when generating the HTML for a connector addon settings page. $data is an array containing: connector (output): Required. The addon folder name. title (output): Required. The addon settings panel title. image (output): Required. The relative path of the logo image of the platform/protocol this addon is connecting to, max size 48x48px. enabled (output): Optional. If set to a falsy value, the connector image will be dimmed. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display. Examples # With default submit button # $data = [ 'connector' => 'diaspora', 'title' => DI::l10n()->t('Diaspora Export'), 'image' => 'images/diaspora-logo.png', 'enabled' => $enabled, 'html' => $html, ]; With custom submit button label and no logo dim # $data = [ 'connector' => 'ifttt', 'title' => DI::l10n()->t('IFTTT Mirror'), 'image' => 'addon/ifttt/ifttt.png', 'html' => $html, 'submit' => DI::l10n()->t('Generate new key'), ]; With conditional submit buttons # $submit = ['pumpio-submit' => DI::l10n()->t('Save Settings')]; if ($oauth_token && $oauth_token_secret) { $submit['pumpio-delete'] = DI::l10n()->t('Delete this preset'); } $data = [ 'connector' => 'pumpio', 'title' => DI::l10n()->t('Pump.io Import/Export/Mirror'), 'image' => 'images/pumpio.png', 'enabled' => $enabled, 'html' => $html, 'submit' => $submit, ]; profile_post # Called when posting a profile page. $b is the $_POST array. profile_edit # Called prior to output of profile edit page. $b is an array containing: profile : profile (array) record from the database entry : the (string) HTML of the generated entry profile_advanced # Called when the HTML is generated for the Advanced profile, corresponding to the Profile tab within a person's profile page. $b is the HTML string representation of the generated profile. The profile array details are in $a->profile . directory_item # Called from the Directory page when formatting an item for display. $b is an array: contact : contact record array for the person from the database entry : the HTML string of the generated entry profile_sidebar_enter # Called prior to generating the sidebar \"short\" profile for a page. $b is the person's profile array profile_sidebar # Called when generating the sidebar \"short\" profile for a page. $b is an array: profile : profile record array for the person from the database entry : the HTML string of the generated entry contact_block_end # Called when formatting the block of contacts/friends on a profile sidebar has completed. $b is an array: contacts : array of contacts output : the generated HTML string of the contact block bbcode # Called after conversion of bbcode to HTML. $b is an HTML string converted text. html2bbcode # Called after tag conversion of HTML to bbcode (e.g. remote message posting) $b is a string converted text head # Called when building the <head> sections. Stylesheets should be registered using this hook. $b is an HTML string of the <head> tag. page_header # Called after building the page navigation section. $b is a string HTML of nav region. personal_xrd # Called prior to output of personal XRD file. $b is an array: user : the user record array for the person xml : the complete XML string to be output home_content # Called prior to output home page content, shown to unlogged users. $b is the HTML string of section region. contact_edit # Called when editing contact details on an individual from the Contacts page. $b is an array: contact : contact record (array) of target contact output : the (string) generated HTML of the contact edit page contact_edit_post # Called when posting the contact edit page. $b is the $_POST array init_1 # Called just after DB has been opened and before session start. No hook data. page_end # Called after HTML content functions have completed. $b is (string) HTML of content div. footer # Called after HTML content functions have completed. Deferred Javascript files should be registered using this hook. $b is (string) HTML of footer div/element. avatar_lookup # Called when looking up the avatar. $b is an array: size : the size of the avatar that will be looked up email : email to look up the avatar for url : the (string) generated URL of the avatar emailer_send_prepare # Called from Emailer::send() before building the mime message. $b is an array of params to Emailer::send() . fromName : name of the sender fromEmail : email fo the sender replyTo : replyTo address to direct responses toEmail : destination email address messageSubject : subject of the message htmlVersion : html version of the message textVersion : text only version of the message additionalMailHeader : additions to the smtp mail header sent : default false, if set to true in the hook, the default mailer will be skipped. emailer_send # Called before calling PHP's mail() . $b is an array of params to mail() . to subject body headers sent : default false, if set to true in the hook, the default mailer will be skipped. load_config # Called during App initialization to allow addons to load their own configuration file(s) with App::loadConfigFile() . nav_info # Called after the navigational menu is build in include/nav.php . $b is an array containing $nav from include/nav.php . template_vars # Called before vars are passed to the template engine to render the page. The registered function can add,change or remove variables passed to template. $b is an array with: template : filename of template vars : array of vars passed to the template acl_lookup_end # Called after the other queries have passed. The registered function can add, change or remove the acl_lookup() variables. results : array of the acl_lookup() vars prepare_body_init # Called at the start of prepare_body Hook data: item (input/output): item array prepare_body_content_filter # Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should just add the reason to the filter_reasons element of the hook data. Hook data: item : item array (input) filter_reasons (input/output): reasons array prepare_body # Called after the HTML conversion in prepare_body() . Hook data: item (input): item array html (input/output): converted item body is_preview (input): post preview flag filter_reasons (input): reasons array prepare_body_final # Called at the end of prepare_body() . Hook data: item : item array (input) html : converted item body (input/output) put_item_in_cache # Called after prepare_text() in put_item_in_cache() . Hook data: item (input): item array rendered-html (input/output): final item body HTML rendered-hash (input/output): original item body hash magic_auth_success # Called when a magic-auth was successful. Hook data: visitor => array with the contact record of the visitor url => the query string jot_networks # Called when displaying the post permission screen. Hook data is a list of form fields that need to be displayed along the ACL. Form field array structure is: type : checkbox or select . field : Standard field data structure to be used by field_checkbox.tpl and field_select.tpl . For checkbox , field is: - [0] (String): Form field name; Mandatory. - [1]: (String): Form field label; Optional, default is none. - [2]: (Boolean): Whether the checkbox should be checked by default; Optional, default is false. - [3]: (String): Additional help text; Optional, default is none. - [4]: (String): Additional HTML attributes; Optional, default is none. For select , field is: - [0] (String): Form field name; Mandatory. - [1] (String): Form field label; Optional, default is none. - [2] (Boolean): Default value to be selected by default; Optional, default is none. - [3] (String): Additional help text; Optional, default is none. - [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory. route_collection # Called just before dispatching the router. Hook data is a \\FastRoute\\RouterCollector object that should be used to add addon routes pointing to classes. Notice : The class whose name is provided in the route handler must be reachable via autoloader. probe_detect # Called before trying to detect the target network of a URL. If any registered hook function sets the result key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing result. Hook data: uri (input): the profile URI. network (input): the target network (can be empty for auto-detection). uid (input): the user to return the contact data for (can be empty for public contacts). result (output): Leave null if address isn't relevant to the connector, set to contact array if probe is successful, false otherwise. item_by_link # Called when trying to probe an item from a given URI. If any registered hook function sets the item_id key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing item_id . Hook data: - uri (input): the item URI. - uid (input): the user to return the item data for (can be empty for public contacts). - item_id (output): Leave null if URI isn't relevant to the connector, set to created item array if probe is successful, false otherwise. support_follow # Called to assert whether a connector addon provides follow capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow capabilities, left alone otherwise. support_revoke_follow # Called to assert whether a connector addon provides follow revocation capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow revocation capabilities, left alone otherwise. follow # Called before adding a new contact for a user to handle non-native network remote contact (like Twitter). Hook data: url (input): URL of the remote contact. contact (output): should be filled with the contact (with uid = user creating the contact) array if follow was successful. unfollow # Called when unfollowing a remote contact on a non-native network (like Twitter) Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): whether the unfollowing is successful or not. revoke_follow # Called when making a remote contact on a non-native network (like Twitter) unfollow you. Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): a boolean value indicating whether the operation was successful or not. block # Called when blocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to issue the block for. - result (output): a boolean value indicating whether the operation was successful or not. unblock # Called when unblocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to revoke the block for. - result (output): a boolean value indicating whether the operation was successful or not. storage_instance # Called when a custom storage is used (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage'] (output): the storage instance to use ( must implement \\Friendica\\Core\\Storage\\IWritableStorage ) storage_config # Called when the admin of the node wants to configure a custom storage (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage_config'] (output): the storage configuration instance to use ( must implement \\Friendica\\Core\\Storage\\Capability\\IConfigureStorage ) Complete list of hook callbacks # Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above. index.php # Hook::callAll('init_1'); Hook::callAll('app_menu', $arr); Hook::callAll('page_content_top', DI::page()['content']); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_post', $_POST); Hook::callAll($a->module.'_mod_content', $arr); Hook::callAll($a->module.'_mod_aftercontent', $arr); Hook::callAll('page_end', DI::page()['content']); include/api.php # Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); Hook::callAll('logged_in', $a->user); include/enotify.php # Hook::callAll('enotify', $h); Hook::callAll('enotify_store', $datarray); Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data); src/Content/Conversation.php # Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); Hook::callAll('display_item', $arr); Hook::callAll('item_photo_menu', $args); Hook::callAll('jot_tool', $jotplugins); mod/directory.php # Hook::callAll('directory_item', $arr); mod/xrd.php # Hook::callAll('personal_xrd', $arr); mod/parse_url.php # Hook::callAll(\"parse_link\", $arr); src/Module/Delegation.php # Hook::callAll('home_init', $ret); mod/acl.php # Hook::callAll('acl_lookup_end', $results); mod/network.php # Hook::callAll('network_content_init', $arr); Hook::callAll('network_tabs', $arr); mod/friendica.php # Hook::callAll('about_hook', $o); mod/profiles.php # Hook::callAll('profile_post', $_POST); Hook::callAll('profile_edit', $arr); mod/settings.php # Hook::callAll('addon_settings_post', $_POST); Hook::callAll('connector_settings_post', $_POST); Hook::callAll('display_settings_post', $_POST); Hook::callAll('addon_settings', $settings_addons); Hook::callAll('connector_settings', $settings_connectors); Hook::callAll('display_settings', $o); mod/photos.php # Hook::callAll('photo_post_init', $_POST); Hook::callAll('photo_post_file', $ret); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', intval($item_id)); Hook::callAll('photo_upload_form', $ret); mod/profile.php # Hook::callAll('profile_advanced', $o); mod/home.php # Hook::callAll('home_init', $ret); Hook::callAll(\"home_content\", $content); mod/poke.php # Hook::callAll('post_local_end', $arr); mod/contacts.php # Hook::callAll('contact_edit_post', $_POST); Hook::callAll('contact_edit', $arr); mod/tagger.php # Hook::callAll('post_local_end', $arr); mod/uexport.php # Hook::callAll('uexport_options', $options); mod/register.php # Hook::callAll('register_post', $arr); Hook::callAll('register_form', $arr); mod/item.php # Hook::callAll('post_local_start', $_REQUEST); Hook::callAll('post_local', $datarray); Hook::callAll('post_local_end', $datarray); mod/editpost.php # Hook::callAll('jot_tool', $jotplugins); src/Render/FriendicaSmartyEngine.php # Hook::callAll(\"template_vars\", $arr); src/App.php # Hook::callAll('load_config'); Hook::callAll('head'); Hook::callAll('footer'); Hook::callAll('route_collection'); src/Model/Item.php # Hook::callAll('post_local', $item); Hook::callAll('post_remote', $item); Hook::callAll('post_local_end', $posted_item); Hook::callAll('post_remote_end', $posted_item); Hook::callAll('tagged', $arr); Hook::callAll('post_local_end', $new_item); Hook::callAll('put_item_in_cache', $hook_data); Hook::callAll('prepare_body_init', $item); Hook::callAll('prepare_body_content_filter', $hook_data); Hook::callAll('prepare_body', $hook_data); Hook::callAll('prepare_body_final', $hook_data); src/Model/Contact.php # Hook::callAll('contact_photo_menu', $args); Hook::callAll('follow', $arr); src/Model/Profile.php # Hook::callAll('profile_sidebar_enter', $profile); Hook::callAll('profile_sidebar', $arr); Hook::callAll('profile_tabs', $arr); Hook::callAll('zrl_init', $arr); Hook::callAll('magic_auth_success', $arr); src/Model/Event.php # Hook::callAll('event_updated', $event['id']); Hook::callAll(\"event_created\", $event['id']); src/Model/Register.php # Hook::callAll('authenticate', $addon_auth); src/Model/User.php # Hook::callAll('authenticate', $addon_auth); Hook::callAll('register_account', $uid); Hook::callAll('remove_user', $user); src/Module/Notifications/Ping.php # Hook::callAll('network_ping', $arr); src/Module/PermissionTooltip.php # Hook::callAll('lockview_content', $item); src/Module/Settings/Delegation.php # Hook::callAll('authenticate', $addon_auth); src/Module/Settings/TwoFactor/Index.php # Hook::callAll('authenticate', $addon_auth); src/Security/Authenticate.php # Hook::callAll('authenticate', $addon_auth); src/Security/ExAuth.php # Hook::callAll('authenticate', $addon_auth); src/Content/ContactBlock.php # Hook::callAll('contact_block_end', $arr); src/Content/Text/BBCode.php # Hook::callAll('bbcode', $text); Hook::callAll('bb2diaspora', $text); src/Content/Text/HTML.php # Hook::callAll('html2bbcode', $message); src/Content/Smilies.php # Hook::callAll('smilie', $params); src/Content/Feature.php # Hook::callAll('isEnabled', $arr); Hook::callAll('get', $arr); src/Content/ContactSelector.php # Hook::callAll('network_to_name', $nets); src/Content/OEmbed.php # Hook::callAll('oembed_fetch_url', $embedurl, $j); src/Content/Nav.php # Hook::callAll('page_header', DI::page()['nav']); Hook::callAll('nav_info', $nav); src/Core/Authentication.php # Hook::callAll('logged_in', $a->user); src/Core/Protocol.php # Hook::callAll('support_follow', $hook_data); Hook::callAll('support_revoke_follow', $hook_data); Hook::callAll('unfollow', $hook_data); Hook::callAll('revoke_follow', $hook_data); Hook::callAll('block', $hook_data); Hook::callAll('unblock', $hook_data); src/Core/StorageManager # Hook::callAll('storage_instance', $data); Hook::callAll('storage_config', $data); src/Worker/Directory.php # Hook::callAll('globaldir_update', $arr); src/Worker/Notifier.php # Hook::callAll('notifier_end', $target_item); src/Module/Login.php # Hook::callAll('login_hook', $o); src/Module/Logout.php # Hook::callAll(\"logging_out\"); src/Object/Post.php # Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); src/Core/ACL.php # Hook::callAll('contact_select_options', $x); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll('jot_networks', $jotnets); src/Core/Authentication.php # Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); src/Core/Hook.php # self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata); src/Core/L10n/L10n.php # Hook::callAll('poke_verbs', $arr); src/Core/Worker.php # Hook::callAll(\"proc_run\", $arr); src/Util/Emailer.php # Hook::callAll('emailer_send_prepare', $params); Hook::callAll(\"emailer_send\", $hookdata); src/Util/Map.php # Hook::callAll('generate_map', $arr); Hook::callAll('generate_named_map', $arr); Hook::callAll('Map::getCoordinates', $arr); src/Util/Network.php # Hook::callAll('avatar_lookup', $avatar); src/Util/ParseUrl.php # Hook::callAll(\"getsiteinfo\", $siteinfo); src/Protocol/DFRN.php # Hook::callAll('atom_feed_end', $atom); Hook::callAll('atom_feed_end', $atom); src/Protocol/Email.php # Hook::callAll('email_getmessage', $message); Hook::callAll('email_getmessage_end', $ret); view/js/main.js # document.dispatchEvent(new Event('postprocess_liveupdate'));","title":"Addons"},{"location":"developer/addons/#friendica-addon-development","text":"Please see the sample addon 'randplace' for a working example of using some of these features. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path).","title":"Friendica Addon development"},{"location":"developer/addons/#naming","text":"Addon names are used in file paths and functions names, and as such: - Can't contain spaces or punctuation. - Can't start with a number.","title":"Naming"},{"location":"developer/addons/#metadata","text":"You can provide human-readable information about your addon in the first multi-line comment of your addon file. Here's the structure: /** * Name: {Human-readable name} * Description: {Short description} * Version: 1.0 * Author: {Author1 Name} * Author: {Author2 Name} <{Author profile link}> * Maintainer: {Maintainer1 Name} * Maintainer: {Maintainer2 Name} <{Maintainer profile link}> * Status: {Unsupported|Arbitrary status} */ You can also provide a longer documentation in a README or README.md file. The latter will be converted from Markdown to HTML in the addon detail page.","title":"Metadata"},{"location":"developer/addons/#installuninstall","text":"If your addon uses hooks, they have to be registered in a <addon>_install() function. This function also allows to perform arbitrary actions your addon needs to function properly. Uninstalling an addon automatically unregisters any hook it registered, but if you need to provide specific uninstallation steps, you can add them in a <addon>_uninstall() function. The installation and uninstallation functions will be called (i.e. re-installed) if the addon changes after installation. Therefore, your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for \"setup\" amd \"remove\".","title":"Install/Uninstall"},{"location":"developer/addons/#php-addon-hooks","text":"Register your addon hooks during installation. \\Friendica\\Core\\Hook::register($hookname, $file, $function); $hookname is a string and corresponds to a known Friendica PHP hook. $file is a pathname relative to the top-level Friendica directory. This should be 'addon/ addon_name / addon_name .php' in most cases and can be shortened to __FILE__ . $function is a string and is the name of the function which will be executed when the hook is called.","title":"PHP addon hooks"},{"location":"developer/addons/#arguments","text":"Your hook callback functions will be called with at least one and possibly two arguments function <addon>_<hookname>(App $a, &$b) { } If you wish to make changes to the calling data, you must declare them as reference variables (with & ) during function declaration.","title":"Arguments"},{"location":"developer/addons/#a","text":"$a is the Friendica App class. It contains a wealth of information about the current state of Friendica: which module has been called, configuration information, the page contents at the point the hook was invoked, profile and user information, etc. It is recommended you call this $a to match its usage elsewhere.","title":"$a"},{"location":"developer/addons/#b","text":"$b can be called anything you like. This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter. Remember to declare it with & if you wish to alter it.","title":"$b"},{"location":"developer/addons/#admin-settings","text":"Your addon can provide user-specific settings via the addon_settings PHP hook, but it can also provide node-wide settings in the administration page of your addon. Simply declare a <addon>_addon_admin(App $a) function to display the form and a <addon>_addon_admin_post(App $a) function to process the data from the form.","title":"Admin settings"},{"location":"developer/addons/#global-stylesheets","text":"If your addon requires adding a stylesheet on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('head', __FILE__, '<addon>_head'); ... } function <addon>_head(App $a) { \\Friendica\\DI::page()->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css'); } __DIR__ is the folder path of your addon.","title":"Global stylesheets"},{"location":"developer/addons/#javascript","text":"","title":"JavaScript"},{"location":"developer/addons/#global-scripts","text":"If your addon requires adding a script on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('footer', __FILE__, '<addon>_footer'); ... } function <addon>_footer(App $a) { \\Friendica\\DI::page()->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js'); } __DIR__ is the folder path of your addon.","title":"Global scripts"},{"location":"developer/addons/#javascript-hooks","text":"The main Friendica script provides hooks via events dispatched on the document property. In your Javascript file included as described above, add your event listener like this: document . addEventListener ( name , callback ); name is the name of the hook and corresponds to a known Friendica JavaScript hook. callback is a JavaScript anonymous function to execute. More info about Javascript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener","title":"JavaScript hooks"},{"location":"developer/addons/#current-javascript-hooks","text":"","title":"Current JavaScript hooks"},{"location":"developer/addons/#postprocess_liveupdate","text":"Called at the end of the live update process (XmlHttpRequest) and on a post preview. No additional data is provided.","title":"postprocess_liveupdate"},{"location":"developer/addons/#modules","text":"Addons may also act as \"modules\" and intercept all page requests for a given URL path. In order for an addon to act as a module it needs to declare an empty function <addon>_module() . If this function exists, you will now receive all page requests for https://my.web.site/<addon> - with any number of URL components as additional arguments. These are parsed into the App\\Arguments object. So https://my.web.site/addon/arg1/arg2 would give this: DI::args()->getArgc(); // = 3 DI::args()->get(0); // = 'addon' DI::args()->get(1); // = 'arg1' DI::args()->get(2); // = 'arg2' To display a module page, you need to declare the function <addon>_content(App $a) , which defines and returns the page body content. They may also contain <addon>_post(App $a) which is called before the <addon>_content function and typically handles the results of POST forms. You may also have <addon>_init(App $a) which is called before <addon>_content and should include common logic to your module.","title":"Modules"},{"location":"developer/addons/#templates","text":"If your addon needs some template, you can use the Friendica template system. Friendica uses smarty3 as a template engine. Put your tpl files in the templates/ sub-folder of your addon. In your code, like in the function addon_name_content(), load the template file and execute it passing needed values: use Friendica\\Core\\Renderer; # load template file. first argument is the template name, # second is the addon path relative to friendica top folder $tpl = Renderer::getMarkupTemplate('mytemplate.tpl', __DIR__); # apply template. first argument is the loaded template, # second an array of 'name' => 'values' to pass to template $output = Renderer::replaceMacros($tpl, array( 'title' => 'My beautiful addon', )); See also the wiki page Quick Template Guide .","title":"Templates"},{"location":"developer/addons/#current-php-hooks","text":"","title":"Current PHP hooks"},{"location":"developer/addons/#authenticate","text":"Called when a user attempts to login. $b is an array containing: username : the supplied username password : the supplied password authenticated : set this to non-zero to authenticate the user. user_record : successful authentication must also return a valid user record from the database","title":"authenticate"},{"location":"developer/addons/#logged_in","text":"Called after a user has successfully logged in. $b contains the $a->user array.","title":"logged_in"},{"location":"developer/addons/#display_item","text":"Called when formatting a post for display. $b is an array: item : The item (array) details pulled from the database output : the (string) HTML representation of this item prior to adding it to the page","title":"display_item"},{"location":"developer/addons/#post_local","text":"Called when a status post or comment is entered on the local system. $b is the item array of the information to be stored in the database. Please note: body contents are bbcode - not HTML.","title":"post_local"},{"location":"developer/addons/#post_local_end","text":"Called when a local status post or comment has been stored on the local system. $b is the item array of the information which has just been stored in the database. Please note: body contents are bbcode - not HTML","title":"post_local_end"},{"location":"developer/addons/#post_remote","text":"Called when receiving a post from another source. This may also be used to post local activity or system generated messages. $b is the item array of information to be stored in the database and the item body is bbcode.","title":"post_remote"},{"location":"developer/addons/#addon_settings","text":"Called when generating the HTML for the addon settings page. $data is an array containing: addon (output): Required. The addon folder name. title (output): Required. The addon settings panel title. href (output): Optional. If set, will reduce the panel to a link pointing to this URL, can be relative. Incompatible with the following keys. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display.","title":"addon_settings"},{"location":"developer/addons/#examples","text":"","title":"Examples"},{"location":"developer/addons/#with-link","text":"$data = [ 'addon' => 'advancedcontentfilter', 'title' => DI::l10n()->t('Advanced Content Filter'), 'href' => 'advancedcontentfilter', ];","title":"With link"},{"location":"developer/addons/#with-default-submit-button","text":"$data = [ 'addon' => 'fromapp', 'title' => DI::l10n()->t('FromApp Settings'), 'html' => $html, ];","title":"With default submit button"},{"location":"developer/addons/#with-no-html-just-a-submit-button","text":"$data = [ 'addon' => 'opmlexport', 'title' => DI::l10n()->t('OPML Export'), 'submit' => DI::l10n()->t('Export RSS/Atom contacts'), ];","title":"With no HTML, just a submit button"},{"location":"developer/addons/#with-multiple-submit-buttons","text":"$data = [ 'addon' => 'catavar', 'title' => DI::l10n()->t('Cat Avatar Settings'), 'html' => $html, 'submit' => [ 'catavatar-usecat' => DI::l10n()->t('Use Cat as Avatar'), 'catavatar-morecat' => DI::l10n()->t('Another random Cat!'), 'catavatar-emailcat' => DI::pConfig()->get(local_user(), 'catavatar', 'seed', false) ? DI::l10n()->t('Reset to email Cat') : null, ], ];","title":"With multiple submit buttons"},{"location":"developer/addons/#addon_settings_post","text":"Called when the Addon Settings pages are submitted. $b is the $_POST array.","title":"addon_settings_post"},{"location":"developer/addons/#connector_settings","text":"Called when generating the HTML for a connector addon settings page. $data is an array containing: connector (output): Required. The addon folder name. title (output): Required. The addon settings panel title. image (output): Required. The relative path of the logo image of the platform/protocol this addon is connecting to, max size 48x48px. enabled (output): Optional. If set to a falsy value, the connector image will be dimmed. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display.","title":"connector_settings"},{"location":"developer/addons/#examples_1","text":"","title":"Examples"},{"location":"developer/addons/#with-default-submit-button_1","text":"$data = [ 'connector' => 'diaspora', 'title' => DI::l10n()->t('Diaspora Export'), 'image' => 'images/diaspora-logo.png', 'enabled' => $enabled, 'html' => $html, ];","title":"With default submit button"},{"location":"developer/addons/#with-custom-submit-button-label-and-no-logo-dim","text":"$data = [ 'connector' => 'ifttt', 'title' => DI::l10n()->t('IFTTT Mirror'), 'image' => 'addon/ifttt/ifttt.png', 'html' => $html, 'submit' => DI::l10n()->t('Generate new key'), ];","title":"With custom submit button label and no logo dim"},{"location":"developer/addons/#with-conditional-submit-buttons","text":"$submit = ['pumpio-submit' => DI::l10n()->t('Save Settings')]; if ($oauth_token && $oauth_token_secret) { $submit['pumpio-delete'] = DI::l10n()->t('Delete this preset'); } $data = [ 'connector' => 'pumpio', 'title' => DI::l10n()->t('Pump.io Import/Export/Mirror'), 'image' => 'images/pumpio.png', 'enabled' => $enabled, 'html' => $html, 'submit' => $submit, ];","title":"With conditional submit buttons"},{"location":"developer/addons/#profile_post","text":"Called when posting a profile page. $b is the $_POST array.","title":"profile_post"},{"location":"developer/addons/#profile_edit","text":"Called prior to output of profile edit page. $b is an array containing: profile : profile (array) record from the database entry : the (string) HTML of the generated entry","title":"profile_edit"},{"location":"developer/addons/#profile_advanced","text":"Called when the HTML is generated for the Advanced profile, corresponding to the Profile tab within a person's profile page. $b is the HTML string representation of the generated profile. The profile array details are in $a->profile .","title":"profile_advanced"},{"location":"developer/addons/#directory_item","text":"Called from the Directory page when formatting an item for display. $b is an array: contact : contact record array for the person from the database entry : the HTML string of the generated entry","title":"directory_item"},{"location":"developer/addons/#profile_sidebar_enter","text":"Called prior to generating the sidebar \"short\" profile for a page. $b is the person's profile array","title":"profile_sidebar_enter"},{"location":"developer/addons/#profile_sidebar","text":"Called when generating the sidebar \"short\" profile for a page. $b is an array: profile : profile record array for the person from the database entry : the HTML string of the generated entry","title":"profile_sidebar"},{"location":"developer/addons/#contact_block_end","text":"Called when formatting the block of contacts/friends on a profile sidebar has completed. $b is an array: contacts : array of contacts output : the generated HTML string of the contact block","title":"contact_block_end"},{"location":"developer/addons/#bbcode","text":"Called after conversion of bbcode to HTML. $b is an HTML string converted text.","title":"bbcode"},{"location":"developer/addons/#html2bbcode","text":"Called after tag conversion of HTML to bbcode (e.g. remote message posting) $b is a string converted text","title":"html2bbcode"},{"location":"developer/addons/#head","text":"Called when building the <head> sections. Stylesheets should be registered using this hook. $b is an HTML string of the <head> tag.","title":"head"},{"location":"developer/addons/#page_header","text":"Called after building the page navigation section. $b is a string HTML of nav region.","title":"page_header"},{"location":"developer/addons/#personal_xrd","text":"Called prior to output of personal XRD file. $b is an array: user : the user record array for the person xml : the complete XML string to be output","title":"personal_xrd"},{"location":"developer/addons/#home_content","text":"Called prior to output home page content, shown to unlogged users. $b is the HTML string of section region.","title":"home_content"},{"location":"developer/addons/#contact_edit","text":"Called when editing contact details on an individual from the Contacts page. $b is an array: contact : contact record (array) of target contact output : the (string) generated HTML of the contact edit page","title":"contact_edit"},{"location":"developer/addons/#contact_edit_post","text":"Called when posting the contact edit page. $b is the $_POST array","title":"contact_edit_post"},{"location":"developer/addons/#init_1","text":"Called just after DB has been opened and before session start. No hook data.","title":"init_1"},{"location":"developer/addons/#page_end","text":"Called after HTML content functions have completed. $b is (string) HTML of content div.","title":"page_end"},{"location":"developer/addons/#footer","text":"Called after HTML content functions have completed. Deferred Javascript files should be registered using this hook. $b is (string) HTML of footer div/element.","title":"footer"},{"location":"developer/addons/#avatar_lookup","text":"Called when looking up the avatar. $b is an array: size : the size of the avatar that will be looked up email : email to look up the avatar for url : the (string) generated URL of the avatar","title":"avatar_lookup"},{"location":"developer/addons/#emailer_send_prepare","text":"Called from Emailer::send() before building the mime message. $b is an array of params to Emailer::send() . fromName : name of the sender fromEmail : email fo the sender replyTo : replyTo address to direct responses toEmail : destination email address messageSubject : subject of the message htmlVersion : html version of the message textVersion : text only version of the message additionalMailHeader : additions to the smtp mail header sent : default false, if set to true in the hook, the default mailer will be skipped.","title":"emailer_send_prepare"},{"location":"developer/addons/#emailer_send","text":"Called before calling PHP's mail() . $b is an array of params to mail() . to subject body headers sent : default false, if set to true in the hook, the default mailer will be skipped.","title":"emailer_send"},{"location":"developer/addons/#load_config","text":"Called during App initialization to allow addons to load their own configuration file(s) with App::loadConfigFile() .","title":"load_config"},{"location":"developer/addons/#nav_info","text":"Called after the navigational menu is build in include/nav.php . $b is an array containing $nav from include/nav.php .","title":"nav_info"},{"location":"developer/addons/#template_vars","text":"Called before vars are passed to the template engine to render the page. The registered function can add,change or remove variables passed to template. $b is an array with: template : filename of template vars : array of vars passed to the template","title":"template_vars"},{"location":"developer/addons/#acl_lookup_end","text":"Called after the other queries have passed. The registered function can add, change or remove the acl_lookup() variables. results : array of the acl_lookup() vars","title":"acl_lookup_end"},{"location":"developer/addons/#prepare_body_init","text":"Called at the start of prepare_body Hook data: item (input/output): item array","title":"prepare_body_init"},{"location":"developer/addons/#prepare_body_content_filter","text":"Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should just add the reason to the filter_reasons element of the hook data. Hook data: item : item array (input) filter_reasons (input/output): reasons array","title":"prepare_body_content_filter"},{"location":"developer/addons/#prepare_body","text":"Called after the HTML conversion in prepare_body() . Hook data: item (input): item array html (input/output): converted item body is_preview (input): post preview flag filter_reasons (input): reasons array","title":"prepare_body"},{"location":"developer/addons/#prepare_body_final","text":"Called at the end of prepare_body() . Hook data: item : item array (input) html : converted item body (input/output)","title":"prepare_body_final"},{"location":"developer/addons/#put_item_in_cache","text":"Called after prepare_text() in put_item_in_cache() . Hook data: item (input): item array rendered-html (input/output): final item body HTML rendered-hash (input/output): original item body hash","title":"put_item_in_cache"},{"location":"developer/addons/#magic_auth_success","text":"Called when a magic-auth was successful. Hook data: visitor => array with the contact record of the visitor url => the query string","title":"magic_auth_success"},{"location":"developer/addons/#jot_networks","text":"Called when displaying the post permission screen. Hook data is a list of form fields that need to be displayed along the ACL. Form field array structure is: type : checkbox or select . field : Standard field data structure to be used by field_checkbox.tpl and field_select.tpl . For checkbox , field is: - [0] (String): Form field name; Mandatory. - [1]: (String): Form field label; Optional, default is none. - [2]: (Boolean): Whether the checkbox should be checked by default; Optional, default is false. - [3]: (String): Additional help text; Optional, default is none. - [4]: (String): Additional HTML attributes; Optional, default is none. For select , field is: - [0] (String): Form field name; Mandatory. - [1] (String): Form field label; Optional, default is none. - [2] (Boolean): Default value to be selected by default; Optional, default is none. - [3] (String): Additional help text; Optional, default is none. - [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory.","title":"jot_networks"},{"location":"developer/addons/#route_collection","text":"Called just before dispatching the router. Hook data is a \\FastRoute\\RouterCollector object that should be used to add addon routes pointing to classes. Notice : The class whose name is provided in the route handler must be reachable via autoloader.","title":"route_collection"},{"location":"developer/addons/#probe_detect","text":"Called before trying to detect the target network of a URL. If any registered hook function sets the result key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing result. Hook data: uri (input): the profile URI. network (input): the target network (can be empty for auto-detection). uid (input): the user to return the contact data for (can be empty for public contacts). result (output): Leave null if address isn't relevant to the connector, set to contact array if probe is successful, false otherwise.","title":"probe_detect"},{"location":"developer/addons/#item_by_link","text":"Called when trying to probe an item from a given URI. If any registered hook function sets the item_id key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing item_id . Hook data: - uri (input): the item URI. - uid (input): the user to return the item data for (can be empty for public contacts). - item_id (output): Leave null if URI isn't relevant to the connector, set to created item array if probe is successful, false otherwise.","title":"item_by_link"},{"location":"developer/addons/#support_follow","text":"Called to assert whether a connector addon provides follow capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow capabilities, left alone otherwise.","title":"support_follow"},{"location":"developer/addons/#support_revoke_follow","text":"Called to assert whether a connector addon provides follow revocation capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow revocation capabilities, left alone otherwise.","title":"support_revoke_follow"},{"location":"developer/addons/#follow","text":"Called before adding a new contact for a user to handle non-native network remote contact (like Twitter). Hook data: url (input): URL of the remote contact. contact (output): should be filled with the contact (with uid = user creating the contact) array if follow was successful.","title":"follow"},{"location":"developer/addons/#unfollow","text":"Called when unfollowing a remote contact on a non-native network (like Twitter) Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): whether the unfollowing is successful or not.","title":"unfollow"},{"location":"developer/addons/#revoke_follow","text":"Called when making a remote contact on a non-native network (like Twitter) unfollow you. Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): a boolean value indicating whether the operation was successful or not.","title":"revoke_follow"},{"location":"developer/addons/#block","text":"Called when blocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to issue the block for. - result (output): a boolean value indicating whether the operation was successful or not.","title":"block"},{"location":"developer/addons/#unblock","text":"Called when unblocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to revoke the block for. - result (output): a boolean value indicating whether the operation was successful or not.","title":"unblock"},{"location":"developer/addons/#storage_instance","text":"Called when a custom storage is used (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage'] (output): the storage instance to use ( must implement \\Friendica\\Core\\Storage\\IWritableStorage )","title":"storage_instance"},{"location":"developer/addons/#storage_config","text":"Called when the admin of the node wants to configure a custom storage (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage_config'] (output): the storage configuration instance to use ( must implement \\Friendica\\Core\\Storage\\Capability\\IConfigureStorage )","title":"storage_config"},{"location":"developer/addons/#complete-list-of-hook-callbacks","text":"Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above.","title":"Complete list of hook callbacks"},{"location":"developer/addons/#indexphp","text":"Hook::callAll('init_1'); Hook::callAll('app_menu', $arr); Hook::callAll('page_content_top', DI::page()['content']); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_post', $_POST); Hook::callAll($a->module.'_mod_content', $arr); Hook::callAll($a->module.'_mod_aftercontent', $arr); Hook::callAll('page_end', DI::page()['content']);","title":"index.php"},{"location":"developer/addons/#includeapiphp","text":"Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); Hook::callAll('logged_in', $a->user);","title":"include/api.php"},{"location":"developer/addons/#includeenotifyphp","text":"Hook::callAll('enotify', $h); Hook::callAll('enotify_store', $datarray); Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data);","title":"include/enotify.php"},{"location":"developer/addons/#srccontentconversationphp","text":"Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); Hook::callAll('display_item', $arr); Hook::callAll('item_photo_menu', $args); Hook::callAll('jot_tool', $jotplugins);","title":"src/Content/Conversation.php"},{"location":"developer/addons/#moddirectoryphp","text":"Hook::callAll('directory_item', $arr);","title":"mod/directory.php"},{"location":"developer/addons/#modxrdphp","text":"Hook::callAll('personal_xrd', $arr);","title":"mod/xrd.php"},{"location":"developer/addons/#modparse_urlphp","text":"Hook::callAll(\"parse_link\", $arr);","title":"mod/parse_url.php"},{"location":"developer/addons/#srcmoduledelegationphp","text":"Hook::callAll('home_init', $ret);","title":"src/Module/Delegation.php"},{"location":"developer/addons/#modaclphp","text":"Hook::callAll('acl_lookup_end', $results);","title":"mod/acl.php"},{"location":"developer/addons/#modnetworkphp","text":"Hook::callAll('network_content_init', $arr); Hook::callAll('network_tabs', $arr);","title":"mod/network.php"},{"location":"developer/addons/#modfriendicaphp","text":"Hook::callAll('about_hook', $o);","title":"mod/friendica.php"},{"location":"developer/addons/#modprofilesphp","text":"Hook::callAll('profile_post', $_POST); Hook::callAll('profile_edit', $arr);","title":"mod/profiles.php"},{"location":"developer/addons/#modsettingsphp","text":"Hook::callAll('addon_settings_post', $_POST); Hook::callAll('connector_settings_post', $_POST); Hook::callAll('display_settings_post', $_POST); Hook::callAll('addon_settings', $settings_addons); Hook::callAll('connector_settings', $settings_connectors); Hook::callAll('display_settings', $o);","title":"mod/settings.php"},{"location":"developer/addons/#modphotosphp","text":"Hook::callAll('photo_post_init', $_POST); Hook::callAll('photo_post_file', $ret); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', intval($item_id)); Hook::callAll('photo_upload_form', $ret);","title":"mod/photos.php"},{"location":"developer/addons/#modprofilephp","text":"Hook::callAll('profile_advanced', $o);","title":"mod/profile.php"},{"location":"developer/addons/#modhomephp","text":"Hook::callAll('home_init', $ret); Hook::callAll(\"home_content\", $content);","title":"mod/home.php"},{"location":"developer/addons/#modpokephp","text":"Hook::callAll('post_local_end', $arr);","title":"mod/poke.php"},{"location":"developer/addons/#modcontactsphp","text":"Hook::callAll('contact_edit_post', $_POST); Hook::callAll('contact_edit', $arr);","title":"mod/contacts.php"},{"location":"developer/addons/#modtaggerphp","text":"Hook::callAll('post_local_end', $arr);","title":"mod/tagger.php"},{"location":"developer/addons/#moduexportphp","text":"Hook::callAll('uexport_options', $options);","title":"mod/uexport.php"},{"location":"developer/addons/#modregisterphp","text":"Hook::callAll('register_post', $arr); Hook::callAll('register_form', $arr);","title":"mod/register.php"},{"location":"developer/addons/#moditemphp","text":"Hook::callAll('post_local_start', $_REQUEST); Hook::callAll('post_local', $datarray); Hook::callAll('post_local_end', $datarray);","title":"mod/item.php"},{"location":"developer/addons/#modeditpostphp","text":"Hook::callAll('jot_tool', $jotplugins);","title":"mod/editpost.php"},{"location":"developer/addons/#srcrenderfriendicasmartyenginephp","text":"Hook::callAll(\"template_vars\", $arr);","title":"src/Render/FriendicaSmartyEngine.php"},{"location":"developer/addons/#srcappphp","text":"Hook::callAll('load_config'); Hook::callAll('head'); Hook::callAll('footer'); Hook::callAll('route_collection');","title":"src/App.php"},{"location":"developer/addons/#srcmodelitemphp","text":"Hook::callAll('post_local', $item); Hook::callAll('post_remote', $item); Hook::callAll('post_local_end', $posted_item); Hook::callAll('post_remote_end', $posted_item); Hook::callAll('tagged', $arr); Hook::callAll('post_local_end', $new_item); Hook::callAll('put_item_in_cache', $hook_data); Hook::callAll('prepare_body_init', $item); Hook::callAll('prepare_body_content_filter', $hook_data); Hook::callAll('prepare_body', $hook_data); Hook::callAll('prepare_body_final', $hook_data);","title":"src/Model/Item.php"},{"location":"developer/addons/#srcmodelcontactphp","text":"Hook::callAll('contact_photo_menu', $args); Hook::callAll('follow', $arr);","title":"src/Model/Contact.php"},{"location":"developer/addons/#srcmodelprofilephp","text":"Hook::callAll('profile_sidebar_enter', $profile); Hook::callAll('profile_sidebar', $arr); Hook::callAll('profile_tabs', $arr); Hook::callAll('zrl_init', $arr); Hook::callAll('magic_auth_success', $arr);","title":"src/Model/Profile.php"},{"location":"developer/addons/#srcmodeleventphp","text":"Hook::callAll('event_updated', $event['id']); Hook::callAll(\"event_created\", $event['id']);","title":"src/Model/Event.php"},{"location":"developer/addons/#srcmodelregisterphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Model/Register.php"},{"location":"developer/addons/#srcmodeluserphp","text":"Hook::callAll('authenticate', $addon_auth); Hook::callAll('register_account', $uid); Hook::callAll('remove_user', $user);","title":"src/Model/User.php"},{"location":"developer/addons/#srcmodulenotificationspingphp","text":"Hook::callAll('network_ping', $arr);","title":"src/Module/Notifications/Ping.php"},{"location":"developer/addons/#srcmodulepermissiontooltipphp","text":"Hook::callAll('lockview_content', $item);","title":"src/Module/PermissionTooltip.php"},{"location":"developer/addons/#srcmodulesettingsdelegationphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Module/Settings/Delegation.php"},{"location":"developer/addons/#srcmodulesettingstwofactorindexphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Module/Settings/TwoFactor/Index.php"},{"location":"developer/addons/#srcsecurityauthenticatephp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Security/Authenticate.php"},{"location":"developer/addons/#srcsecurityexauthphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Security/ExAuth.php"},{"location":"developer/addons/#srccontentcontactblockphp","text":"Hook::callAll('contact_block_end', $arr);","title":"src/Content/ContactBlock.php"},{"location":"developer/addons/#srccontenttextbbcodephp","text":"Hook::callAll('bbcode', $text); Hook::callAll('bb2diaspora', $text);","title":"src/Content/Text/BBCode.php"},{"location":"developer/addons/#srccontenttexthtmlphp","text":"Hook::callAll('html2bbcode', $message);","title":"src/Content/Text/HTML.php"},{"location":"developer/addons/#srccontentsmiliesphp","text":"Hook::callAll('smilie', $params);","title":"src/Content/Smilies.php"},{"location":"developer/addons/#srccontentfeaturephp","text":"Hook::callAll('isEnabled', $arr); Hook::callAll('get', $arr);","title":"src/Content/Feature.php"},{"location":"developer/addons/#srccontentcontactselectorphp","text":"Hook::callAll('network_to_name', $nets);","title":"src/Content/ContactSelector.php"},{"location":"developer/addons/#srccontentoembedphp","text":"Hook::callAll('oembed_fetch_url', $embedurl, $j);","title":"src/Content/OEmbed.php"},{"location":"developer/addons/#srccontentnavphp","text":"Hook::callAll('page_header', DI::page()['nav']); Hook::callAll('nav_info', $nav);","title":"src/Content/Nav.php"},{"location":"developer/addons/#srccoreauthenticationphp","text":"Hook::callAll('logged_in', $a->user);","title":"src/Core/Authentication.php"},{"location":"developer/addons/#srccoreprotocolphp","text":"Hook::callAll('support_follow', $hook_data); Hook::callAll('support_revoke_follow', $hook_data); Hook::callAll('unfollow', $hook_data); Hook::callAll('revoke_follow', $hook_data); Hook::callAll('block', $hook_data); Hook::callAll('unblock', $hook_data);","title":"src/Core/Protocol.php"},{"location":"developer/addons/#srccorestoragemanager","text":"Hook::callAll('storage_instance', $data); Hook::callAll('storage_config', $data);","title":"src/Core/StorageManager"},{"location":"developer/addons/#srcworkerdirectoryphp","text":"Hook::callAll('globaldir_update', $arr);","title":"src/Worker/Directory.php"},{"location":"developer/addons/#srcworkernotifierphp","text":"Hook::callAll('notifier_end', $target_item);","title":"src/Worker/Notifier.php"},{"location":"developer/addons/#srcmoduleloginphp","text":"Hook::callAll('login_hook', $o);","title":"src/Module/Login.php"},{"location":"developer/addons/#srcmodulelogoutphp","text":"Hook::callAll(\"logging_out\");","title":"src/Module/Logout.php"},{"location":"developer/addons/#srcobjectpostphp","text":"Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr);","title":"src/Object/Post.php"},{"location":"developer/addons/#srccoreaclphp","text":"Hook::callAll('contact_select_options', $x); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll('jot_networks', $jotnets);","title":"src/Core/ACL.php"},{"location":"developer/addons/#srccoreauthenticationphp_1","text":"Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth);","title":"src/Core/Authentication.php"},{"location":"developer/addons/#srccorehookphp","text":"self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata);","title":"src/Core/Hook.php"},{"location":"developer/addons/#srccorel10nl10nphp","text":"Hook::callAll('poke_verbs', $arr);","title":"src/Core/L10n/L10n.php"},{"location":"developer/addons/#srccoreworkerphp","text":"Hook::callAll(\"proc_run\", $arr);","title":"src/Core/Worker.php"},{"location":"developer/addons/#srcutilemailerphp","text":"Hook::callAll('emailer_send_prepare', $params); Hook::callAll(\"emailer_send\", $hookdata);","title":"src/Util/Emailer.php"},{"location":"developer/addons/#srcutilmapphp","text":"Hook::callAll('generate_map', $arr); Hook::callAll('generate_named_map', $arr); Hook::callAll('Map::getCoordinates', $arr);","title":"src/Util/Map.php"},{"location":"developer/addons/#srcutilnetworkphp","text":"Hook::callAll('avatar_lookup', $avatar);","title":"src/Util/Network.php"},{"location":"developer/addons/#srcutilparseurlphp","text":"Hook::callAll(\"getsiteinfo\", $siteinfo);","title":"src/Util/ParseUrl.php"},{"location":"developer/addons/#srcprotocoldfrnphp","text":"Hook::callAll('atom_feed_end', $atom); Hook::callAll('atom_feed_end', $atom);","title":"src/Protocol/DFRN.php"},{"location":"developer/addons/#srcprotocolemailphp","text":"Hook::callAll('email_getmessage', $message); Hook::callAll('email_getmessage_end', $ret);","title":"src/Protocol/Email.php"},{"location":"developer/addons/#viewjsmainjs","text":"document.dispatchEvent(new Event('postprocess_liveupdate'));","title":"view/js/main.js"},{"location":"user/account-basics/","tags":["user","basics"],"text":"Account Basics # Registration # Not all Friendica sites allow open registration. If registration is allowed, you will see a \"Register\" link immediately below the login prompt on the site's home page. Following this link will take you to the site registration page. The strength of our network is that lots of different sites are all completely compatible with each other. If the site you're visiting doesn't allow registration, or you think you might prefer another one, there is a list of public servers here , and hopefully you will find one that meets your needs. If you'd like to have your own server, you can do that too. Visit the Friendica website to download the code with setup instructions. It's a very simple installation process that anybody experienced in hosting websites, or with basic Linux experience can handle easily. OpenID # The first field on the Registration page is for an OpenID address. If you do not have an OpenID address or do not wish to use OpenID, leave this field blank. If you have an OpenID account elsewhere and wish to use it, enter the address into this field and click 'Register'. Friendica will attempt to extract as much information as possible from your OpenID provider and return to this page with those items already filled in. Your Full Name # Please provide your full name as you would like it to be displayed on this system . Most people use their real name for this, but you're under no obligation to do so yourself. Email Address # Please provide a valid email address. Your email address is never published. We need this to send you account information and your login details. You may also occasionally receive notifications of incoming messages or items requiring your attention, but you have the possibility to completely disable these from your Settings page once you have logged in. This doesn't have to be your primary email address, but it does need to be a real email address. You can't get your initial password, or reset a lost password later without it. This is the only bit of personal information that has to be accurate. Nickname # A nickname is used to generate web addresses for many of your personal pages, and is also treated like an email address when establishing communications with others. Due to the way that the nickname is used, it has some limitations. It must contain only US-ASCII text characters and numbers, and must also start with a text character. It also must be unique on this system. This is used in many places to identify your account, and once set it cannot be changed. Directory Publishing # The registration form also allows you to choose whether to list your account in the online directory of your node. This is like a \"phone book\" and you may choose to be unlisted. We recommend that you select 'Yes' so that other people (friends, family, etc.) will be able to find you. If you choose 'No', you will essentially be invisible and have few opportunities for interaction. Whichever you choose, this can be changed any time from your Settings page after you log in. Register # Once you have provided the necessary details, click the 'Register' button. An email will be sent to you providing your account login details. Please check your email (including spam folders) for your registration details and initial password. Login Page # On the 'Login' page, please enter your login information that was provided during registration. You may use either your nickname or email address as a Login Name. If you use your account to manage other accounts and these all have the same email address, please enter the nickname for the account you wish to manage. If your account has been OpenID enabled, you may use your OpenID-address as a login name and leave the password blank. You will be redirected to your OpenID provider to complete your authorisation. Otherwise, enter your password. This will have been initially provided in your registration email message. Your password is case-sensitive, so please check your 'Caps Lock' key if you are having difficulty logging in. Changing Your Password # After your first login, please visit the 'Settings' page from the top menu bar and change your password to something that you will remember. Getting Started # A link with 'Tips for New Members' (`https://your-site.info/newmember) will show up on your network and home pages for two weeks providing key information for getting started. Retrieving Personal Data # You can export a copy of your personal data in JSON format from the \"Export personal data\" link at the top of your settings page. You need this file to relocate your Friendica account to another node. This might be necessary, e.g. if your node suffers a severe hardware problem and is not recoverable. See Also # Global Directory Groups and Privacy Move Account Remove Account","title":"Account Basics"},{"location":"user/account-basics/#account-basics","text":"","title":"Account Basics"},{"location":"user/account-basics/#registration","text":"Not all Friendica sites allow open registration. If registration is allowed, you will see a \"Register\" link immediately below the login prompt on the site's home page. Following this link will take you to the site registration page. The strength of our network is that lots of different sites are all completely compatible with each other. If the site you're visiting doesn't allow registration, or you think you might prefer another one, there is a list of public servers here , and hopefully you will find one that meets your needs. If you'd like to have your own server, you can do that too. Visit the Friendica website to download the code with setup instructions. It's a very simple installation process that anybody experienced in hosting websites, or with basic Linux experience can handle easily.","title":"Registration"},{"location":"user/account-basics/#openid","text":"The first field on the Registration page is for an OpenID address. If you do not have an OpenID address or do not wish to use OpenID, leave this field blank. If you have an OpenID account elsewhere and wish to use it, enter the address into this field and click 'Register'. Friendica will attempt to extract as much information as possible from your OpenID provider and return to this page with those items already filled in.","title":"OpenID"},{"location":"user/account-basics/#your-full-name","text":"Please provide your full name as you would like it to be displayed on this system . Most people use their real name for this, but you're under no obligation to do so yourself.","title":"Your Full Name"},{"location":"user/account-basics/#email-address","text":"Please provide a valid email address. Your email address is never published. We need this to send you account information and your login details. You may also occasionally receive notifications of incoming messages or items requiring your attention, but you have the possibility to completely disable these from your Settings page once you have logged in. This doesn't have to be your primary email address, but it does need to be a real email address. You can't get your initial password, or reset a lost password later without it. This is the only bit of personal information that has to be accurate.","title":"Email Address"},{"location":"user/account-basics/#nickname","text":"A nickname is used to generate web addresses for many of your personal pages, and is also treated like an email address when establishing communications with others. Due to the way that the nickname is used, it has some limitations. It must contain only US-ASCII text characters and numbers, and must also start with a text character. It also must be unique on this system. This is used in many places to identify your account, and once set it cannot be changed.","title":"Nickname"},{"location":"user/account-basics/#directory-publishing","text":"The registration form also allows you to choose whether to list your account in the online directory of your node. This is like a \"phone book\" and you may choose to be unlisted. We recommend that you select 'Yes' so that other people (friends, family, etc.) will be able to find you. If you choose 'No', you will essentially be invisible and have few opportunities for interaction. Whichever you choose, this can be changed any time from your Settings page after you log in.","title":"Directory Publishing"},{"location":"user/account-basics/#register","text":"Once you have provided the necessary details, click the 'Register' button. An email will be sent to you providing your account login details. Please check your email (including spam folders) for your registration details and initial password.","title":"Register"},{"location":"user/account-basics/#login-page","text":"On the 'Login' page, please enter your login information that was provided during registration. You may use either your nickname or email address as a Login Name. If you use your account to manage other accounts and these all have the same email address, please enter the nickname for the account you wish to manage. If your account has been OpenID enabled, you may use your OpenID-address as a login name and leave the password blank. You will be redirected to your OpenID provider to complete your authorisation. Otherwise, enter your password. This will have been initially provided in your registration email message. Your password is case-sensitive, so please check your 'Caps Lock' key if you are having difficulty logging in.","title":"Login Page"},{"location":"user/account-basics/#changing-your-password","text":"After your first login, please visit the 'Settings' page from the top menu bar and change your password to something that you will remember.","title":"Changing Your Password"},{"location":"user/account-basics/#getting-started","text":"A link with 'Tips for New Members' (`https://your-site.info/newmember) will show up on your network and home pages for two weeks providing key information for getting started.","title":"Getting Started"},{"location":"user/account-basics/#retrieving-personal-data","text":"You can export a copy of your personal data in JSON format from the \"Export personal data\" link at the top of your settings page. You need this file to relocate your Friendica account to another node. This might be necessary, e.g. if your node suffers a severe hardware problem and is not recoverable.","title":"Retrieving Personal Data"},{"location":"user/account-basics/#see-also","text":"Global Directory Groups and Privacy Move Account Remove Account","title":"See Also"},{"location":"user/bbcode/","tags":["user"],"text":"Friendica BBCode tags reference # Inline # table.bbcodes { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.bbcodes > tr > th, table.bbcodes > tr > td, table.bbcodes > * > tr > th, table.bbcodes > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.bbcodes > tr > th, table.bbcodes > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } BBCode Result [b]bold[/b] bold [i]italic[/i] italic [u]underlined[/u] underlined [s]strike[/s] strike [o]overline[/o] overline [color=red]red[/color] red [url=https://friendi.ca]Friendica[/url] Friendica [img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png[/img] [img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png]The Friendica Logo[/img] [img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg[/img] Note: provided height is simply discarded. [size=xx-small]small text[/size] small text [size=xx-large]big text[/size] big text [size=20]exact size[/size] (size can be any number, in pixels) exact size [font=serif]Serif font[/font] Serif font Links # BBCode Result [url]https://friendi.ca[/url] https://friendi.ca [url=https://friendi.ca]Friendica[/url] Friendica [bookmark]https://friendi.ca[/bookmark] #^[url]https://friendi.ca[/url] Friendica: https://friendi.ca [bookmark=https://friendi.ca]Bookmark[/bookmark] #^[url=https://friendi.ca]Bookmark[/url] #[url=https://friendi.ca]^[/url][url=https://friendi.ca]Bookmark[/url] Friendica: Bookmark [url=/posts/f16d77b0630f0134740c0cc47a0ea02a]Diaspora post with GUID[/url] Diaspora post with GUID #Friendica # Friendica @Mention @ Mention acct:account@friendica.host.com (WebFinger) acct:account@friendica.host.com [mail]user@mail.example.com[/mail] user@mail.example.com [mail=user@mail.example.com]Send an email to User[/mail] Send an email to User Blocks # BBCode Result [p]A paragraph of text[/p] A paragraph of text Inline [code]code[/code] in a paragraph Inline code in a paragraph [code]Multi line code[/code] Multi line code [code=php]function text_highlight($s,$lang)[/code] 1 function text_highlight ( $s , $lang ) [quote]quote[/quote] quote [quote=Author]Author? Me? No, no, no...[/quote] Author wrote: Author? Me? No, no, no... [center]Centered text[/center] Centered text You should not read any further if you want to be surprised.[spoiler]There is a happy end.[/spoiler] You should not read any further if you want to be surprised. Click to open/close There is a happy end. [spoiler=Author]Spoiler quote[/spoiler] Author wrote: Click to open/close Spoiler quote [hr] (horizontal line) 1 : Supported language parameter values for code highlighting: - abap - avrc - cpp - css - diff - dtd - html - java - javascript - js - mysql - perl - php - python - ruby - sh - sql - vbscript - xml Titles # BBCode Result [h1]Title 1[/h1] Title 1 [h2]Title 2[/h2] Title 2 [h3]Title 3[/h3] Title 3 [h4]Title 4[/h4] Title 4 [h5]Title 5[/h5] Title 5 [h6]Title 6[/h6] Title 6 Tables # BBCode Result [table] [tr] [th]Header 1[/th] [th]Header 2[/th] [th]Header 2[/th] [/tr] [tr] [td]Cell 1[/td] [td]Cell 2[/td] [td]Cell 3[/td] [/tr] [tr] [td]Cell 4[/td] [td]Cell 5[/td] [td]Cell 6[/td] [/tr] [/table] Header 1 Header 2 Header 3 Cell 1 Cell 2 Cell 3 Cell 4 Cell 5 Cell 6 [table border=0] Header 1 Header 2 Header 3 Cell 1 Cell 2 Cell 3 Cell 4 Cell 5 Cell 6 [table border=1] Header 1 Header 2 Header 3 Cell 1 Cell 2 Cell 3 Cell 4 Cell 5 Cell 6 Lists # BBCode Result [ul] [li] First list element [li] Second list element [/ul] [list] [*] First list element [*] Second list element [/list] First list element Second list element [ol] [*] First list element [*] Second list element [/ol] [list=1] [*] First list element [*] Second list element [/list] First list element Second list element [list=] [*] First list element [*] Second list element [/list] First list element Second list element [list=i] [*] First list element [*] Second list element [/list] First list element Second list element [list=I] [*] First list element [*] Second list element [/list] First list element Second list element [list=a] [*] First list element [*] Second list element [/list] First list element Second list element [list=A] [*] First list element [*] Second list element [/list] First list element Second list element Embed # You can embed video, audio and more in a message. BBCode Result [video]url[/video] Where *url* can be an url to YouTube, vimeo, soundcloud, or other sites wich supports oembed or opengraph specifications. [video]Video file url[/video] [audio]Audio file url[/audio] Full URL to an ogg/ogv/oga/ogm/webm/mp4/mp3 file. An HTML5 player will be used to show it. [youtube]Youtube URL[/youtube] Youtube video OEmbed display. May not embed an actual player. [youtube]Youtube video ID[/youtube] Youtube player iframe embed. [vimeo]Vimeo URL[/vimeo] Vimeo video OEmbed display. May not embed an actual player. [vimeo]Vimeo video ID[/vimeo] Vimeo player iframe embed. [embed]URL[/embed] Embed OEmbed rich content. [url]*url*[/url] If *url* supports oembed or opengraph specifications the embedded object will be shown (eg, documents from scribd). Page title with a link to *url* will be shown. Map # This requires \"openstreetmap\" or \"Google Maps\" addon version 1.3 or newer. If the addon isn't activated, the raw coordinates are shown instead. BBCode Result [map]address[/map] Embeds a map centered on this address. [map=lat,long] Embeds a map centered on those coordinates. [map] Embeds a map centered on the post's location. Abstract for longer posts # If you want to spread your post to several third party networks you may have the problem that these networks have a length limitation like on Twitter. Friendica uses a semi-intelligent mechanism to generate a fitting abstract. But it can be useful to define a custom abstract that will only be displayed on the external network. This is done with the [abstract]-element. BBCode Result [abstract]Totally interesting! A must-see! Please click the link![/abstract] I want to tell you a really boring story that you really never wanted to hear. Twitter would display the text Totally interesting! A must-see! Please click the link! On Friendica you would only see the text after I want to tell you a really ... It is even possible to define abstracts for separate networks: BBCode Result [abstract]Hi friends Here are my newest pictures![/abstract] [abstract=twit]Hi my dear Twitter followers. Do you want to see my new pictures?[/abstract] [abstract=apdn]Helly my dear followers on ADN. I made sone new pictures that I wanted to share with you.[/abstract] Today I was in the woods and took some real cool pictures ... For Twitter and App.net the system will use the defined abstracts. For other networks (e.g. when you are using the \"StatusNet\" connector that is used to post to your GNU Social account) the general abstract element will be used. If you use (for example) the \"buffer\" connector to post to Facebook or Google+ you can use this element to define an abstract for a longer blogpost that you don't want to post completely to these networks. Networks like Facebook or Google+ aren't length limited. For this reason the [abstract] element isn't used. Instead, you have to name the explicit network: BBCode Result [abstract]These days I had a strange encounter...[/abstract] [abstract=goog]Hello my dear Google+ followers. You have to read my newest blog post![/abstract] [abstract=face]Hello my Facebook friends. These days happened something really cool.[/abstract] While taking pictures in the woods I had a really strange encounter... Google and Facebook will show the respective abstracts while the other networks will show the default one. Meanwhile, Friendica won't show any of the abstracts. The [abstract] element is not working with connectors where we post HTML directly, like Tumblr, WordPress or Pump.io. For the native connections--that is to e.g. Friendica, Hubzilla, Diaspora or GNU Social--the full posting is used and the contacts instance will display the posting as desired. For postings that are delivered via ActivityPub, the text from the abstract is placed in the summary field. On Mastodon this field is used for the content warning. Special # BBCode Result If you need to put literal BBCode in a message, [noparse], [nobb] or [pre] blocks prevent BBCode conversion: [noparse][b]bold[/b][/noparse] [nobb][b]bold[/b][/nobb] [pre][b]bold[/b][/pre] Note: [code] has priority over [noparse], [nobb] and [pre] which makes them display as BBCode tags in code blocks instead of being removed. [code] blocks inside [noparse] will still be converted to a code block. [b]bold[/b] Additionally, [noparse] and [pre] blocks prevent mention and hashtag conversion to links: [noparse]@user@domain.tld #hashtag[/noparse] [pre]@user@domain.tld #hashtag[/pre] @user@domain.tld #hashtag Additionally, [pre] blocks preserve spaces: [pre] Spaces[/pre] Spaces [nosmile] is used to disable smilies on a post by post basis [nosmile] ;-) :-O ;-) :-O Custom block styles [style=text-shadow: 0 0 4px #CC0000;]You can change all the CSS properties of this block.[/style] You can change all the CSS properties of this block. Custom inline styles [style=text-shadow: 0 0 4px #CC0000;]You can change all the CSS properties of this block.[/style] You can change all the CSS properties of this inline text.","title":"BBCode"},{"location":"user/bbcode/#friendica-bbcode-tags-reference","text":"","title":"Friendica BBCode tags reference"},{"location":"user/bbcode/#inline","text":"table.bbcodes { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.bbcodes > tr > th, table.bbcodes > tr > td, table.bbcodes > * > tr > th, table.bbcodes > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.bbcodes > tr > th, table.bbcodes > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } BBCode Result [b]bold[/b] bold [i]italic[/i] italic [u]underlined[/u] underlined [s]strike[/s] strike [o]overline[/o] overline [color=red]red[/color] red [url=https://friendi.ca]Friendica[/url] Friendica [img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png[/img] [img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png]The Friendica Logo[/img] [img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg[/img] Note: provided height is simply discarded. [size=xx-small]small text[/size] small text [size=xx-large]big text[/size] big text [size=20]exact size[/size] (size can be any number, in pixels) exact size [font=serif]Serif font[/font] Serif font","title":"Inline"},{"location":"user/bbcode/#links","text":"BBCode Result [url]https://friendi.ca[/url] https://friendi.ca [url=https://friendi.ca]Friendica[/url] Friendica [bookmark]https://friendi.ca[/bookmark] #^[url]https://friendi.ca[/url]","title":"Links"},{"location":"user/bbcode/#blocks","text":"BBCode Result [p]A paragraph of text[/p] A paragraph of text Inline [code]code[/code] in a paragraph Inline code in a paragraph [code]Multi line code[/code] Multi line code [code=php]function text_highlight($s,$lang)[/code] 1 function text_highlight ( $s , $lang ) [quote]quote[/quote] quote [quote=Author]Author? Me? No, no, no...[/quote] Author wrote: Author? Me? No, no, no... [center]Centered text[/center] Centered text You should not read any further if you want to be surprised.[spoiler]There is a happy end.[/spoiler] You should not read any further if you want to be surprised. Click to open/close There is a happy end. [spoiler=Author]Spoiler quote[/spoiler] Author wrote: Click to open/close Spoiler quote [hr] (horizontal line) 1 : Supported language parameter values for code highlighting: - abap - avrc - cpp - css - diff - dtd - html - java - javascript - js - mysql - perl - php - python - ruby - sh - sql - vbscript - xml","title":"Blocks"},{"location":"user/bbcode/#titles","text":"BBCode Result [h1]Title 1[/h1]","title":"Titles"},{"location":"user/bbcode/#tables","text":"BBCode Result [table] [tr] [th]Header 1[/th] [th]Header 2[/th] [th]Header 2[/th] [/tr] [tr] [td]Cell 1[/td] [td]Cell 2[/td] [td]Cell 3[/td] [/tr] [tr] [td]Cell 4[/td] [td]Cell 5[/td] [td]Cell 6[/td] [/tr] [/table] Header 1 Header 2 Header 3 Cell 1 Cell 2 Cell 3 Cell 4 Cell 5 Cell 6 [table border=0] Header 1 Header 2 Header 3 Cell 1 Cell 2 Cell 3 Cell 4 Cell 5 Cell 6 [table border=1] Header 1 Header 2 Header 3 Cell 1 Cell 2 Cell 3 Cell 4 Cell 5 Cell 6","title":"Tables"},{"location":"user/bbcode/#lists","text":"BBCode Result [ul] [li] First list element [li] Second list element [/ul] [list] [*] First list element [*] Second list element [/list] First list element Second list element [ol] [*] First list element [*] Second list element [/ol] [list=1] [*] First list element [*] Second list element [/list] First list element Second list element [list=] [*] First list element [*] Second list element [/list] First list element Second list element [list=i] [*] First list element [*] Second list element [/list] First list element Second list element [list=I] [*] First list element [*] Second list element [/list] First list element Second list element [list=a] [*] First list element [*] Second list element [/list] First list element Second list element [list=A] [*] First list element [*] Second list element [/list] First list element Second list element","title":"Lists"},{"location":"user/bbcode/#embed","text":"You can embed video, audio and more in a message. BBCode Result [video]url[/video] Where *url* can be an url to YouTube, vimeo, soundcloud, or other sites wich supports oembed or opengraph specifications. [video]Video file url[/video] [audio]Audio file url[/audio] Full URL to an ogg/ogv/oga/ogm/webm/mp4/mp3 file. An HTML5 player will be used to show it. [youtube]Youtube URL[/youtube] Youtube video OEmbed display. May not embed an actual player. [youtube]Youtube video ID[/youtube] Youtube player iframe embed. [vimeo]Vimeo URL[/vimeo] Vimeo video OEmbed display. May not embed an actual player. [vimeo]Vimeo video ID[/vimeo] Vimeo player iframe embed. [embed]URL[/embed] Embed OEmbed rich content. [url]*url*[/url] If *url* supports oembed or opengraph specifications the embedded object will be shown (eg, documents from scribd). Page title with a link to *url* will be shown.","title":"Embed"},{"location":"user/bbcode/#map","text":"This requires \"openstreetmap\" or \"Google Maps\" addon version 1.3 or newer. If the addon isn't activated, the raw coordinates are shown instead. BBCode Result [map]address[/map] Embeds a map centered on this address. [map=lat,long] Embeds a map centered on those coordinates. [map] Embeds a map centered on the post's location.","title":"Map"},{"location":"user/bbcode/#abstract-for-longer-posts","text":"If you want to spread your post to several third party networks you may have the problem that these networks have a length limitation like on Twitter. Friendica uses a semi-intelligent mechanism to generate a fitting abstract. But it can be useful to define a custom abstract that will only be displayed on the external network. This is done with the [abstract]-element. BBCode Result [abstract]Totally interesting! A must-see! Please click the link![/abstract] I want to tell you a really boring story that you really never wanted to hear. Twitter would display the text Totally interesting! A must-see! Please click the link! On Friendica you would only see the text after I want to tell you a really ... It is even possible to define abstracts for separate networks: BBCode Result [abstract]Hi friends Here are my newest pictures![/abstract] [abstract=twit]Hi my dear Twitter followers. Do you want to see my new pictures?[/abstract] [abstract=apdn]Helly my dear followers on ADN. I made sone new pictures that I wanted to share with you.[/abstract] Today I was in the woods and took some real cool pictures ... For Twitter and App.net the system will use the defined abstracts. For other networks (e.g. when you are using the \"StatusNet\" connector that is used to post to your GNU Social account) the general abstract element will be used. If you use (for example) the \"buffer\" connector to post to Facebook or Google+ you can use this element to define an abstract for a longer blogpost that you don't want to post completely to these networks. Networks like Facebook or Google+ aren't length limited. For this reason the [abstract] element isn't used. Instead, you have to name the explicit network: BBCode Result [abstract]These days I had a strange encounter...[/abstract] [abstract=goog]Hello my dear Google+ followers. You have to read my newest blog post![/abstract] [abstract=face]Hello my Facebook friends. These days happened something really cool.[/abstract] While taking pictures in the woods I had a really strange encounter... Google and Facebook will show the respective abstracts while the other networks will show the default one. Meanwhile, Friendica won't show any of the abstracts. The [abstract] element is not working with connectors where we post HTML directly, like Tumblr, WordPress or Pump.io. For the native connections--that is to e.g. Friendica, Hubzilla, Diaspora or GNU Social--the full posting is used and the contacts instance will display the posting as desired. For postings that are delivered via ActivityPub, the text from the abstract is placed in the summary field. On Mastodon this field is used for the content warning.","title":"Abstract for longer posts"},{"location":"user/bbcode/#special","text":"BBCode Result If you need to put literal BBCode in a message, [noparse], [nobb] or [pre] blocks prevent BBCode conversion: [noparse][b]bold[/b][/noparse] [nobb][b]bold[/b][/nobb] [pre][b]bold[/b][/pre] Note: [code] has priority over [noparse], [nobb] and [pre] which makes them display as BBCode tags in code blocks instead of being removed. [code] blocks inside [noparse] will still be converted to a code block. [b]bold[/b] Additionally, [noparse] and [pre] blocks prevent mention and hashtag conversion to links: [noparse]@user@domain.tld #hashtag[/noparse] [pre]@user@domain.tld #hashtag[/pre] @user@domain.tld #hashtag Additionally, [pre] blocks preserve spaces: [pre] Spaces[/pre] Spaces [nosmile] is used to disable smilies on a post by post basis [nosmile] ;-) :-O ;-) :-O Custom block styles [style=text-shadow: 0 0 4px #CC0000;]You can change all the CSS properties of this block.[/style] You can change all the CSS properties of this block. Custom inline styles [style=text-shadow: 0 0 4px #CC0000;]You can change all the CSS properties of this block.[/style] You can change all the CSS properties of this inline text.","title":"Special"},{"location":"user/chats/","tags":["user"],"text":"Chats # There are two possibilities to use chat on your friendica site IRC Chat Jappix IRC-Chat Addon # After activating the addon, you can find the chat at https://your-site.info/irc . Note: you can use this chat without any login at your site so that everyone could use it. If you follow the link, you will see the login page of the IRC chat. Now choose a nickname and a chatroom. You can choose any name you like for the room, even something like #superchatwhosenameisonlyknownbyme. Finally, solve the captchas and click the connect button. The following window shows some text while connecting. This text isn't important, just wait for the next window. The first line shows your name and your current IP address. The right part of the window shows all users. The lower part of the window contains an input field. Jappix Mini # The Jappix Mini Addon creates a chatbox for jabber- and XMPP-contacts. You should already have a jabber/XMPP-account before setting up the addon. You can find more information at jabber.org . You can use several servers to create an account: https://jappix.com http://xmpp.net 1. Basics # At first, you have to get the current version. You can either pull it from GitHub like so: $> cd /var/www/virtual/YOURSPACE/html/addon; git pull Or you can download a tar archive here: jappixmini.tgz (click at \u201eview raw\u201c). Just unpack the file and rename the directory to \u201ejappixmini\u201c. Next, upload this directory and the .tgz-file into your addon directory of your friendica installation. Now you can activate the addon globally on the admin pages. In the addon sidebar, you will find an entry of jappix now (where you can also find twitter, GNU Social and others). The following page shows the settings of this addon. Activate the BOSH proxy. 2. Settings # Go to your user account settings next and choose the addon page. Scroll down until you find the Jappix Mini addon settings. At first, you have to activate the addon. Now add your Jabber/XMPP name, the domain/server (without \"http\"; just \"jappix.com\"). For \u201eJabber BOSH Host\u201c you could use \"https://bind.jappix.com/\". Note that you need another BOSH server if you do not use jappix.com for your XMPP account. You can find further information in the \u201eConfiguration Help\u201c-section below these fields. At last, you have entered your password (there are some more optional options, you can choose). Finish these steps with \"send\" to save the entries. Now, you should find the chatbox in the lower right corner of your browser window. If you want to add contacts manually, you can click \"add contact\".","title":"Chats"},{"location":"user/chats/#chats","text":"There are two possibilities to use chat on your friendica site IRC Chat Jappix","title":"Chats"},{"location":"user/chats/#irc-chat-addon","text":"After activating the addon, you can find the chat at https://your-site.info/irc . Note: you can use this chat without any login at your site so that everyone could use it. If you follow the link, you will see the login page of the IRC chat. Now choose a nickname and a chatroom. You can choose any name you like for the room, even something like #superchatwhosenameisonlyknownbyme. Finally, solve the captchas and click the connect button. The following window shows some text while connecting. This text isn't important, just wait for the next window. The first line shows your name and your current IP address. The right part of the window shows all users. The lower part of the window contains an input field.","title":"IRC-Chat Addon"},{"location":"user/chats/#jappix-mini","text":"The Jappix Mini Addon creates a chatbox for jabber- and XMPP-contacts. You should already have a jabber/XMPP-account before setting up the addon. You can find more information at jabber.org . You can use several servers to create an account: https://jappix.com http://xmpp.net","title":"Jappix Mini"},{"location":"user/chats/#1-basics","text":"At first, you have to get the current version. You can either pull it from GitHub like so: $> cd /var/www/virtual/YOURSPACE/html/addon; git pull Or you can download a tar archive here: jappixmini.tgz (click at \u201eview raw\u201c). Just unpack the file and rename the directory to \u201ejappixmini\u201c. Next, upload this directory and the .tgz-file into your addon directory of your friendica installation. Now you can activate the addon globally on the admin pages. In the addon sidebar, you will find an entry of jappix now (where you can also find twitter, GNU Social and others). The following page shows the settings of this addon. Activate the BOSH proxy.","title":"1. Basics"},{"location":"user/chats/#2-settings","text":"Go to your user account settings next and choose the addon page. Scroll down until you find the Jappix Mini addon settings. At first, you have to activate the addon. Now add your Jabber/XMPP name, the domain/server (without \"http\"; just \"jappix.com\"). For \u201eJabber BOSH Host\u201c you could use \"https://bind.jappix.com/\". Note that you need another BOSH server if you do not use jappix.com for your XMPP account. You can find further information in the \u201eConfiguration Help\u201c-section below these fields. At last, you have entered your password (there are some more optional options, you can choose). Finish these steps with \"send\" to save the entries. Now, you should find the chatbox in the lower right corner of your browser window. If you want to add contacts manually, you can click \"add contact\".","title":"2. Settings"},{"location":"user/connectors/","tags":["user"],"text":"Connectors # Connectors allow you to connect with external social networks and services. They are only required for posting to existing accounts on Twitter or GNU Social. There is also a connector for accessing your email INBOX. Friendica # You can either connect to others by providing your Identity Address on the 'Connect' page of any Friendica member. Or you can put their Identity Address into the Connect-box on your Contacts page. Diaspora # Add the Diaspora 'handle' to the 'Connect/Follow' text box on your Contacts page. GNU Social # This is described as the \"federated social web\" or OStatus contacts. Please note that there are no privacy provisions on the OStatus network. Any message which is delivered to any OStatus member is visible to anybody in the world and will negate any privacy settings that you have in effect. These messages will also turn up in public searches. Since OStatus communications do not use authentication, if you select the profile privacy option to hide your profile and messages from unknown viewers, OStatus members will not be able to receive your communications. To connect with an OStatus member insert their profile URL or Identity address into the Connect-box on your Contacts page. The GNU Social connector may be used if you wish posts to appear on an OStatus site using an existing OStatus account. It is not necessary to do this, as you may 'follow' OStatus members from Friendica, and they may follow you (by placing their own Identity Address into your 'Connect' page). Blogger, Wordpress, RSS feeds, arbitrary web pages # Put the URL into the Connect-box on your Contacts page. PLease note that you will not be able to reply to these contacts. This feed reader feature will allow you to connect with millions of pages on the internet. All that the pages need to have is a discoverable feed using either the RSS or Atom syndication format, and which provides an author name and a site image in a form which we can extract. Twitter # To follow a Twitter member, the Twitter-Connector (Addon) needs to be configured on your node. If this is the case put the URL of the Twitter member's main page into the Connect-box on your Contacts page. To reply, you must have the Twitter connector installed, and reply using your own status editor. Begin the message with @twitterperson replacing with the Twitter username. Email # If the php module for IMAP support is available on your server, Friendica can connect to email contacts as well. Configure the email connector from your Settings page. Once this has been done, you may enter an email address to connect with using the Connect-box on your Contacts page. They must be the sender of a message which is currently in your INBOX for the connection to succeed. You may include email contacts in private conversations.","title":"Connectors"},{"location":"user/connectors/#connectors","text":"Connectors allow you to connect with external social networks and services. They are only required for posting to existing accounts on Twitter or GNU Social. There is also a connector for accessing your email INBOX.","title":"Connectors"},{"location":"user/connectors/#friendica","text":"You can either connect to others by providing your Identity Address on the 'Connect' page of any Friendica member. Or you can put their Identity Address into the Connect-box on your Contacts page.","title":"Friendica"},{"location":"user/connectors/#diaspora","text":"Add the Diaspora 'handle' to the 'Connect/Follow' text box on your Contacts page.","title":"Diaspora"},{"location":"user/connectors/#gnu-social","text":"This is described as the \"federated social web\" or OStatus contacts. Please note that there are no privacy provisions on the OStatus network. Any message which is delivered to any OStatus member is visible to anybody in the world and will negate any privacy settings that you have in effect. These messages will also turn up in public searches. Since OStatus communications do not use authentication, if you select the profile privacy option to hide your profile and messages from unknown viewers, OStatus members will not be able to receive your communications. To connect with an OStatus member insert their profile URL or Identity address into the Connect-box on your Contacts page. The GNU Social connector may be used if you wish posts to appear on an OStatus site using an existing OStatus account. It is not necessary to do this, as you may 'follow' OStatus members from Friendica, and they may follow you (by placing their own Identity Address into your 'Connect' page).","title":"GNU Social"},{"location":"user/connectors/#blogger-wordpress-rss-feeds-arbitrary-web-pages","text":"Put the URL into the Connect-box on your Contacts page. PLease note that you will not be able to reply to these contacts. This feed reader feature will allow you to connect with millions of pages on the internet. All that the pages need to have is a discoverable feed using either the RSS or Atom syndication format, and which provides an author name and a site image in a form which we can extract.","title":"Blogger, Wordpress, RSS feeds, arbitrary web pages"},{"location":"user/connectors/#twitter","text":"To follow a Twitter member, the Twitter-Connector (Addon) needs to be configured on your node. If this is the case put the URL of the Twitter member's main page into the Connect-box on your Contacts page. To reply, you must have the Twitter connector installed, and reply using your own status editor. Begin the message with @twitterperson replacing with the Twitter username.","title":"Twitter"},{"location":"user/connectors/#email","text":"If the php module for IMAP support is available on your server, Friendica can connect to email contacts as well. Configure the email connector from your Settings page. Once this has been done, you may enter an email address to connect with using the Connect-box on your Contacts page. They must be the sender of a message which is currently in your INBOX for the connection to succeed. You may include email contacts in private conversations.","title":"Email"},{"location":"user/events/","tags":["user"],"text":"Events # A special form of postings are events. The events you and your contacts share can be found at https://your-site.info/events on your node. To get there go to your wall and follow the tab \"events\" Depending on the theme you are using, there might be an additional link from the navigation menu to this page. Event Overview # The overview page shows the calendar of the current month, plus a few days at the beginning and the end. Listed are all events for this month, created by you, or shared with you by your contacts, This includes birthday reminders for contacts who share their birthday with you. From the controls, you can switch between month/week/day view. Flip through the view forwards and backwards. And return to today . To create a new event, you can either follow the link \"Create New Event\" or double-click on the desired box in the calendar in which the event should take place. With a click on an existing event a pop-up box will be opened which shows you the event. From there you can edit the event or view the event at the source link, if you are the one who created the event. Create a new Event # Following one of the methods mentioned above you reach a form to enter the event data. Fields marked with a *** have to be filled. Event Starts : enter the date/time of the start of the event here Event Finishes : enter the finishing date/time for the event here When you click in one of these fields a pop-up will be opened that allows you to pick the day and the time. If you double-clicked on the day box in the calendar these fields will be pre-filled for you. The finishing date/time has to be after the beginning date/time of the event. But you don't have to specify it. If the event is open-ended or the finishing date/time does not matter, just select the box below the two first fields. Title : a title for the event Description : a longer description for the event Location : the location the event will take place These three fields describe your events. In the description and location field you can use BBCode to format the text. Share this event : when this box is checked the ACL will be shown to let you select with whom you wish to share the event. This works just like the controls of any other posting. When you Share the event it will be posted to your wall with the access permissions you've selected. But before you do, you can also preview the event in a pop-up box. Interaction with Events # When you publish an event, you can choose who shall receive it, as with a regular new posting. The recipients will see the posting about the event in their network-stream. Additionally, it will be added to their calendar and thus be shown in their events overview page. Recipients of the event-posting can comment or dis-/like the event, as with a regular posting. Furthermore, they can announce that they will attend, not attend or may-be attend the event with a single click. Calendar Export # If you want to export your public events to ical or csv, you can activate an additional feature in your user settings (Additional features -> General Features -> Export Public Calendar). Afterwards a link will be shown in the events' page of your profile to access the calendar.","title":"Events"},{"location":"user/events/#events","text":"A special form of postings are events. The events you and your contacts share can be found at https://your-site.info/events on your node. To get there go to your wall and follow the tab \"events\" Depending on the theme you are using, there might be an additional link from the navigation menu to this page.","title":"Events"},{"location":"user/events/#event-overview","text":"The overview page shows the calendar of the current month, plus a few days at the beginning and the end. Listed are all events for this month, created by you, or shared with you by your contacts, This includes birthday reminders for contacts who share their birthday with you. From the controls, you can switch between month/week/day view. Flip through the view forwards and backwards. And return to today . To create a new event, you can either follow the link \"Create New Event\" or double-click on the desired box in the calendar in which the event should take place. With a click on an existing event a pop-up box will be opened which shows you the event. From there you can edit the event or view the event at the source link, if you are the one who created the event.","title":"Event Overview"},{"location":"user/events/#create-a-new-event","text":"Following one of the methods mentioned above you reach a form to enter the event data. Fields marked with a *** have to be filled. Event Starts : enter the date/time of the start of the event here Event Finishes : enter the finishing date/time for the event here When you click in one of these fields a pop-up will be opened that allows you to pick the day and the time. If you double-clicked on the day box in the calendar these fields will be pre-filled for you. The finishing date/time has to be after the beginning date/time of the event. But you don't have to specify it. If the event is open-ended or the finishing date/time does not matter, just select the box below the two first fields. Title : a title for the event Description : a longer description for the event Location : the location the event will take place These three fields describe your events. In the description and location field you can use BBCode to format the text. Share this event : when this box is checked the ACL will be shown to let you select with whom you wish to share the event. This works just like the controls of any other posting. When you Share the event it will be posted to your wall with the access permissions you've selected. But before you do, you can also preview the event in a pop-up box.","title":"Create a new Event"},{"location":"user/events/#interaction-with-events","text":"When you publish an event, you can choose who shall receive it, as with a regular new posting. The recipients will see the posting about the event in their network-stream. Additionally, it will be added to their calendar and thus be shown in their events overview page. Recipients of the event-posting can comment or dis-/like the event, as with a regular posting. Furthermore, they can announce that they will attend, not attend or may-be attend the event with a single click.","title":"Interaction with Events"},{"location":"user/events/#calendar-export","text":"If you want to export your public events to ical or csv, you can activate an additional feature in your user settings (Additional features -> General Features -> Export Public Calendar). Afterwards a link will be shown in the events' page of your profile to access the calendar.","title":"Calendar Export"},{"location":"user/export-import-contacts/","tags":["user"],"text":"Import / Export of followed Contacts # In addition to move your account you can export and import the list of accounts you follow. The exported list is stored as CSV file that is compatible to the format used by other platforms as e.g. Mastodon, Misskey or Pleroma. Export of followed Contacts # To export the list of accounts that you follow, go to the [Settings Export personal date] ( https://your-site.info/settings/userexport ) and click the [Export Contacts to CSV] ( https://your-site.info/settings/userexport/contact ). Import of followed Contacts # To import contacts from a CSV file, go to the Settings page. At the bottom of the account settings page you'll find the import contacts section. Upload the CSV file there. Supported File Format # The CSV file must contain at least one column. In the first column the table should contain either the handle or URL of a followed account. (one account per row.) Other columns in the CSV file will be ignored.","title":"Import / Export Contacts"},{"location":"user/export-import-contacts/#import-export-of-followed-contacts","text":"In addition to move your account you can export and import the list of accounts you follow. The exported list is stored as CSV file that is compatible to the format used by other platforms as e.g. Mastodon, Misskey or Pleroma.","title":"Import / Export of followed Contacts"},{"location":"user/export-import-contacts/#export-of-followed-contacts","text":"To export the list of accounts that you follow, go to the [Settings Export personal date] ( https://your-site.info/settings/userexport ) and click the [Export Contacts to CSV] ( https://your-site.info/settings/userexport/contact ).","title":"Export of followed Contacts"},{"location":"user/export-import-contacts/#import-of-followed-contacts","text":"To import contacts from a CSV file, go to the Settings page. At the bottom of the account settings page you'll find the import contacts section. Upload the CSV file there.","title":"Import of followed Contacts"},{"location":"user/export-import-contacts/#supported-file-format","text":"The CSV file must contain at least one column. In the first column the table should contain either the handle or URL of a followed account. (one account per row.) Other columns in the CSV file will be ignored.","title":"Supported File Format"},{"location":"user/faq/","tags":["user","faq"],"text":"Frequently Asked Questions (FAQ) # Where I can find help? # If this FAQ does not answer your question you can always reach out to the community via the following options: Friendica Support Forum: @helpers@forum.friendi.ca Community chat rooms (the IRC, Matrix and XMPP rooms are bridged) these public chats are logged from IRC and Matrix XMPP: support(at)forum.friendi.ca IRC: #friendica at libera.chat Matrix: #friendica-en:matrix.org or #friendi.ca:matrix.org Mailing List Why do I get warnings about SSL certificates? # SSL (Secure Socket Layer) is a technology to encrypt data transfer between computers. Sometimes your browser warns you about a missing or invalid certificate. These warnings can have three reasons: The server you are connected to don't offer SSL encryption. The server has a self-signed certificate (not recommended). The certificate is expired. We recommend to talk to the admin(s) of the affected friendica server. (Admins, please see the respective section of the admin manual .) How can I upload images, files, links, videos and sound files to posts? # You can upload images from your computer using the editor . An overview of all uploaded images is listed at yourpage.com/photos/profilename . On that page, you can also upload images directly and choose if your contacts will receive a message about this upload. Generally, you can attach any kind of file to a post. This is possible by using the \"paper-clip\"-symbol in the editor. These files will be linked to your post and can be downloaded by your contacts. But it's not possible to get a preview for these items. Because of this, this upload method is only recommended for office or zipped files. If you want to share content from Dropbox, Owncloud or any other filehoster , use the \"link\"-button (chain-symbol). When you're adding URLs of other webpages with the \"link\"-button, Friendica tries to create a small preview. If this doesn't work, try to add the link by typing: [url=http://example.com] self-chosen name [/url]. You can also add video and audio files to Posts. However, instead of a direct upload you have to use one of the following methods: Add the video or audio link of a hoster (YouTube, Vimeo, Soundcloud and anyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start. SoundCloud directly inserts a player to your post. If you have your own server, you can upload multimedia files via FTP and insert the URL. Friendica uses HTML5 for embedding content. Therefore, the supported files are dependent on your browser and operating system. Some supported file types are WebM, MP4, MP3 and OGG. See Wikipedia for more of them ( video , audio ). Is it possible to have different avatars per profile? # Yes. On your Edit/Manage Profiles page, you will find a \"change profile photo\" link. Clicking this will take you to a page where you can upload a photograph and select which profile it will be associated with. To avoid privacy leakage, we only display the photograph associated with your default profile as the avatar in your posts. How can I view Friendica in a certain language? # You can do this by adding the lang parameter to the url in your url bar. The data in the parameter is a ISO 639-1 code. A question mark is required for the separation between url and parameters. Example: https://social.example.com/profile/example in German: https://social.example.com/profile/example?lang=de. When a certain language is forced, the language remains until session is closed. How do blocked, ignored, archived and hidden contacts behave? # Blocked # Direct communication will be blocked. Blocked contacts are not included in delivery, and their own posts to you are not imported. However, their conversations with your friends will still be visible in your stream. If you remove a contact completely, they can send you another friend request. Blocked contacts cannot do this. They cannot communicate with you directly, only through friends. Ignored # Ignored contacts are included in delivery and will receive your posts and private messages. However, we do not import their posts or private messages to you. Like blocking, you will still see this person's comments to Posts made by your friends. An addon called \"blockem\" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including their conversations with your other friends. Archived # Communication is not possible and will not be attempted. However, unlike blocking, existing posts this person made before being archived will be visible in your stream. Hidden # Contact not be displayed in your public friend list. However, a hidden contact will appear normally in conversations and this may expose their hidden status to anybody who can see the conversation. What happens when an account is removed? # If you remove your account, it will be scheduled for permanent deletion in seven days . As soon as you activate the deletion process you won't be able to log in anymore. Only the administrator of your node can halt this process prior to permanent deletion. After the elapsed time of seven days, all your posts, messages, photos, and personal information stored on your node will be deleted. Your node will also issue removal requests to all your contacts; this will also remove your profile from the global directory if you are listed. Your username cannot be reissued for future sign-ups for security reasons. Can I follow a hashtag? # Yes. Simply add the hashtag to your saved searches. The posts will appear on your network page. For technical reasons, your answers to such posts won't appear on the \"personal\" tab in the network page and the whole thread isn't accessible via the API. How to create an RSS feed of the stream? # If you want to share your public page via rss you can use one of the following links: RSS feed of your posts # basic-url.com//feed/[nickname]/posts Example: Friendica Support https://forum.friendi.ca/feed/helpers/posts RSS feed of the conversations at your site # basic-url.com/feed/profilename/comments Example: Friendica Support https://forum.friendi.ca/feed/helpers/comments What friendica clients can I use? # Friendica supports Mastodon API and Twitter API | gnusocial . This means you can use some Mastodon and Twitter clients for Friendica. The available features are client specific and may differ. Android # AndStatus ( F-Droid , Google Play ) B4X for Pleroma & Mastodon Fedi Fedilab ( F-Droid , Google Play ) Friendiqa ( F-Droid , Google Play ) Husky ( F-Droid , Google Play ) Mastodon for Android (F-Droid: Pending, Google-Play ) Subway Tooter Tooot Tusky ( F-Droid , Google Play ) Twidere ( F-Droid , Google Play ) TwidereX ( F-Droid , Google Play ) Yuito ( Google Play ) SailfishOS # Friendly , last update: 2018 iOS # B4X for Pleroma & Mastodon ( AppStore ) Fedi ( AppStore ) Mastodon for iPhone and iPad ( App Store ) Stella* ( AppStore ) Tooot ( AppStore , Data collection (not linked to identity) Tootle ( AppStore ), last update: 2020 Linux # Choqok Whalebird TheDesk Toot Tootle macOS # Mastonaut ( AppStore ), closed source Whalebird ( AppStore , GitHub ) Windows # Whalebird ( Website Download , GitHub ) Web Frontend # Halcyon Pinafore","title":"FAQ"},{"location":"user/faq/#frequently-asked-questions-faq","text":"","title":"Frequently Asked Questions (FAQ)"},{"location":"user/faq/#where-i-can-find-help","text":"If this FAQ does not answer your question you can always reach out to the community via the following options: Friendica Support Forum: @helpers@forum.friendi.ca Community chat rooms (the IRC, Matrix and XMPP rooms are bridged) these public chats are logged from IRC and Matrix XMPP: support(at)forum.friendi.ca IRC: #friendica at libera.chat Matrix: #friendica-en:matrix.org or #friendi.ca:matrix.org Mailing List","title":"Where I can find help?"},{"location":"user/faq/#why-do-i-get-warnings-about-ssl-certificates","text":"SSL (Secure Socket Layer) is a technology to encrypt data transfer between computers. Sometimes your browser warns you about a missing or invalid certificate. These warnings can have three reasons: The server you are connected to don't offer SSL encryption. The server has a self-signed certificate (not recommended). The certificate is expired. We recommend to talk to the admin(s) of the affected friendica server. (Admins, please see the respective section of the admin manual .)","title":"Why do I get warnings about SSL certificates?"},{"location":"user/faq/#how-can-i-upload-images-files-links-videos-and-sound-files-to-posts","text":"You can upload images from your computer using the editor . An overview of all uploaded images is listed at yourpage.com/photos/profilename . On that page, you can also upload images directly and choose if your contacts will receive a message about this upload. Generally, you can attach any kind of file to a post. This is possible by using the \"paper-clip\"-symbol in the editor. These files will be linked to your post and can be downloaded by your contacts. But it's not possible to get a preview for these items. Because of this, this upload method is only recommended for office or zipped files. If you want to share content from Dropbox, Owncloud or any other filehoster , use the \"link\"-button (chain-symbol). When you're adding URLs of other webpages with the \"link\"-button, Friendica tries to create a small preview. If this doesn't work, try to add the link by typing: [url=http://example.com] self-chosen name [/url]. You can also add video and audio files to Posts. However, instead of a direct upload you have to use one of the following methods: Add the video or audio link of a hoster (YouTube, Vimeo, Soundcloud and anyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start. SoundCloud directly inserts a player to your post. If you have your own server, you can upload multimedia files via FTP and insert the URL. Friendica uses HTML5 for embedding content. Therefore, the supported files are dependent on your browser and operating system. Some supported file types are WebM, MP4, MP3 and OGG. See Wikipedia for more of them ( video , audio ).","title":"How can I upload images, files, links, videos and sound files to posts?"},{"location":"user/faq/#is-it-possible-to-have-different-avatars-per-profile","text":"Yes. On your Edit/Manage Profiles page, you will find a \"change profile photo\" link. Clicking this will take you to a page where you can upload a photograph and select which profile it will be associated with. To avoid privacy leakage, we only display the photograph associated with your default profile as the avatar in your posts.","title":"Is it possible to have different avatars per profile?"},{"location":"user/faq/#how-can-i-view-friendica-in-a-certain-language","text":"You can do this by adding the lang parameter to the url in your url bar. The data in the parameter is a ISO 639-1 code. A question mark is required for the separation between url and parameters. Example: https://social.example.com/profile/example in German: https://social.example.com/profile/example?lang=de. When a certain language is forced, the language remains until session is closed.","title":"How can I view Friendica in a certain language?"},{"location":"user/faq/#how-do-blocked-ignored-archived-and-hidden-contacts-behave","text":"","title":"How do blocked, ignored, archived and hidden contacts behave?"},{"location":"user/faq/#blocked","text":"Direct communication will be blocked. Blocked contacts are not included in delivery, and their own posts to you are not imported. However, their conversations with your friends will still be visible in your stream. If you remove a contact completely, they can send you another friend request. Blocked contacts cannot do this. They cannot communicate with you directly, only through friends.","title":"Blocked"},{"location":"user/faq/#ignored","text":"Ignored contacts are included in delivery and will receive your posts and private messages. However, we do not import their posts or private messages to you. Like blocking, you will still see this person's comments to Posts made by your friends. An addon called \"blockem\" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including their conversations with your other friends.","title":"Ignored"},{"location":"user/faq/#archived","text":"Communication is not possible and will not be attempted. However, unlike blocking, existing posts this person made before being archived will be visible in your stream.","title":"Archived"},{"location":"user/faq/#hidden","text":"Contact not be displayed in your public friend list. However, a hidden contact will appear normally in conversations and this may expose their hidden status to anybody who can see the conversation.","title":"Hidden"},{"location":"user/faq/#what-happens-when-an-account-is-removed","text":"If you remove your account, it will be scheduled for permanent deletion in seven days . As soon as you activate the deletion process you won't be able to log in anymore. Only the administrator of your node can halt this process prior to permanent deletion. After the elapsed time of seven days, all your posts, messages, photos, and personal information stored on your node will be deleted. Your node will also issue removal requests to all your contacts; this will also remove your profile from the global directory if you are listed. Your username cannot be reissued for future sign-ups for security reasons.","title":"What happens when an account is removed?"},{"location":"user/faq/#can-i-follow-a-hashtag","text":"Yes. Simply add the hashtag to your saved searches. The posts will appear on your network page. For technical reasons, your answers to such posts won't appear on the \"personal\" tab in the network page and the whole thread isn't accessible via the API.","title":"Can I follow a hashtag?"},{"location":"user/faq/#how-to-create-an-rss-feed-of-the-stream","text":"If you want to share your public page via rss you can use one of the following links:","title":"How to create an RSS feed of the stream?"},{"location":"user/faq/#rss-feed-of-your-posts","text":"basic-url.com//feed/[nickname]/posts Example: Friendica Support https://forum.friendi.ca/feed/helpers/posts","title":"RSS feed of your posts"},{"location":"user/faq/#rss-feed-of-the-conversations-at-your-site","text":"basic-url.com/feed/profilename/comments Example: Friendica Support https://forum.friendi.ca/feed/helpers/comments","title":"RSS feed of the conversations at your site"},{"location":"user/faq/#what-friendica-clients-can-i-use","text":"Friendica supports Mastodon API and Twitter API | gnusocial . This means you can use some Mastodon and Twitter clients for Friendica. The available features are client specific and may differ.","title":"What friendica clients can I use?"},{"location":"user/faq/#android","text":"AndStatus ( F-Droid , Google Play ) B4X for Pleroma & Mastodon Fedi Fedilab ( F-Droid , Google Play ) Friendiqa ( F-Droid , Google Play ) Husky ( F-Droid , Google Play ) Mastodon for Android (F-Droid: Pending, Google-Play ) Subway Tooter Tooot Tusky ( F-Droid , Google Play ) Twidere ( F-Droid , Google Play ) TwidereX ( F-Droid , Google Play ) Yuito ( Google Play )","title":"Android"},{"location":"user/faq/#sailfishos","text":"Friendly , last update: 2018","title":"SailfishOS"},{"location":"user/faq/#ios","text":"B4X for Pleroma & Mastodon ( AppStore ) Fedi ( AppStore ) Mastodon for iPhone and iPad ( App Store ) Stella* ( AppStore ) Tooot ( AppStore , Data collection (not linked to identity) Tootle ( AppStore ), last update: 2020","title":"iOS"},{"location":"user/faq/#linux","text":"Choqok Whalebird TheDesk Toot Tootle","title":"Linux"},{"location":"user/faq/#macos","text":"Mastonaut ( AppStore ), closed source Whalebird ( AppStore , GitHub )","title":"macOS"},{"location":"user/faq/#windows","text":"Whalebird ( Website Download , GitHub )","title":"Windows"},{"location":"user/faq/#web-frontend","text":"Halcyon Pinafore","title":"Web Frontend"},{"location":"user/forums/","tags":["user"],"text":"Forums # Friendica also lets you create community forums and other types of accounts that can function as discussion forums, celebrity accounts, announcement channels, news reflectors, or organization pages, depending on how you want to interact with others. Management of these pages can be delegated to other accounts, or a parent account can be designated to easily toggle multiple identities. Every page in Friendica has a nickname and these must all be unique. This applies to all forums, whether they are normal profiles or forum profiles. Managing Accounts # To create a new linked account that can be used as a forum, log in to your normal account and go to Settings > Manage Accounts. Here you can register additional accounts with new nicknames that will be linked to your primary account. You may appoint a delegate to manage your new account (e.g. forum page). The \"Delegates\" section of Manage Accounts page will provide you with a list of contacts on this instance under \"Potential Delegates\". Selecting one or more persons will give them access to manage your forum. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings, such as passwords or page types, or remove the account. Additionally, this page is also where you can choose to designate an account as a parent user. If your primary account is designated as the parent user, you will be able to easily toggle identities and manage your forums or other types of accounts. Types of Accounts # On the new account, visit the Settings > Account page. Towards the end of the page is a section for \"Advanced account types\". Typically, you would use \"Personal Page - Standard\" for a normal personal account with manual approval of \u201cfriends\u201d and \u201cfollowers.\u201d This is the default selection. On this page you can change the type of account if desired. The other subtypes of a Personal Page are \u201cSoapbox\u201d and \u201cLove-all.\u201d A Soapbox account is an announcement channel that automatically approvals follower requests. Everything posted by the account will go out to the followers, but there will be no opportunity for interaction. This setting would typically be used for announcements or corporate communications. \u201cLove-all\u201d automatically approves contacts as friends. In addition to Personal Page, there are options for Organization Page, News Page, and Community Forum. Organization and New Pages automatically approve contact requests as followers. Community Forum provide the ability for people to become friends/fans of the forum without requiring approval. This creates a forum page where all members can freely interact. Posting to Community forums # If you are a member of a community forum, you may post to the forum by including an @-tag in the post mentioning the forum. For example @bicycle would send my post to all members of the group \"bicycle\" in addition to the normal recipients. If you mention a forum (you are a member of) in a new posting, the posting will be distributed to all members of the forum, regardless of your privacy settings for the posting. Also, if the forum is a public forum, your posting will be public for the all internet users. If your post is private you must also explicitly include the group in the post permissions (to allow the forum \"contact\" to see the post) and mention it in a tag (which redistributes the post to the forum members). Posting privately to a public forum, will result in your posting being displayed on the forum wall, but not on yours. Additionally, it is possible to address a forum with the exclamation mark. In the example above this means that you can address the bicycle forum via !bicycle. The difference to the @ is that the post will only be sent to the addressed forum. This also means that you shouldn't address multiple forums in a single post in that way since it will only be distributed by one the forums. You may also post to a community forum by posting a \"wall-to-wall\" post using secure cross-site authentication. Comments which are relayed to community forums will be relayed back to the original post creator. Mentioning the forum with an @-tag in a comment does not relay the message, as distribution is controlled entirely by the original post creator.","title":"Forums"},{"location":"user/forums/#forums","text":"Friendica also lets you create community forums and other types of accounts that can function as discussion forums, celebrity accounts, announcement channels, news reflectors, or organization pages, depending on how you want to interact with others. Management of these pages can be delegated to other accounts, or a parent account can be designated to easily toggle multiple identities. Every page in Friendica has a nickname and these must all be unique. This applies to all forums, whether they are normal profiles or forum profiles.","title":"Forums"},{"location":"user/forums/#managing-accounts","text":"To create a new linked account that can be used as a forum, log in to your normal account and go to Settings > Manage Accounts. Here you can register additional accounts with new nicknames that will be linked to your primary account. You may appoint a delegate to manage your new account (e.g. forum page). The \"Delegates\" section of Manage Accounts page will provide you with a list of contacts on this instance under \"Potential Delegates\". Selecting one or more persons will give them access to manage your forum. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings, such as passwords or page types, or remove the account. Additionally, this page is also where you can choose to designate an account as a parent user. If your primary account is designated as the parent user, you will be able to easily toggle identities and manage your forums or other types of accounts.","title":"Managing Accounts"},{"location":"user/forums/#types-of-accounts","text":"On the new account, visit the Settings > Account page. Towards the end of the page is a section for \"Advanced account types\". Typically, you would use \"Personal Page - Standard\" for a normal personal account with manual approval of \u201cfriends\u201d and \u201cfollowers.\u201d This is the default selection. On this page you can change the type of account if desired. The other subtypes of a Personal Page are \u201cSoapbox\u201d and \u201cLove-all.\u201d A Soapbox account is an announcement channel that automatically approvals follower requests. Everything posted by the account will go out to the followers, but there will be no opportunity for interaction. This setting would typically be used for announcements or corporate communications. \u201cLove-all\u201d automatically approves contacts as friends. In addition to Personal Page, there are options for Organization Page, News Page, and Community Forum. Organization and New Pages automatically approve contact requests as followers. Community Forum provide the ability for people to become friends/fans of the forum without requiring approval. This creates a forum page where all members can freely interact.","title":"Types of Accounts"},{"location":"user/forums/#posting-to-community-forums","text":"If you are a member of a community forum, you may post to the forum by including an @-tag in the post mentioning the forum. For example @bicycle would send my post to all members of the group \"bicycle\" in addition to the normal recipients. If you mention a forum (you are a member of) in a new posting, the posting will be distributed to all members of the forum, regardless of your privacy settings for the posting. Also, if the forum is a public forum, your posting will be public for the all internet users. If your post is private you must also explicitly include the group in the post permissions (to allow the forum \"contact\" to see the post) and mention it in a tag (which redistributes the post to the forum members). Posting privately to a public forum, will result in your posting being displayed on the forum wall, but not on yours. Additionally, it is possible to address a forum with the exclamation mark. In the example above this means that you can address the bicycle forum via !bicycle. The difference to the @ is that the post will only be sent to the addressed forum. This also means that you shouldn't address multiple forums in a single post in that way since it will only be distributed by one the forums. You may also post to a community forum by posting a \"wall-to-wall\" post using secure cross-site authentication. Comments which are relayed to community forums will be relayed back to the original post creator. Mentioning the forum with an @-tag in a comment does not relay the message, as distribution is controlled entirely by the original post creator.","title":"Posting to Community forums"},{"location":"user/groups-and-privacy/","tags":["user"],"text":"Groups and Privacy # Groups are merely collections of friends. But Friendica uses these to unlock some very powerful features. Setting Up Groups # To create a group, visit your Friendica \"Contacts\" page and select \"Create a new group\". Give the group a name. This brings you to a page where you can select the group members. You will have two boxes on this page. The top box is the roster of current group members. Below that is another box containing all of your friends who are not members of the group. If you click on a photo of a person who isn't in the group, they will be put into the group. If you click on a photo of a person who is in the group, they will be removed from it. Access Control # Once you have created a group, you may use it in any access control list. This is the little lock icon beneath the status update box on your home page. If you click this you can select who can see and who can not see the post you are about to make. These can be individual people or groups. On your \"Network\" page you will find posts and conversation from everybody in your network. You may select an individual group on this page to show conversations pertaining only to members of that group. But wait, there's more... If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles. Default Post Privacy # By default, Friendica assumes that you want all of your posts to be private. Therefore, when you sign up, Friendica creates a group for you that it will automatically add all of your contacts to. All of your posts are restricted to that group by default. Note that this behaviour can be overridden by your site admin, in which case your posts will be \"public\" (i.e. visible to the entire Internet) by default. If you want your posts to be \"public\" by default, you can change your default post permissions on your Settings page. You also have the option there to change which groups you post to by default, or to change which group your new contacts get placed into by default. Privacy Concerns To Be Aware Of # These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, unless your friends cut and paste the messages and send them to others. This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends. But it isn't as clear-cut when dealing with GNU Social and other network providers. If you look at the Contact Edit page for any person, we will tell you whether they are members of an insecure network where you should exercise caution. Once you have created a post, you can not change the permissions assigned. Within seconds, it has been delivered to lots of people - and perhaps everybody it was addressed to. If you mistakenly created a message and wish you could take it back, the best you can do is to delete it. We will send out a deleted notification to everybody who received the message - and this should wipe out the message with the same speed it was initially propagated. In most cases it will be completely wiped from the Internet - in under a minute. Again, this applies to Friendica networks. Once a message spreads to other networks, it may not be removed quickly and in some cases it may not be removed at all. In case you haven't yet figured this out, we are encouraging you to encourage your friends to use Friendica - because all these privacy features work much better within a privacy-aware network. Many of the other social networks Friendica can connect to have no privacy controls. Profiles, Photos, and Privacy # The decentralised nature of Friendica (many websites exchanging information rather than one website which controls everything) has some implications with privacy as it relates to people on other sites. There are things you should be aware of, so you can decide best how to interact privately. Photos # Sharing photos privately is a problem. We can only share them privately with Friendica members. In order to share with other people, we need to prove who they are. We can prove the identity of Friendica members, as we have a mechanism to do so. Your friends on other networks will be blocked from viewing these private photos because we cannot prove that they should be allowed to see them. Our developers are working on solutions to allow access to your friends - no matter what network they are on. However, we take privacy seriously and don't behave like some networks that pretend your photos are private, but make them available to others without proof of identity. Profiles # Your profile and \"wall\" may also be visited by your friends from other networks, and you can block access to these by web visitors that Friendica doesn't know. Be aware that this could include some of your friends on other networks. This may produce undesired results when posting a long status message to (for instance) Twitter. When Friendica sends a post to these networks which exceeds the service length limit, we truncate it and provide a link to the original. The original is a link back to your Friendica profile. As Friendica cannot prove who they are, it may not be possible for these people to view your post in full. For people in this situation we would recommend providing a \"Twitter-length\" summary, with more detail for friends that can see the post in full. You can do so by including the BBCode tag abstract in your posting. Blocking your profile or entire Friendica site from unknown web visitors also has serious implications for communicating with GNU Social members. These networks communicate with others via public protocols that are not authenticated. In order to view your posts, these networks have to access them as an \"unknown web visitor\". If we allowed this, it would mean anybody could in fact see your posts, and you've instructed Friendica not to allow this. So be aware that the act of blocking your profile to unknown visitors also has the effect of blocking outbound communication with public networks (such as GNU Social) and feed readers such as Google Reader.","title":"Groups & Privacy"},{"location":"user/groups-and-privacy/#groups-and-privacy","text":"Groups are merely collections of friends. But Friendica uses these to unlock some very powerful features.","title":"Groups and Privacy"},{"location":"user/groups-and-privacy/#setting-up-groups","text":"To create a group, visit your Friendica \"Contacts\" page and select \"Create a new group\". Give the group a name. This brings you to a page where you can select the group members. You will have two boxes on this page. The top box is the roster of current group members. Below that is another box containing all of your friends who are not members of the group. If you click on a photo of a person who isn't in the group, they will be put into the group. If you click on a photo of a person who is in the group, they will be removed from it.","title":"Setting Up Groups"},{"location":"user/groups-and-privacy/#access-control","text":"Once you have created a group, you may use it in any access control list. This is the little lock icon beneath the status update box on your home page. If you click this you can select who can see and who can not see the post you are about to make. These can be individual people or groups. On your \"Network\" page you will find posts and conversation from everybody in your network. You may select an individual group on this page to show conversations pertaining only to members of that group. But wait, there's more... If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles.","title":"Access Control"},{"location":"user/groups-and-privacy/#default-post-privacy","text":"By default, Friendica assumes that you want all of your posts to be private. Therefore, when you sign up, Friendica creates a group for you that it will automatically add all of your contacts to. All of your posts are restricted to that group by default. Note that this behaviour can be overridden by your site admin, in which case your posts will be \"public\" (i.e. visible to the entire Internet) by default. If you want your posts to be \"public\" by default, you can change your default post permissions on your Settings page. You also have the option there to change which groups you post to by default, or to change which group your new contacts get placed into by default.","title":"Default Post Privacy"},{"location":"user/groups-and-privacy/#privacy-concerns-to-be-aware-of","text":"These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, unless your friends cut and paste the messages and send them to others. This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends. But it isn't as clear-cut when dealing with GNU Social and other network providers. If you look at the Contact Edit page for any person, we will tell you whether they are members of an insecure network where you should exercise caution. Once you have created a post, you can not change the permissions assigned. Within seconds, it has been delivered to lots of people - and perhaps everybody it was addressed to. If you mistakenly created a message and wish you could take it back, the best you can do is to delete it. We will send out a deleted notification to everybody who received the message - and this should wipe out the message with the same speed it was initially propagated. In most cases it will be completely wiped from the Internet - in under a minute. Again, this applies to Friendica networks. Once a message spreads to other networks, it may not be removed quickly and in some cases it may not be removed at all. In case you haven't yet figured this out, we are encouraging you to encourage your friends to use Friendica - because all these privacy features work much better within a privacy-aware network. Many of the other social networks Friendica can connect to have no privacy controls.","title":"Privacy Concerns To Be Aware Of"},{"location":"user/groups-and-privacy/#profiles-photos-and-privacy","text":"The decentralised nature of Friendica (many websites exchanging information rather than one website which controls everything) has some implications with privacy as it relates to people on other sites. There are things you should be aware of, so you can decide best how to interact privately.","title":"Profiles, Photos, and Privacy"},{"location":"user/groups-and-privacy/#photos","text":"Sharing photos privately is a problem. We can only share them privately with Friendica members. In order to share with other people, we need to prove who they are. We can prove the identity of Friendica members, as we have a mechanism to do so. Your friends on other networks will be blocked from viewing these private photos because we cannot prove that they should be allowed to see them. Our developers are working on solutions to allow access to your friends - no matter what network they are on. However, we take privacy seriously and don't behave like some networks that pretend your photos are private, but make them available to others without proof of identity.","title":"Photos"},{"location":"user/groups-and-privacy/#profiles","text":"Your profile and \"wall\" may also be visited by your friends from other networks, and you can block access to these by web visitors that Friendica doesn't know. Be aware that this could include some of your friends on other networks. This may produce undesired results when posting a long status message to (for instance) Twitter. When Friendica sends a post to these networks which exceeds the service length limit, we truncate it and provide a link to the original. The original is a link back to your Friendica profile. As Friendica cannot prove who they are, it may not be possible for these people to view your post in full. For people in this situation we would recommend providing a \"Twitter-length\" summary, with more detail for friends that can see the post in full. You can do so by including the BBCode tag abstract in your posting. Blocking your profile or entire Friendica site from unknown web visitors also has serious implications for communicating with GNU Social members. These networks communicate with others via public protocols that are not authenticated. In order to view your posts, these networks have to access them as an \"unknown web visitor\". If we allowed this, it would mean anybody could in fact see your posts, and you've instructed Friendica not to allow this. So be aware that the act of blocking your profile to unknown visitors also has the effect of blocking outbound communication with public networks (such as GNU Social) and feed readers such as Google Reader.","title":"Profiles"},{"location":"user/move-account/","tags":["user"],"text":"How to move your account between servers # ! This is an experimental feature Go to \"Settings\" -> \"Export personal data\" Click on \"Export account\" to save your account data. Save the file in a secure place! It contains your details, your contacts, groups, and personal settings. It also contains your secret keys to authenticate yourself to your contacts. Go to your new server, and open http://newserver.com/uimport (there is not a direct link to this page at the moment). Please consider that this is only possible on servers with open registration. On other systems only the administrator can add accounts with an uploaded file. Do NOT create a new account prior to importing your old settings - uimport should be used instead of register. Load your saved account file and click \"Import\". After the move, the account on the old server will not work reliably anymore, and should be not used. Friendica contacts # Friendica will recreate your account on the new server, with your contacts and groups. A message is sent to Friendica contacts, to inform them about your move: If your contacts are running on an updated server, your details on their side will be automatically updated. GNU Social contacts # Contacts on GNU Social will be archived, as we can't inform them about your move. You should ask them to remove your contact from their lists and re-add you, and you should do the same with their contact. Diaspora contacts # Newer Diaspora servers are able to process \"account migration\" messages.","title":"Move account"},{"location":"user/move-account/#how-to-move-your-account-between-servers","text":"! This is an experimental feature Go to \"Settings\" -> \"Export personal data\" Click on \"Export account\" to save your account data. Save the file in a secure place! It contains your details, your contacts, groups, and personal settings. It also contains your secret keys to authenticate yourself to your contacts. Go to your new server, and open http://newserver.com/uimport (there is not a direct link to this page at the moment). Please consider that this is only possible on servers with open registration. On other systems only the administrator can add accounts with an uploaded file. Do NOT create a new account prior to importing your old settings - uimport should be used instead of register. Load your saved account file and click \"Import\". After the move, the account on the old server will not work reliably anymore, and should be not used.","title":"How to move your account between servers"},{"location":"user/move-account/#friendica-contacts","text":"Friendica will recreate your account on the new server, with your contacts and groups. A message is sent to Friendica contacts, to inform them about your move: If your contacts are running on an updated server, your details on their side will be automatically updated.","title":"Friendica contacts"},{"location":"user/move-account/#gnu-social-contacts","text":"Contacts on GNU Social will be archived, as we can't inform them about your move. You should ask them to remove your contact from their lists and re-add you, and you should do the same with their contact.","title":"GNU Social contacts"},{"location":"user/move-account/#diaspora-contacts","text":"Newer Diaspora servers are able to process \"account migration\" messages.","title":"Diaspora contacts"},{"location":"user/remove-account/","tags":["user"],"text":"Remove Account # We don't like to see people leave Friendica, but if you need to remove your account, you should visit the URL http://sitename/removeme with your web browser. You will need to be logged in at the time. You will be asked for your password to confirm the request. If this matches your stored password, your account will immediately be marked as deleted. There is no grace period, this action cannot be reverted. Most of your content and user data will be deleted shortly in the background. We then send out a notification about the account removal to all of your contacts so that they can do the same with their copy of your data. For technical reasons some of your user data is still needed to transmit this removal message. This remaining data will be deleted after a period of around seven days. To disallow impersonation we have to save your used nickname, so that it can't be used again to register on this node.","title":"Remove account"},{"location":"user/remove-account/#remove-account","text":"We don't like to see people leave Friendica, but if you need to remove your account, you should visit the URL http://sitename/removeme with your web browser. You will need to be logged in at the time. You will be asked for your password to confirm the request. If this matches your stored password, your account will immediately be marked as deleted. There is no grace period, this action cannot be reverted. Most of your content and user data will be deleted shortly in the background. We then send out a notification about the account removal to all of your contacts so that they can do the same with their copy of your data. For technical reasons some of your user data is still needed to transmit this removal message. This remaining data will be deleted after a period of around seven days. To disallow impersonation we have to save your used nickname, so that it can't be used again to register on this node.","title":"Remove Account"},{"location":"user/tags-and-mentions/","tags":["user"],"text":"Tags and Mentions # Like many other modern social networks, Friendica uses a special notation inside messages to indicate \"tags\" or contextual links to other entities. Mentions # People are tagged by preceding their name with the @ character. You can tag persons who are in your social circle by adding the \"@\"-sign in front of the name. @mike - indicates a known contact in your social circle whose nickname is \"mike\" @mike_macgirvin - indicates a known contact in your social circle whose full name is \"Mike Macgirvin\". Note that spaces cannot be used inside tags. @mike+151 - this form is used by the drop-down tag completion tool. It indicates the contact whose nickname is mike and whose contact identifier number is 151. The drop-down tool may be used to resolve people with duplicate nicknames. You can tag a person on a different network or one that is not in your social circle by using the following notation: @mike@macgirvin.com - This is called a \"remote mention\" and can only be an email-style locator, not a web URL. Unless their system blocks unsolicited \"mentions\", the person tagged will likely receive a \"Mention\" post/activity or become a direct participant in the conversation in the case of public posts. Friendica blocks incoming \u201cmentions\u201d from people with no relationship to you. The exception is an ongoing conversation started from a contact of both you and the 3rd person or a conversation in a forum where you are a member of. This is a spam prevention measure. Remote mentions are delivered using the OStatus protocol. This protocol is used by Friendica and GNU Social and several other systems like Mastodon, but is not currently implemented in Diaspora. As the OStatus protocol allows this Friendica user can be @-mentioned by users from platforms using this protocol in conversations if the \"Enable OStatus support\" is activated on the Friendica node. These @-mentions won't be blocked, even if there is no relationship between the sender and the receiver of the message. Friendica makes no distinction between people and forums for the purpose of tagging. You can use @-mentions for forums like for other accounts to tag the forum. If you want to post something exclusively to a forum (e.g. the support forum) please use the bang-notation instead of the @tag. So !helpers will be an exclusive posting to the support forum if you are connected with the forum. If you select a forum from the ACL a !-mention will be added automatically to your posting. If you sort your contacts into groups, you cannot @-mention these groups. But you can select the group in the access control when creating a new posting, to allow (or disallow) a certain group of people to see the posting. See Groups and Privacy for more details about grouping your contacts. Topical Tags # Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #cars will provide a search link for all posts mentioning 'cars' 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. The same rules apply as with names that spaces within tags are represented by the underscore character. It is therefore not possible to create a tag whose target contains an underscore. Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #2012-elections.","title":"Tags & Mentions"},{"location":"user/tags-and-mentions/#tags-and-mentions","text":"Like many other modern social networks, Friendica uses a special notation inside messages to indicate \"tags\" or contextual links to other entities.","title":"Tags and Mentions"},{"location":"user/tags-and-mentions/#mentions","text":"People are tagged by preceding their name with the @ character. You can tag persons who are in your social circle by adding the \"@\"-sign in front of the name. @mike - indicates a known contact in your social circle whose nickname is \"mike\" @mike_macgirvin - indicates a known contact in your social circle whose full name is \"Mike Macgirvin\". Note that spaces cannot be used inside tags. @mike+151 - this form is used by the drop-down tag completion tool. It indicates the contact whose nickname is mike and whose contact identifier number is 151. The drop-down tool may be used to resolve people with duplicate nicknames. You can tag a person on a different network or one that is not in your social circle by using the following notation: @mike@macgirvin.com - This is called a \"remote mention\" and can only be an email-style locator, not a web URL. Unless their system blocks unsolicited \"mentions\", the person tagged will likely receive a \"Mention\" post/activity or become a direct participant in the conversation in the case of public posts. Friendica blocks incoming \u201cmentions\u201d from people with no relationship to you. The exception is an ongoing conversation started from a contact of both you and the 3rd person or a conversation in a forum where you are a member of. This is a spam prevention measure. Remote mentions are delivered using the OStatus protocol. This protocol is used by Friendica and GNU Social and several other systems like Mastodon, but is not currently implemented in Diaspora. As the OStatus protocol allows this Friendica user can be @-mentioned by users from platforms using this protocol in conversations if the \"Enable OStatus support\" is activated on the Friendica node. These @-mentions won't be blocked, even if there is no relationship between the sender and the receiver of the message. Friendica makes no distinction between people and forums for the purpose of tagging. You can use @-mentions for forums like for other accounts to tag the forum. If you want to post something exclusively to a forum (e.g. the support forum) please use the bang-notation instead of the @tag. So !helpers will be an exclusive posting to the support forum if you are connected with the forum. If you select a forum from the ACL a !-mention will be added automatically to your posting. If you sort your contacts into groups, you cannot @-mention these groups. But you can select the group in the access control when creating a new posting, to allow (or disallow) a certain group of people to see the posting. See Groups and Privacy for more details about grouping your contacts.","title":"Mentions"},{"location":"user/tags-and-mentions/#topical-tags","text":"Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #cars will provide a search link for all posts mentioning 'cars' 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. The same rules apply as with names that spaces within tags are represented by the underscore character. It is therefore not possible to create a tag whose target contains an underscore. Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #2012-elections.","title":"Topical Tags"},{"location":"user/text-comment/","tags":["user"],"text":"Comment, sort and delete posts # Here you can find an overview of the different ways to comment and sort existing posts. Attention: we've used the \"diabook\" theme. If you're using another theme, some icons may be different. The different icons This symbol is used to indicate that you like the post. Click it twice to undo your choice. This symbol is used to indicate that you dislike the post. Click it twice to undo your choice. This symbol is used to share a post. A copy of this post will automatically appear in your status editor and add a link to the original post. This symbol is used to mark a post. Marked posts will appear on your network page at the \"starred\" tab (from \"star\"). Click it twice to undo your choice. This symbol is used to tag a post with a self-chosen keyword. When you click at the word, you'll get a list of all posts with this tag. Attention: you can't delete the tag once you've set one. This symbol is used to categorize posts. Choose an existing folder or create a new one. You'll find the created folder on your network page under the \"saved folders\" tab. This symbol is used to delete your own post or to remove a post of another person from your stream. This symbol is used to choose more than one post to delete in a single step. After selecting all posts, go to the end of the page and click \"Delete Selected Items\". Symbols of other themes # Darkbubble Darkzero (incl. more \"zero\"-themes, slackr, comix, easterbunny, facepark) Dispy (incl. smoothly, testbubble)","title":"Comments"},{"location":"user/text-comment/#comment-sort-and-delete-posts","text":"Here you can find an overview of the different ways to comment and sort existing posts. Attention: we've used the \"diabook\" theme. If you're using another theme, some icons may be different. The different icons This symbol is used to indicate that you like the post. Click it twice to undo your choice. This symbol is used to indicate that you dislike the post. Click it twice to undo your choice. This symbol is used to share a post. A copy of this post will automatically appear in your status editor and add a link to the original post. This symbol is used to mark a post. Marked posts will appear on your network page at the \"starred\" tab (from \"star\"). Click it twice to undo your choice. This symbol is used to tag a post with a self-chosen keyword. When you click at the word, you'll get a list of all posts with this tag. Attention: you can't delete the tag once you've set one. This symbol is used to categorize posts. Choose an existing folder or create a new one. You'll find the created folder on your network page under the \"saved folders\" tab. This symbol is used to delete your own post or to remove a post of another person from your stream. This symbol is used to choose more than one post to delete in a single step. After selecting all posts, go to the end of the page and click \"Delete Selected Items\".","title":"Comment, sort and delete posts"},{"location":"user/text-comment/#symbols-of-other-themes","text":"Darkbubble Darkzero (incl. more \"zero\"-themes, slackr, comix, easterbunny, facepark) Dispy (incl. smoothly, testbubble)","title":"Symbols of other themes"},{"location":"user/text-editor/","tags":["user"],"text":"Creating posts # Here you can find an overview of the different ways to create and edit your post. One click on the Pencil & Paper icon in the top right of your Home or Network page, or the \"Share\" text box, and the post editor shows up. Below are examples of the post editor in 3 of Friendica's common themes: Post editor, with the Frio (popular default) theme. Post editor, with the Vier theme. Post editor, with the Duepuntozero theme. Post title is optional, you can set it by clicking on \"Set title\". Posts can optionally be in one or more categories. Write category names separated by a comma to file your new post. The Big Empty Textarea is where you write your new post. You can simply enter your text there and click the \"Share\" button, and your new post will be public on your profile page and shared to your contact. If plain text is not so exciting to you, Friendica understands BBCode to spice up your posts: bold, italic, images, links, lists.. See BBCode tags reference page to see all what you can do. The icons under the text area are there to help you to write posts quickly, but vary depending on the theme: With the Frio theme, the Underline, Italics and Bold buttons should be self-explanatory. Upload a picture from your computer. The image will be uploaded and correct bbcode tag will be added to your post.* In the Frio theme, use the Browser tab instead to Upload and/or attach content to your post. This depends on the theme: For Frio, this is to attach remote content - put in a URL to embed in your post, including video or audio content. For other themes: Add files from your computer. Same as picture, but for generic attachment to the post.* Add a web address (url). Enter a URL and Friendica will add to your post a link to the url and an excerpt from the web site, if possible. Add a video. Enter the url to a video (ogg) or to a video page on youtube or vimeo, and it will be embedded in your post with a preview. (In the Frio theme, this is done with the paperclip as mentioned above.) Friendica is using HTML5 for embedding content. Therefore, the supported files are depending on your browser and operating system (OS). Some filetypes are WebM, MP4 and OGG.* Add an audio. Same as video, but for audio. Depending on your browser and operation system MP3, OGG and AAC are supported. Additionally, you are able to add URLs from audiohosters like Soundcloud. Or Set your geographic location. This location will be added into a Google Maps search. That's why a note like \"New York\" or \"10004\" is already enough. These icons can change depending on the theme. Some examples: Vier: Smoothly: * how to upload files The Lock / Permissions # In Frio, the Permissions tab, or in other themes, the Lock button, is the most important feature in Friendica. If the lock is open, your post will be public, and will show up on your profile page when strangers visit it. Click on it and the Permission settings window (aka \" Access Control Selector \" or \" ACL Selector \") pops up. There you can select who can see the post. Permission settings window with some contact selected Click on \"show\" under contact name to hide the post to everyone but selected. Click on \"Visible to everybody\" to make the post public again. If you have defined some groups, you can check \"show\" for groups also. All contact in that group will see the post. If you want to hide the post to one contact of a group selected for \"show\", click \"don't show\" under contact name. Click again on \"show\" or \"don't show\" to switch it off. You can search for contacts or groups with the search box. See also Group and Privacy","title":"Text editor"},{"location":"user/text-editor/#creating-posts","text":"Here you can find an overview of the different ways to create and edit your post. One click on the Pencil & Paper icon in the top right of your Home or Network page, or the \"Share\" text box, and the post editor shows up. Below are examples of the post editor in 3 of Friendica's common themes: Post editor, with the Frio (popular default) theme. Post editor, with the Vier theme. Post editor, with the Duepuntozero theme. Post title is optional, you can set it by clicking on \"Set title\". Posts can optionally be in one or more categories. Write category names separated by a comma to file your new post. The Big Empty Textarea is where you write your new post. You can simply enter your text there and click the \"Share\" button, and your new post will be public on your profile page and shared to your contact. If plain text is not so exciting to you, Friendica understands BBCode to spice up your posts: bold, italic, images, links, lists.. See BBCode tags reference page to see all what you can do. The icons under the text area are there to help you to write posts quickly, but vary depending on the theme: With the Frio theme, the Underline, Italics and Bold buttons should be self-explanatory. Upload a picture from your computer. The image will be uploaded and correct bbcode tag will be added to your post.* In the Frio theme, use the Browser tab instead to Upload and/or attach content to your post. This depends on the theme: For Frio, this is to attach remote content - put in a URL to embed in your post, including video or audio content. For other themes: Add files from your computer. Same as picture, but for generic attachment to the post.* Add a web address (url). Enter a URL and Friendica will add to your post a link to the url and an excerpt from the web site, if possible. Add a video. Enter the url to a video (ogg) or to a video page on youtube or vimeo, and it will be embedded in your post with a preview. (In the Frio theme, this is done with the paperclip as mentioned above.) Friendica is using HTML5 for embedding content. Therefore, the supported files are depending on your browser and operating system (OS). Some filetypes are WebM, MP4 and OGG.* Add an audio. Same as video, but for audio. Depending on your browser and operation system MP3, OGG and AAC are supported. Additionally, you are able to add URLs from audiohosters like Soundcloud. Or Set your geographic location. This location will be added into a Google Maps search. That's why a note like \"New York\" or \"10004\" is already enough. These icons can change depending on the theme. Some examples: Vier: Smoothly: * how to upload files","title":"Creating posts"},{"location":"user/text-editor/#the-lock-permissions","text":"In Frio, the Permissions tab, or in other themes, the Lock button, is the most important feature in Friendica. If the lock is open, your post will be public, and will show up on your profile page when strangers visit it. Click on it and the Permission settings window (aka \" Access Control Selector \" or \" ACL Selector \") pops up. There you can select who can see the post. Permission settings window with some contact selected Click on \"show\" under contact name to hide the post to everyone but selected. Click on \"Visible to everybody\" to make the post public again. If you have defined some groups, you can check \"show\" for groups also. All contact in that group will see the post. If you want to hide the post to one contact of a group selected for \"show\", click \"don't show\" under contact name. Click again on \"show\" or \"don't show\" to switch it off. You can search for contacts or groups with the search box. See also Group and Privacy","title":" The Lock / Permissions"},{"location":"user/quick-start/finally/","tags":["user","quick-start"],"text":"QuickStart - Finally # And that brings the Quick Start to an end. Here are some more things to help get you started: Groups # Friendica Support - problems? This is the place to ask. Documentation # Connecting to more networks Help Index","title":"Finally"},{"location":"user/quick-start/finally/#quickstart-finally","text":"And that brings the Quick Start to an end. Here are some more things to help get you started:","title":"QuickStart - Finally"},{"location":"user/quick-start/finally/#groups","text":"Friendica Support - problems? This is the place to ask.","title":"Groups"},{"location":"user/quick-start/finally/#documentation","text":"Connecting to more networks Help Index","title":"Documentation"},{"location":"user/quick-start/groups-and-pages/","tags":["user","quick-start"],"text":"Quick Start - Groups and Pages # This is the global directory. If you get lost, you can click this link to bring yourself back here. On this page, you'll find a collection of groups, forums and celebrity pages. Groups are not real people. Connecting to them is similar to \"liking\" something on Facebook, or signing up for a new forum. You don't have to feel awkward about introducing yourself to a new person, because they're not people! When you connect to a group, all messages to that group will start appearing in your network tab. You can comment on these posts, or post to the group yourself without ever having to add any of the groups members. This is a great way to make friends dynamically - you'll find people you like and add each other naturally instead of adding random strangers. Simply find a group you're interested in, and connect to it the same way you did with people in the last section. There are a lot of groups, and you're likely to get lost. Remember the link at the top of this page will bring you back here. Once you've added some groups, move on to the next section .","title":"Groups & Pages"},{"location":"user/quick-start/groups-and-pages/#quick-start-groups-and-pages","text":"This is the global directory. If you get lost, you can click this link to bring yourself back here. On this page, you'll find a collection of groups, forums and celebrity pages. Groups are not real people. Connecting to them is similar to \"liking\" something on Facebook, or signing up for a new forum. You don't have to feel awkward about introducing yourself to a new person, because they're not people! When you connect to a group, all messages to that group will start appearing in your network tab. You can comment on these posts, or post to the group yourself without ever having to add any of the groups members. This is a great way to make friends dynamically - you'll find people you like and add each other naturally instead of adding random strangers. Simply find a group you're interested in, and connect to it the same way you did with people in the last section. There are a lot of groups, and you're likely to get lost. Remember the link at the top of this page will bring you back here. Once you've added some groups, move on to the next section .","title":"Quick Start - Groups and Pages"},{"location":"user/quick-start/guide/","text":"Quick Start - Beginning # First things first, let's make sure you're logged in to your account. If you're not already logged in, do so in the frame below. Once you've logged in (or if you are already logged in), you'll now be looking at your profile page. This is a bit like a Facebook wall. It's where all your status messages are kept, and where your friends come to post on your wall. To write your status, simply click on the Pencil & Paper icon in the top right (in the Frio theme), or click in the box that says \"share\" (other themes). When you do this, the posting dialog box will appear or the share box will expand. You can see some formatting options such as Bold, Italics and Underline, as well as ways to add links, pictures (dependent on the theme), and a paperclip icon to attach or embed content. You can use these to upload pictures and files from your computer, share websites with a bit of preview text, or embed video and audio files from elsewhere on the web. With the Frio theme, the browser tab can be used to upload and post media from your account. You can also set your post location here. Once you've finished writing your post, click on the padlock icon or permissions tab to select who can see it. If you do not change anything, your post will be public. This means it will appear to anybody who views your profile, and in the community tab if your site has it enabled, as well as in the network tab of your contacts. Play around with this a bit, then when you're ready to move on, we'll take a look at the Network Tab","title":"Start"},{"location":"user/quick-start/guide/#quick-start-beginning","text":"First things first, let's make sure you're logged in to your account. If you're not already logged in, do so in the frame below. Once you've logged in (or if you are already logged in), you'll now be looking at your profile page. This is a bit like a Facebook wall. It's where all your status messages are kept, and where your friends come to post on your wall. To write your status, simply click on the Pencil & Paper icon in the top right (in the Frio theme), or click in the box that says \"share\" (other themes). When you do this, the posting dialog box will appear or the share box will expand. You can see some formatting options such as Bold, Italics and Underline, as well as ways to add links, pictures (dependent on the theme), and a paperclip icon to attach or embed content. You can use these to upload pictures and files from your computer, share websites with a bit of preview text, or embed video and audio files from elsewhere on the web. With the Frio theme, the browser tab can be used to upload and post media from your account. You can also set your post location here. Once you've finished writing your post, click on the padlock icon or permissions tab to select who can see it. If you do not change anything, your post will be public. This means it will appear to anybody who views your profile, and in the community tab if your site has it enabled, as well as in the network tab of your contacts. Play around with this a bit, then when you're ready to move on, we'll take a look at the Network Tab","title":"Quick Start - Beginning"},{"location":"user/quick-start/making-new-friends/","tags":["user","quick-start"],"text":"Quick Start - Making new friends # This is your Suggested Friends page. If you get lost, you can click this link to bring yourself back here. This is a bit like the Friend Suggestions page of Facebook. Everybody on this list has agreed that they may be suggested as a friend. This means they're unlikely to refuse an introduction you send, and they want to meet new people too! See somebody you like the look of? Click the connect button beneath their photograph. This will bring you to the introductions page. Fill in the form as instructed, and add a small note (optional). Now, wait a bit, and they'll accept your request - note that these are real people, and it might take a while. Now you've added one, you're probably lost. Click the link at the top of this page to go back to the suggested friends list and add some more. Feel uncomfortable adding people you don't know? Don't worry - that's where Groups and Pages come in!","title":"Making new friends"},{"location":"user/quick-start/making-new-friends/#quick-start-making-new-friends","text":"This is your Suggested Friends page. If you get lost, you can click this link to bring yourself back here. This is a bit like the Friend Suggestions page of Facebook. Everybody on this list has agreed that they may be suggested as a friend. This means they're unlikely to refuse an introduction you send, and they want to meet new people too! See somebody you like the look of? Click the connect button beneath their photograph. This will bring you to the introductions page. Fill in the form as instructed, and add a small note (optional). Now, wait a bit, and they'll accept your request - note that these are real people, and it might take a while. Now you've added one, you're probably lost. Click the link at the top of this page to go back to the suggested friends list and add some more. Feel uncomfortable adding people you don't know? Don't worry - that's where Groups and Pages come in!","title":"Quick Start - Making new friends"},{"location":"user/quick-start/network/","tags":["user","quick-start"],"text":"Quick Start - Network # This is your Network Tab. If you get lost, you can click this link to bring yourself back here. This is a bit like the Newsfeed at Facebook or the Stream at Diaspora. It's where all the posts from your contacts, groups, and feeds will appear. If you're new, you won't see anything in this page, unless you posted your status in the last step. If you've already added a few friends, you'll be able to see their posts. Here, you can comment, like, or dislike posts, or click on somebody's name to visit their profile page where you can write on their wall. Now we need to fill it up, the first step, is to make some new friends .","title":"Network"},{"location":"user/quick-start/network/#quick-start-network","text":"This is your Network Tab. If you get lost, you can click this link to bring yourself back here. This is a bit like the Newsfeed at Facebook or the Stream at Diaspora. It's where all the posts from your contacts, groups, and feeds will appear. If you're new, you won't see anything in this page, unless you posted your status in the last step. If you've already added a few friends, you'll be able to see their posts. Here, you can comment, like, or dislike posts, or click on somebody's name to visit their profile page where you can write on their wall. Now we need to fill it up, the first step, is to make some new friends .","title":"Quick Start - Network"},{"location":"spec/api/","tags":["specification","api"],"text":"Using the APIs # Friendica offers multiple API endpoints to interface with third-party applications: Twitter Mastodon Friendica-specific GNU Social Usage # HTTP Method # API endpoints can restrict the HTTP method used to request them. Using an invalid method results in HTTP error 405 \"Method Not Allowed\". Authentication # Friendica supports basic HTTP Auth and OAuth to authenticate the user to the APIs. Errors # When an error occurs in API call, an HTTP error code is returned, with an error message Usually: 400 Bad Request: if parameters are missing or items can't be found 403 Forbidden: if the authenticated user is missing 405 Method Not Allowed: if API was called with an invalid method, e.g. GET when API require POST 501 Not Implemented: if the requested API doesn't exist 500 Internal Server Error: on other error conditions Error body is json: { \"error\" : \"Specific error message\" , \"request\" : \"API path requested\" , \"code\" : \"HTTP error code\" } xml: <status> <error> Specific error message </error> <request> API path requested </request> <code> HTTP error code </code> </status> Usage Examples # BASH / cURL # /usr/bin/curl -u USER:PASS https://YOUR.FRIENDICA.TLD/api/statuses/update.xml -d source = \"some source id\" -d status = \"the status you want to post\" Python # The RSStoFriendika code can be used as an example of how to use the API with python. The lines for posting are located at line 21 and following. def tweet(server, message, group_allow=None): url = server + '/api/statuses/update' urllib2.urlopen(url, urllib.urlencode({'status': message,'group_allow[]':group_allow}, doseq=True)) There is also a module for python 3 for using the API.","title":"Usage"},{"location":"spec/api/#using-the-apis","text":"Friendica offers multiple API endpoints to interface with third-party applications: Twitter Mastodon Friendica-specific GNU Social","title":"Using the APIs"},{"location":"spec/api/#usage","text":"","title":"Usage"},{"location":"spec/api/#http-method","text":"API endpoints can restrict the HTTP method used to request them. Using an invalid method results in HTTP error 405 \"Method Not Allowed\".","title":"HTTP Method"},{"location":"spec/api/#authentication","text":"Friendica supports basic HTTP Auth and OAuth to authenticate the user to the APIs.","title":"Authentication"},{"location":"spec/api/#errors","text":"When an error occurs in API call, an HTTP error code is returned, with an error message Usually: 400 Bad Request: if parameters are missing or items can't be found 403 Forbidden: if the authenticated user is missing 405 Method Not Allowed: if API was called with an invalid method, e.g. GET when API require POST 501 Not Implemented: if the requested API doesn't exist 500 Internal Server Error: on other error conditions Error body is json: { \"error\" : \"Specific error message\" , \"request\" : \"API path requested\" , \"code\" : \"HTTP error code\" } xml: <status> <error> Specific error message </error> <request> API path requested </request> <code> HTTP error code </code> </status>","title":"Errors"},{"location":"spec/api/#usage-examples","text":"","title":"Usage Examples"},{"location":"spec/api/#bash-curl","text":"/usr/bin/curl -u USER:PASS https://YOUR.FRIENDICA.TLD/api/statuses/update.xml -d source = \"some source id\" -d status = \"the status you want to post\"","title":"BASH / cURL"},{"location":"spec/api/#python","text":"The RSStoFriendika code can be used as an example of how to use the API with python. The lines for posting are located at line 21 and following. def tweet(server, message, group_allow=None): url = server + '/api/statuses/update' urllib2.urlopen(url, urllib.urlencode({'status': message,'group_allow[]':group_allow}, doseq=True)) There is also a module for python 3 for using the API.","title":"Python"},{"location":"spec/api/entities/","tags":["specification","api","entities"],"text":"Friendica API entities # Activities # Attribute Type Nullable like List of [Contacts](./entities.md#contact) No dislike List of [Contacts](./entities.md#contact) No attendyes List of [Contacts](./entities.md#contact) No attendno List of [Contacts](./entities.md#contact) No attendmaybe List of [Contacts](./entities.md#contact) No Attachment # Attribute Type Nullable url String (URL) No mimetype String No size Integer (bytes) No Contact # Attribute Type Nullable id Integer No id_str String No name String No screen_name String No location String No description String No profile_image_url String (URL) No profile_image_url_https String (URL) No profile_image_url_profile_size String (URL) No profile_image_url_large String (URL) No url String (URL) No protected Boolean No followers_count Integer No friends_count Integer No listed_count Integer No favourites_count Integer No statuses_count Integer No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No utc_offset Integer No time_zone String No geo_enabled Boolean No verified Boolean No lang String No contributors_enabled Boolean No is_translator Boolean No is_translation_enabled Boolean No following Boolean No follow_request_sent Boolean No statusnet_blocking Boolean No notifications Boolean No statusnet_profile_url String (URL) No uid Integer No cid Integer No pid Integer No self Integer No network String No Entities # Attribute Type Nullable hashtags List of [Hashtags](./entities.md#hashtag) No symbols List of [Symbols](./entities.md#symbol) No urls List of [URLs](./entities.md#url) No user_mentions List of [User mentions](./entities.md#user+mention) No media List of [Medias](./entities.md#media) No Event # Attribute Type Description id Integer uid Integer Owner User Id cid Integer Target Contact Id uri String Item unique URI string name String (Plaintext) Title desc String (HTML) Description startTime String (UTC YYYY-MM-DD HH:II:SS) ) endTime String (UTC YYYY-MM-DD HH:II:SS) ) Optional (null date is 0001-01-01 00:00:00 type String ( event or birthday ) nofinish Boolean Ongoing event place String Optional. Location. ignore Boolean ??? allow_cid String (angle-brackets escaped integers) Optional. List of allowed contact ids allow_gid String (angle-brackets escaped integers) Optional. List of allowed group ids deny_cid String (angle-brackets escaped integers) Optional. List of disallowed contact ids deny_gid String (angle-brackets escaped integers) Optional. List of disallowed group ids Hashtag # Unused Item # Attribute Type Nullable text String (Plaintext) No truncated Boolean No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No in_reply_to_status_id Integer No in_reply_to_status_id_str String No source String No id Integer No id_str String No in_reply_to_user_id Integer No in_reply_to_user_id_str String No in_reply_to_screen_name String No geo String Yes favorited Boolean No user [Contact](./entities.md#contact) No friendica_author [Contact](./entities.md#contact) No friendica_owner [Contact](./entities.md#contact) No friendica_private Boolean No statusnet_html String (HTML) No statusnet_conversation_id Integer No external_url String (URL) No friendica_activities [Activities](./entities.md#activities) No friendica_title String (Plaintext) No friendica_html String (HTML) No attachments List of [Attachments](./entities.md#attachment) Yes entities [Entities](./entities.md#entities) Yes Media # Identical to the Twitter Media Object . Attribute Type Nullable id Integer No id_str String No indices List of Integer No media_url String (URL) No media_url_https String (URL) No url String (URL) No display_url String (URL) No expanded_url String (URL) No ext_alt_text String No type String No sizes [Sizes](./entities.md#sizes) No Notification # Attribute Type Description id Integer hash String type Integer 1: Inbound follow request 2: Outbound follow request confirmation 4: Wall-to-wall post 8: Reply 16: Private message 32: Friend suggestion 64: Unused 128: Mention 256: Tag added to a post 512: Poke 1024: New post 16384: System email 32768: System event name String Full name of the contact subject url String (URL) Profile page URL of the contact subject photo String (URL) Profile photo URL of the contact subject date String (Date) YYYY-MM-DD hh:mm:ss local server time msg String (BBCode) uid Integer Owner User Id link String (URL) Notification URL iid Integer Item Id parent Integer Parent Item Id seen Integer (Boolean) Whether the notification was read or not. verb String (URL) [Activity Streams](http://activitystrea.ms) Verb URL seen Integer (Boolean) Whether the notification was read or not. otype Enum Subject type (`item`, `intro` or `mail`) name_cache String (HTML) Full name of the contact subject msg_cache String (Plaintext) Plaintext version of the notification text with a placeholder (`{0}`) for the subject contact's name. timestamp Integer Unix timestamp date_rel String Time since the note was posted, eg \"1 hour ago\" msg_html String (HTML) msg_plain String (Plaintext) Photo # Attribute Type Description id String Resource ID (32 hex chars) created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS title String desc String (Plaintext) Picture caption album String Album name filename String Original image filename type String MIME Type height Integer Image height in pixels width Integer Image width in pixels profile Integer 1 if it is a profile photo allow_cid String (ACL) List of contact ids wrapped in angle brackets allowed to access the photo. allow_gid String (ACL) List of contact group ids wrapped in angle brackets allowed to access the photo. deny_cid String (ACL) List of contact ids wrapped in angle brackets forbidden to access the photo. deny_gid String (ACL) List of contact group ids wrapped in angle brackets forbidden to access the photo. link Array of Strings (URL) URLs to the different scales indexed by scale number if no specific scale was requested. Mutually exclusive with data datasize . datasize Integer Picture size in bytes if a single scale was requested. Mutually exclusive with link . data String Base64-encoded image data if a single scale was requested. Mutually exclusive with link . friendica_activities [Activities](./entities.md#activities) friendica_comments List of [Items](./entities.md#item) rights_mismatch Boolean True if the ACL differs between the picture and the associated item. Photo List Item # Attribute Type Description id String Resource ID (32 hex chars) album String Album name filename String Original image filename type String MIME Type created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS desc String (Plaintext) Picture caption thumb String (URL) URL of the smallest scale version of the picture. Private message # Attribute Type Description id Integer sender_id Integer Sender Contact Id text String Can be HTML or plaintext depending on the API call parameter `getText`. recipient_id Integer Recipient Contact Id created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 sender_screen_name String recipient_screen_name String sender [Contact](./entities.md#contact) recipient [Contact](./entities.md#contact) title String Empty if the API call parameter `getText` is empty or absent. friendica_seen Integer (Boolean) Whether the private message has been read or not. friendica_parent_uri String Profile # Attribute Type Description profile_id Integer profile_name String is_default Boolean hide_friends Boolean Whether the user chose to hide their contact list on their profile. profile_photo String (URL) Largest size profile picture URL. profile_thumb String (URL) Smallest size profile picture URL. publish Boolean Whether the user chose to publish their profile in the local directory. net_publish Boolean Whether the user chose to publish their profile in the global directory. description String date_of_birth String address String city String region String postal_code String country String public_keywords String Comma-separated list of words meant to be displayed as hashtags. private_keywords String Comma-separated list of words meant to be used for search only. homepage String (URL) Size # Attribute Type Nullable Attribute Type Nullable w Integer No h Integer No resize Enum (fit, crop) Yes ## Sizes Attribute Type Nullable medium [Size](./entities.md#size) No large [Size](./entities.md#size) Yes thumb [Size](./entities.md#size) Yes small [Size](./entities.md#size) Yes ## Symbol Unused ## URL Attribute Type Nullable url String (URL) No expanded_url String (URL) No display_url String (URL) No indices List of Integer No ## User Mention Unused","title":"Entities"},{"location":"spec/api/entities/#friendica-api-entities","text":"","title":"Friendica API entities"},{"location":"spec/api/entities/#activities","text":"Attribute Type Nullable like List of [Contacts](./entities.md#contact) No dislike List of [Contacts](./entities.md#contact) No attendyes List of [Contacts](./entities.md#contact) No attendno List of [Contacts](./entities.md#contact) No attendmaybe List of [Contacts](./entities.md#contact) No","title":"Activities"},{"location":"spec/api/entities/#attachment","text":"Attribute Type Nullable url String (URL) No mimetype String No size Integer (bytes) No","title":"Attachment"},{"location":"spec/api/entities/#contact","text":"Attribute Type Nullable id Integer No id_str String No name String No screen_name String No location String No description String No profile_image_url String (URL) No profile_image_url_https String (URL) No profile_image_url_profile_size String (URL) No profile_image_url_large String (URL) No url String (URL) No protected Boolean No followers_count Integer No friends_count Integer No listed_count Integer No favourites_count Integer No statuses_count Integer No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No utc_offset Integer No time_zone String No geo_enabled Boolean No verified Boolean No lang String No contributors_enabled Boolean No is_translator Boolean No is_translation_enabled Boolean No following Boolean No follow_request_sent Boolean No statusnet_blocking Boolean No notifications Boolean No statusnet_profile_url String (URL) No uid Integer No cid Integer No pid Integer No self Integer No network String No","title":"Contact"},{"location":"spec/api/entities/#entities","text":"Attribute Type Nullable hashtags List of [Hashtags](./entities.md#hashtag) No symbols List of [Symbols](./entities.md#symbol) No urls List of [URLs](./entities.md#url) No user_mentions List of [User mentions](./entities.md#user+mention) No media List of [Medias](./entities.md#media) No","title":"Entities"},{"location":"spec/api/entities/#event","text":"Attribute Type Description id Integer uid Integer Owner User Id cid Integer Target Contact Id uri String Item unique URI string name String (Plaintext) Title desc String (HTML) Description startTime String (UTC YYYY-MM-DD HH:II:SS) ) endTime String (UTC YYYY-MM-DD HH:II:SS) ) Optional (null date is 0001-01-01 00:00:00 type String ( event or birthday ) nofinish Boolean Ongoing event place String Optional. Location. ignore Boolean ??? allow_cid String (angle-brackets escaped integers) Optional. List of allowed contact ids allow_gid String (angle-brackets escaped integers) Optional. List of allowed group ids deny_cid String (angle-brackets escaped integers) Optional. List of disallowed contact ids deny_gid String (angle-brackets escaped integers) Optional. List of disallowed group ids","title":"Event"},{"location":"spec/api/entities/#hashtag","text":"Unused","title":"Hashtag"},{"location":"spec/api/entities/#item","text":"Attribute Type Nullable text String (Plaintext) No truncated Boolean No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No in_reply_to_status_id Integer No in_reply_to_status_id_str String No source String No id Integer No id_str String No in_reply_to_user_id Integer No in_reply_to_user_id_str String No in_reply_to_screen_name String No geo String Yes favorited Boolean No user [Contact](./entities.md#contact) No friendica_author [Contact](./entities.md#contact) No friendica_owner [Contact](./entities.md#contact) No friendica_private Boolean No statusnet_html String (HTML) No statusnet_conversation_id Integer No external_url String (URL) No friendica_activities [Activities](./entities.md#activities) No friendica_title String (Plaintext) No friendica_html String (HTML) No attachments List of [Attachments](./entities.md#attachment) Yes entities [Entities](./entities.md#entities) Yes","title":"Item"},{"location":"spec/api/entities/#media","text":"Identical to the Twitter Media Object . Attribute Type Nullable id Integer No id_str String No indices List of Integer No media_url String (URL) No media_url_https String (URL) No url String (URL) No display_url String (URL) No expanded_url String (URL) No ext_alt_text String No type String No sizes [Sizes](./entities.md#sizes) No","title":"Media"},{"location":"spec/api/entities/#notification","text":"Attribute Type Description id Integer hash String type Integer 1: Inbound follow request 2: Outbound follow request confirmation 4: Wall-to-wall post 8: Reply 16: Private message 32: Friend suggestion 64: Unused 128: Mention 256: Tag added to a post 512: Poke 1024: New post 16384: System email 32768: System event name String Full name of the contact subject url String (URL) Profile page URL of the contact subject photo String (URL) Profile photo URL of the contact subject date String (Date) YYYY-MM-DD hh:mm:ss local server time msg String (BBCode) uid Integer Owner User Id link String (URL) Notification URL iid Integer Item Id parent Integer Parent Item Id seen Integer (Boolean) Whether the notification was read or not. verb String (URL) [Activity Streams](http://activitystrea.ms) Verb URL seen Integer (Boolean) Whether the notification was read or not. otype Enum Subject type (`item`, `intro` or `mail`) name_cache String (HTML) Full name of the contact subject msg_cache String (Plaintext) Plaintext version of the notification text with a placeholder (`{0}`) for the subject contact's name. timestamp Integer Unix timestamp date_rel String Time since the note was posted, eg \"1 hour ago\" msg_html String (HTML) msg_plain String (Plaintext)","title":"Notification"},{"location":"spec/api/entities/#photo","text":"Attribute Type Description id String Resource ID (32 hex chars) created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS title String desc String (Plaintext) Picture caption album String Album name filename String Original image filename type String MIME Type height Integer Image height in pixels width Integer Image width in pixels profile Integer 1 if it is a profile photo allow_cid String (ACL) List of contact ids wrapped in angle brackets allowed to access the photo. allow_gid String (ACL) List of contact group ids wrapped in angle brackets allowed to access the photo. deny_cid String (ACL) List of contact ids wrapped in angle brackets forbidden to access the photo. deny_gid String (ACL) List of contact group ids wrapped in angle brackets forbidden to access the photo. link Array of Strings (URL) URLs to the different scales indexed by scale number if no specific scale was requested. Mutually exclusive with data datasize . datasize Integer Picture size in bytes if a single scale was requested. Mutually exclusive with link . data String Base64-encoded image data if a single scale was requested. Mutually exclusive with link . friendica_activities [Activities](./entities.md#activities) friendica_comments List of [Items](./entities.md#item) rights_mismatch Boolean True if the ACL differs between the picture and the associated item.","title":"Photo"},{"location":"spec/api/entities/#photo-list-item","text":"Attribute Type Description id String Resource ID (32 hex chars) album String Album name filename String Original image filename type String MIME Type created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS desc String (Plaintext) Picture caption thumb String (URL) URL of the smallest scale version of the picture.","title":"Photo List Item"},{"location":"spec/api/entities/#private-message","text":"Attribute Type Description id Integer sender_id Integer Sender Contact Id text String Can be HTML or plaintext depending on the API call parameter `getText`. recipient_id Integer Recipient Contact Id created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 sender_screen_name String recipient_screen_name String sender [Contact](./entities.md#contact) recipient [Contact](./entities.md#contact) title String Empty if the API call parameter `getText` is empty or absent. friendica_seen Integer (Boolean) Whether the private message has been read or not. friendica_parent_uri String","title":"Private message"},{"location":"spec/api/entities/#profile","text":"Attribute Type Description profile_id Integer profile_name String is_default Boolean hide_friends Boolean Whether the user chose to hide their contact list on their profile. profile_photo String (URL) Largest size profile picture URL. profile_thumb String (URL) Smallest size profile picture URL. publish Boolean Whether the user chose to publish their profile in the local directory. net_publish Boolean Whether the user chose to publish their profile in the global directory. description String date_of_birth String address String city String region String postal_code String country String public_keywords String Comma-separated list of words meant to be displayed as hashtags. private_keywords String Comma-separated list of words meant to be used for search only. homepage String (URL)","title":"Profile"},{"location":"spec/api/entities/#size","text":"Attribute Type Nullable Attribute Type Nullable w Integer No h Integer No resize Enum (fit, crop) Yes ## Sizes Attribute Type Nullable medium [Size](./entities.md#size) No large [Size](./entities.md#size) Yes thumb [Size](./entities.md#size) Yes small [Size](./entities.md#size) Yes ## Symbol Unused ## URL Attribute Type Nullable url String (URL) No expanded_url String (URL) No display_url String (URL) No indices List of Integer No ## User Mention Unused","title":"Size"},{"location":"spec/api/friendica/","tags":["specification","api"],"text":"Friendica API # Overview # Friendica provides the following specific endpoints. Authentication is the same as described in Using the APIs . Entities # These endpoints use the Friendica API entities . Endpoints # GET api/friendica/events # Returns a list of Event entities for the current logged-in user. Parameters # since_id : (optional) minimum event id for pagination count : maximum number of items returned, default 20 GET api/externalprofile/show # Returns a Contact entity for the provided profile URL. Parameters # profileurl : Profile URL GET api/statuses/public_timeline # Returns a list of public Items posted on this node. Equivalent of the local community page. Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false) Unsupported parameters # trim_user GET api/statuses/networkpublic_timeline # Returns a list of public Items this node is aware of. Equivalent of the global community page. Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false) GET api/statuses/replies # Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false) Unsupported parameters # include_rts trim_user contributor_details GET api/conversation/show # Unofficial Twitter command. It shows all direct answers (excluding the original post) to a given id. Parameters # id : id of the post count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false) Unsupported parameters # include_rts trim_user contributor_details GET api/statusnet/conversation # Alias of api/conversation/show . GET api/statusnet/config # Returns the public Friendica node configuration. GET api/gnusocial/config # Alias of api/statusnet/config . GET api/statusnet/version # Returns a fake static StatusNet protocol version. GET api/gnusocial/version # Alias of api/statusnet/version . POST api/friendica/activity/[verb] # Add or remove an activity from an item. 'verb' can be one of: like dislike attendyes attendno attendmaybe To remove an activity, prepend the verb with \"un\", eg. \"unlike\" or \"undislike\" Attend verbs disable eachother: that means that if \"attendyes\" was added to an item, adding \"attendno\" remove previous \"attendyes\". Attend verbs should be used only with event-related items (there is no check at the moment). Parameters # id : item id Return values # On success: json: \"ok\" xml: <ok>true</ok> On error: HTTP 400 BadRequest GET api/direct_messages # Deprecated Twitter received direct message list endpoint. Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\") Unsupported parameters # skip_status GET api/direct_messages/all # Returns all Private Messages . Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" friendica_verbose : \"true\" enables different error returns (default: \"false\") GET api/direct_messages/conversation # Returns all replies of a single private message conversation. Returns Private Messages Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" uri : URI of the conversation friendica_verbose : \"true\" enables different error returns (default: \"false\") GET api/direct_messages/sent # Deprecated Twitter sent direct message list endpoint. Returns Private Messages . Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\") POST api/direct_messages/new # Deprecated Twitter direct message submission endpoint. Parameters # user_id : id of the user screen_name : screen name (for technical reasons, this value is not unique!) text : The message replyto : ID of the replied direct message title : Title of the direct message POST api/direct_messages/destroy # Deprecated Twitter direct message deletion endpoint. Parameters # id : id of the message to be deleted include_entities : optional, currently not yet implemented friendica_parenturi : optional, can be used for increased safety to delete only intended messages friendica_verbose : \"true\" enables different error returns (default: \"false\") Return values # On success: JSON return as defined for Twitter API not yet implemented on friendica_verbose=true: JSON return {\"result\":\"ok\",\"message\":\"message deleted\"} On error: HTTP 400 BadRequest on friendica_verbose=true: different JSON returns {\"result\":\"error\",\"message\":\"xyz\"} GET api/friendica/direct_messages_setseen # Parameters # id : id of the message to be updated as seen Return values # On success: JSON return {\"result\": \"ok\", \"message\": \"message set to seen\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"xyz\"} GET api/friendica/direct_messages_search (GET; AUTH) # Returns Private Messages matching the provided search string. Parameters # searchstring : string for which the API call should search as '%searchstring%' in field 'body' of all messages of the authenticated user (caption ignored) getText (optional): plain | html If ommited, the title is prepended to the plaintext body in the text attribute of the private message objects. getUserObjects (optional): true | false If false , the sender and recipient attributes of the private message object are absent. Return values # Returns only tested with JSON, XML might work as well. On success: JSON return {\"success\":\"true\", \"search_results\": array of found messages} JSOn return {\"success\":\"false\", \"search_results\": \"nothing found\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"searchstring not specified\"} GET api/friendica/group_show # Return all or a specified group of the user with the containing contacts as array. Parameters # gid : optional, if not given, API returns all groups of the user Return values # Array of: name : name of the group gid : id of the group user : array of Contacts POST api/friendica/group_create # Create the group with the posted array of contacts as members. Parameters # name : name of the group to be created POST data # JSON data as Array like the result of GET api/friendica/group_show : gid name List of Contacts Return values # Array of: success : true if successfully created or reactivated gid : gid of the created group name : name of the created group status : \"missing user\" | \"reactivated\" | \"ok\" wrong users : array of users, which were not available in the contact table POST api/friendica/group_update # Update the group with the posted array of contacts as members (post all members of the group to the call; function will remove members not posted). Parameters # gid : id of the group to be changed name : name of the group to be changed POST data # JSON data as array like the result of GET api/friendica/group_show : gid name List of Contacts Return values # Array of: success : true if successfully updated gid : gid of the changed group name : name of the changed group status : \"missing user\" | \"ok\" wrong users : array of users, which were not available in the contact table POST api/friendica/group_delete # Delete the specified group of contacts; API call need to include the correct gid AND name of the group to be deleted. Parameters # gid : id of the group to be deleted name : name of the group to be deleted Return values # Array of: success : true if successfully deleted gid : gid of the deleted group name : name of the deleted group status : \"deleted\" if successfully deleted wrong users : empty array GET api/friendica/notifications # Return last 50 Notifications for the current user, ordered by date with unseen item on top. Parameters # none POST api/friendica/notifications/seen # Set notification as seen. Parameters # id : id of the notification to set seen Return values # If the note is linked to an item, returns an Item . Otherwise, a success status is returned: success (json) | <status>success</status> (xml) GET api/friendica/photo # Returns a Photo . Parameters # photo_id : Resource id of a photo. scale : (optional) scale value of the photo Returns data of a picture with the given resource. If 'scale' isn't provided, returned data include full url to each scale of the photo. If 'scale' is set, returned data include image data base64 encoded. possibile scale value are: 0: original or max size by server settings 1: image with or height at <= 640 2: image with or height at <= 320 3: thumbnail 160x160 4: Profile image at 300x300 5: Profile image at 80x80 6: Profile image at 48x48 An image used as profile image has only scaled 4-6, other images only 0-3 Return values # json: { \"id\" : \"photo id\" , \"created\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"edited\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"title\" : \"photo title\" , \"desc\" : \"photo description\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"mime type\" , \"height\" : \"number\" , \"width\" : \"number\" , \"profile\" : \"1 if is profile photo\" , \"link\" : { \"<scale>\" : \"url to image\" , ... }, // if 'scale' is set \"datasize\" : \"size in byte\" , \"data\" : \"base64 encoded image data\" } xml: <photo> <id> photo id </id> <created> date(YYYY-MM-DD HH:MM:SS) </created> <edited> date(YYYY-MM-DD HH:MM:SS) </edited> <title> photo title </title> <desc> photo description </desc> <album> album name </album> <filename> original file name </filename> <type> mime type </type> <height> number </height> <width> number </width> <profile> 1 if is profile photo </profile> <links type= \"array\" > <link type= \"mime type\" scale= \"scale number\" href= \"image url\" /> ... </links> </photo> GET api/friendica/photos/list # Returns the API user's Photo List Items . Return values # json: [ { \"id\" : \"resource_id\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"image mime type\" , \"thumb\" : \"url to thumb sized image\" }, ... ] xml: <photos type= \"array\" > <photo id= \"resource_id\" album= \"album name\" filename= \"original file name\" type= \"image mime type\" > \"url to thumb sized image\" </photo> ... </photos> POST api/friendica/photo/create # Alias of api/friendica/photo/update POST api/friendica/photo/update # Saves data for the scales 0-2 to database (see above for scale description). Call adds non-public entries to items table to enable authenticated contacts to comment/like the photo. Client should pay attention to the fact that updated access rights are not transferred to the contacts. i.e. public photos remain publicly visible if they have been commented/liked before setting visibility back to a limited group. Currently, it is best to inform user that updating rights is not the right way to do this, and offer a solution to add photo as a new photo with the new rights instead. Parameters # photo_id (optional): if specified the photo with this id will be updated media (optional): image data as base64, only optional if photo_id is specified (new upload must have media) desc (optional): description for the photo, updated when photo_id is specified album : name of the album to be deleted (always necessary) album_new (optional): can be used to change the album of a single photo if photo_id is specified allow_cid / allow_gid / deny_cid / deny_gid (optional): on create: empty string or omitting = public photo, specify in format <x><y><z> for private photo on update: keys need to be present with empty values for changing a private photo to public Return values # On success: new photo uploaded: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed photo data: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed info: JSON return {\"result\": \"updated\", \"message\":\"Image id 'xyz' has been updated.\"} photo updated - nothing changed: JSON return {\"result\": \"cancelled\",\"message\": \"Nothing to update for image id 'xyz'.\"} On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no media data submitted\", \"photo not available\", \"acl data invalid\" 500 INTERNALSERVERERROR: \"image size exceeds PHP config settings, file was rejected by server\", \"image size exceeds Friendica Config setting (uploaded size: x)\", \"unable to process image data\", \"image upload failed\", \"unknown error - uploading photo failed, see Friendica log for more information\", \"unknown error - update photo entry in database failed\", \"unknown error - this error on uploading or updating a photo should never happen\" POST api/friendica/photo/delete # Deletes a single image with the specified id, is not reversible -> ensure that client is asking user for being sure to do this Sets item table entries for this photo to deleted = 1. Parameters # photo_id : id of the photo to be deleted Return values # On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"photo with id 'xyz' has been deleted from server.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no photo_id specified\", \"photo not available\" 500 INTERNALSERVERERROR: \"unknown error on deleting photo\", \"problem with deleting items occurred\" POST api/friendica/photoalbum/delete # Deletes all images with the specified album name, is not reversible -> ensure that client is asking user for being sure to do this. Parameters # album : name of the album to be deleted Return values # On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"album 'xyz' with all containing photos has been deleted.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"problem with deleting item occured\", \"unknown error - deleting from database failed\" POST api/friendica/photoalbum/update # Changes the album name to album_new for all photos in album. Parameters # album : name of the album to be updated album_new : new name of the album Return values # On success: JSON return { \"result\" : \"updated\" , \"message\" : \"album 'abc' with all containing photos has been renamed to 'xyz'.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no new albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"unknown error - updating in database failed\" GET api/friendica/profile/show # Returns the Profile data of the authenticated user. Return values # On success: Array of: global_dir : URL of the global directory set in server settings friendica_owner : user data of the authenticated user profiles : array of the profile data On error: HTTP 403 Forbidden: when no authentication was provided HTTP 400 Bad Request: if given profile_id is not in the database or is not assigned to the authenticated user General description of profile data in API returns: - hide_friends: true if friends are hidden - profile_photo - profile_thumb - publish: true if published on the server's local directory - net_publish: true if published to global_dir - fullname - date_of_birth - description - xmpp - homepage - address - locality - region - postal_code - country - pub_keywords - custom_fields: list of public custom fields Deprecated endpoints # POST api/statuses/mediap","title":"Friendica"},{"location":"spec/api/friendica/#friendica-api","text":"","title":"Friendica API"},{"location":"spec/api/friendica/#overview","text":"Friendica provides the following specific endpoints. Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"spec/api/friendica/#entities","text":"These endpoints use the Friendica API entities .","title":"Entities"},{"location":"spec/api/friendica/#endpoints","text":"","title":"Endpoints"},{"location":"spec/api/friendica/#get-apifriendicaevents","text":"Returns a list of Event entities for the current logged-in user.","title":"GET api/friendica/events"},{"location":"spec/api/friendica/#parameters","text":"since_id : (optional) minimum event id for pagination count : maximum number of items returned, default 20","title":"Parameters"},{"location":"spec/api/friendica/#get-apiexternalprofileshow","text":"Returns a Contact entity for the provided profile URL.","title":"GET api/externalprofile/show"},{"location":"spec/api/friendica/#parameters_1","text":"profileurl : Profile URL","title":"Parameters"},{"location":"spec/api/friendica/#get-apistatusespublic_timeline","text":"Returns a list of public Items posted on this node. Equivalent of the local community page.","title":"GET api/statuses/public_timeline"},{"location":"spec/api/friendica/#parameters_2","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"spec/api/friendica/#unsupported-parameters","text":"trim_user","title":"Unsupported parameters"},{"location":"spec/api/friendica/#get-apistatusesnetworkpublic_timeline","text":"Returns a list of public Items this node is aware of. Equivalent of the global community page.","title":"GET api/statuses/networkpublic_timeline"},{"location":"spec/api/friendica/#parameters_3","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"spec/api/friendica/#get-apistatusesreplies","text":"","title":"GET api/statuses/replies"},{"location":"spec/api/friendica/#parameters_4","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"spec/api/friendica/#unsupported-parameters_1","text":"include_rts trim_user contributor_details","title":"Unsupported parameters"},{"location":"spec/api/friendica/#get-apiconversationshow","text":"Unofficial Twitter command. It shows all direct answers (excluding the original post) to a given id.","title":"GET api/conversation/show"},{"location":"spec/api/friendica/#parameters_5","text":"id : id of the post count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"spec/api/friendica/#unsupported-parameters_2","text":"include_rts trim_user contributor_details","title":"Unsupported parameters"},{"location":"spec/api/friendica/#get-apistatusnetconversation","text":"Alias of api/conversation/show .","title":"GET api/statusnet/conversation"},{"location":"spec/api/friendica/#get-apistatusnetconfig","text":"Returns the public Friendica node configuration.","title":"GET api/statusnet/config"},{"location":"spec/api/friendica/#get-apignusocialconfig","text":"Alias of api/statusnet/config .","title":"GET api/gnusocial/config"},{"location":"spec/api/friendica/#get-apistatusnetversion","text":"Returns a fake static StatusNet protocol version.","title":"GET api/statusnet/version"},{"location":"spec/api/friendica/#get-apignusocialversion","text":"Alias of api/statusnet/version .","title":"GET api/gnusocial/version"},{"location":"spec/api/friendica/#post-apifriendicaactivityverb","text":"Add or remove an activity from an item. 'verb' can be one of: like dislike attendyes attendno attendmaybe To remove an activity, prepend the verb with \"un\", eg. \"unlike\" or \"undislike\" Attend verbs disable eachother: that means that if \"attendyes\" was added to an item, adding \"attendno\" remove previous \"attendyes\". Attend verbs should be used only with event-related items (there is no check at the moment).","title":"POST api/friendica/activity/[verb]"},{"location":"spec/api/friendica/#parameters_6","text":"id : item id","title":"Parameters"},{"location":"spec/api/friendica/#return-values","text":"On success: json: \"ok\" xml: <ok>true</ok> On error: HTTP 400 BadRequest","title":"Return values"},{"location":"spec/api/friendica/#get-apidirect_messages","text":"Deprecated Twitter received direct message list endpoint.","title":"GET api/direct_messages"},{"location":"spec/api/friendica/#parameters_7","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"spec/api/friendica/#unsupported-parameters_3","text":"skip_status","title":"Unsupported parameters"},{"location":"spec/api/friendica/#get-apidirect_messagesall","text":"Returns all Private Messages .","title":"GET api/direct_messages/all"},{"location":"spec/api/friendica/#parameters_8","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"spec/api/friendica/#get-apidirect_messagesconversation","text":"Returns all replies of a single private message conversation. Returns Private Messages","title":"GET api/direct_messages/conversation"},{"location":"spec/api/friendica/#parameters_9","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" uri : URI of the conversation friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"spec/api/friendica/#get-apidirect_messagessent","text":"Deprecated Twitter sent direct message list endpoint. Returns Private Messages .","title":"GET api/direct_messages/sent"},{"location":"spec/api/friendica/#parameters_10","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"spec/api/friendica/#post-apidirect_messagesnew","text":"Deprecated Twitter direct message submission endpoint.","title":"POST api/direct_messages/new"},{"location":"spec/api/friendica/#parameters_11","text":"user_id : id of the user screen_name : screen name (for technical reasons, this value is not unique!) text : The message replyto : ID of the replied direct message title : Title of the direct message","title":"Parameters"},{"location":"spec/api/friendica/#post-apidirect_messagesdestroy","text":"Deprecated Twitter direct message deletion endpoint.","title":"POST api/direct_messages/destroy"},{"location":"spec/api/friendica/#parameters_12","text":"id : id of the message to be deleted include_entities : optional, currently not yet implemented friendica_parenturi : optional, can be used for increased safety to delete only intended messages friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"spec/api/friendica/#return-values_1","text":"On success: JSON return as defined for Twitter API not yet implemented on friendica_verbose=true: JSON return {\"result\":\"ok\",\"message\":\"message deleted\"} On error: HTTP 400 BadRequest on friendica_verbose=true: different JSON returns {\"result\":\"error\",\"message\":\"xyz\"}","title":"Return values"},{"location":"spec/api/friendica/#get-apifriendicadirect_messages_setseen","text":"","title":"GET api/friendica/direct_messages_setseen"},{"location":"spec/api/friendica/#parameters_13","text":"id : id of the message to be updated as seen","title":"Parameters"},{"location":"spec/api/friendica/#return-values_2","text":"On success: JSON return {\"result\": \"ok\", \"message\": \"message set to seen\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"xyz\"}","title":"Return values"},{"location":"spec/api/friendica/#get-apifriendicadirect_messages_search-get-auth","text":"Returns Private Messages matching the provided search string.","title":"GET api/friendica/direct_messages_search (GET; AUTH)"},{"location":"spec/api/friendica/#parameters_14","text":"searchstring : string for which the API call should search as '%searchstring%' in field 'body' of all messages of the authenticated user (caption ignored) getText (optional): plain | html If ommited, the title is prepended to the plaintext body in the text attribute of the private message objects. getUserObjects (optional): true | false If false , the sender and recipient attributes of the private message object are absent.","title":"Parameters"},{"location":"spec/api/friendica/#return-values_3","text":"Returns only tested with JSON, XML might work as well. On success: JSON return {\"success\":\"true\", \"search_results\": array of found messages} JSOn return {\"success\":\"false\", \"search_results\": \"nothing found\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"searchstring not specified\"}","title":"Return values"},{"location":"spec/api/friendica/#get-apifriendicagroup_show","text":"Return all or a specified group of the user with the containing contacts as array.","title":"GET api/friendica/group_show"},{"location":"spec/api/friendica/#parameters_15","text":"gid : optional, if not given, API returns all groups of the user","title":"Parameters"},{"location":"spec/api/friendica/#return-values_4","text":"Array of: name : name of the group gid : id of the group user : array of Contacts","title":"Return values"},{"location":"spec/api/friendica/#post-apifriendicagroup_create","text":"Create the group with the posted array of contacts as members.","title":"POST api/friendica/group_create"},{"location":"spec/api/friendica/#parameters_16","text":"name : name of the group to be created","title":"Parameters"},{"location":"spec/api/friendica/#post-data","text":"JSON data as Array like the result of GET api/friendica/group_show : gid name List of Contacts","title":"POST data"},{"location":"spec/api/friendica/#return-values_5","text":"Array of: success : true if successfully created or reactivated gid : gid of the created group name : name of the created group status : \"missing user\" | \"reactivated\" | \"ok\" wrong users : array of users, which were not available in the contact table","title":"Return values"},{"location":"spec/api/friendica/#post-apifriendicagroup_update","text":"Update the group with the posted array of contacts as members (post all members of the group to the call; function will remove members not posted).","title":"POST api/friendica/group_update"},{"location":"spec/api/friendica/#parameters_17","text":"gid : id of the group to be changed name : name of the group to be changed","title":"Parameters"},{"location":"spec/api/friendica/#post-data_1","text":"JSON data as array like the result of GET api/friendica/group_show : gid name List of Contacts","title":"POST data"},{"location":"spec/api/friendica/#return-values_6","text":"Array of: success : true if successfully updated gid : gid of the changed group name : name of the changed group status : \"missing user\" | \"ok\" wrong users : array of users, which were not available in the contact table","title":"Return values"},{"location":"spec/api/friendica/#post-apifriendicagroup_delete","text":"Delete the specified group of contacts; API call need to include the correct gid AND name of the group to be deleted.","title":"POST api/friendica/group_delete"},{"location":"spec/api/friendica/#parameters_18","text":"gid : id of the group to be deleted name : name of the group to be deleted","title":"Parameters"},{"location":"spec/api/friendica/#return-values_7","text":"Array of: success : true if successfully deleted gid : gid of the deleted group name : name of the deleted group status : \"deleted\" if successfully deleted wrong users : empty array","title":"Return values"},{"location":"spec/api/friendica/#get-apifriendicanotifications","text":"Return last 50 Notifications for the current user, ordered by date with unseen item on top.","title":"GET api/friendica/notifications"},{"location":"spec/api/friendica/#parameters_19","text":"none","title":"Parameters"},{"location":"spec/api/friendica/#post-apifriendicanotificationsseen","text":"Set notification as seen.","title":"POST api/friendica/notifications/seen"},{"location":"spec/api/friendica/#parameters_20","text":"id : id of the notification to set seen","title":"Parameters"},{"location":"spec/api/friendica/#return-values_8","text":"If the note is linked to an item, returns an Item . Otherwise, a success status is returned: success (json) | <status>success</status> (xml)","title":"Return values"},{"location":"spec/api/friendica/#get-apifriendicaphoto","text":"Returns a Photo .","title":"GET api/friendica/photo"},{"location":"spec/api/friendica/#parameters_21","text":"photo_id : Resource id of a photo. scale : (optional) scale value of the photo Returns data of a picture with the given resource. If 'scale' isn't provided, returned data include full url to each scale of the photo. If 'scale' is set, returned data include image data base64 encoded. possibile scale value are: 0: original or max size by server settings 1: image with or height at <= 640 2: image with or height at <= 320 3: thumbnail 160x160 4: Profile image at 300x300 5: Profile image at 80x80 6: Profile image at 48x48 An image used as profile image has only scaled 4-6, other images only 0-3","title":"Parameters"},{"location":"spec/api/friendica/#return-values_9","text":"json: { \"id\" : \"photo id\" , \"created\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"edited\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"title\" : \"photo title\" , \"desc\" : \"photo description\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"mime type\" , \"height\" : \"number\" , \"width\" : \"number\" , \"profile\" : \"1 if is profile photo\" , \"link\" : { \"<scale>\" : \"url to image\" , ... }, // if 'scale' is set \"datasize\" : \"size in byte\" , \"data\" : \"base64 encoded image data\" } xml: <photo> <id> photo id </id> <created> date(YYYY-MM-DD HH:MM:SS) </created> <edited> date(YYYY-MM-DD HH:MM:SS) </edited> <title> photo title </title> <desc> photo description </desc> <album> album name </album> <filename> original file name </filename> <type> mime type </type> <height> number </height> <width> number </width> <profile> 1 if is profile photo </profile> <links type= \"array\" > <link type= \"mime type\" scale= \"scale number\" href= \"image url\" /> ... </links> </photo>","title":"Return values"},{"location":"spec/api/friendica/#get-apifriendicaphotoslist","text":"Returns the API user's Photo List Items .","title":"GET api/friendica/photos/list"},{"location":"spec/api/friendica/#return-values_10","text":"json: [ { \"id\" : \"resource_id\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"image mime type\" , \"thumb\" : \"url to thumb sized image\" }, ... ] xml: <photos type= \"array\" > <photo id= \"resource_id\" album= \"album name\" filename= \"original file name\" type= \"image mime type\" > \"url to thumb sized image\" </photo> ... </photos>","title":"Return values"},{"location":"spec/api/friendica/#post-apifriendicaphotocreate","text":"Alias of api/friendica/photo/update","title":"POST api/friendica/photo/create"},{"location":"spec/api/friendica/#post-apifriendicaphotoupdate","text":"Saves data for the scales 0-2 to database (see above for scale description). Call adds non-public entries to items table to enable authenticated contacts to comment/like the photo. Client should pay attention to the fact that updated access rights are not transferred to the contacts. i.e. public photos remain publicly visible if they have been commented/liked before setting visibility back to a limited group. Currently, it is best to inform user that updating rights is not the right way to do this, and offer a solution to add photo as a new photo with the new rights instead.","title":"POST api/friendica/photo/update"},{"location":"spec/api/friendica/#parameters_22","text":"photo_id (optional): if specified the photo with this id will be updated media (optional): image data as base64, only optional if photo_id is specified (new upload must have media) desc (optional): description for the photo, updated when photo_id is specified album : name of the album to be deleted (always necessary) album_new (optional): can be used to change the album of a single photo if photo_id is specified allow_cid / allow_gid / deny_cid / deny_gid (optional): on create: empty string or omitting = public photo, specify in format <x><y><z> for private photo on update: keys need to be present with empty values for changing a private photo to public","title":"Parameters"},{"location":"spec/api/friendica/#return-values_11","text":"On success: new photo uploaded: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed photo data: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed info: JSON return {\"result\": \"updated\", \"message\":\"Image id 'xyz' has been updated.\"} photo updated - nothing changed: JSON return {\"result\": \"cancelled\",\"message\": \"Nothing to update for image id 'xyz'.\"} On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no media data submitted\", \"photo not available\", \"acl data invalid\" 500 INTERNALSERVERERROR: \"image size exceeds PHP config settings, file was rejected by server\", \"image size exceeds Friendica Config setting (uploaded size: x)\", \"unable to process image data\", \"image upload failed\", \"unknown error - uploading photo failed, see Friendica log for more information\", \"unknown error - update photo entry in database failed\", \"unknown error - this error on uploading or updating a photo should never happen\"","title":"Return values"},{"location":"spec/api/friendica/#post-apifriendicaphotodelete","text":"Deletes a single image with the specified id, is not reversible -> ensure that client is asking user for being sure to do this Sets item table entries for this photo to deleted = 1.","title":"POST api/friendica/photo/delete"},{"location":"spec/api/friendica/#parameters_23","text":"photo_id : id of the photo to be deleted","title":"Parameters"},{"location":"spec/api/friendica/#return-values_12","text":"On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"photo with id 'xyz' has been deleted from server.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no photo_id specified\", \"photo not available\" 500 INTERNALSERVERERROR: \"unknown error on deleting photo\", \"problem with deleting items occurred\"","title":"Return values"},{"location":"spec/api/friendica/#post-apifriendicaphotoalbumdelete","text":"Deletes all images with the specified album name, is not reversible -> ensure that client is asking user for being sure to do this.","title":"POST api/friendica/photoalbum/delete"},{"location":"spec/api/friendica/#parameters_24","text":"album : name of the album to be deleted","title":"Parameters"},{"location":"spec/api/friendica/#return-values_13","text":"On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"album 'xyz' with all containing photos has been deleted.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"problem with deleting item occured\", \"unknown error - deleting from database failed\"","title":"Return values"},{"location":"spec/api/friendica/#post-apifriendicaphotoalbumupdate","text":"Changes the album name to album_new for all photos in album.","title":"POST api/friendica/photoalbum/update"},{"location":"spec/api/friendica/#parameters_25","text":"album : name of the album to be updated album_new : new name of the album","title":"Parameters"},{"location":"spec/api/friendica/#return-values_14","text":"On success: JSON return { \"result\" : \"updated\" , \"message\" : \"album 'abc' with all containing photos has been renamed to 'xyz'.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no new albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"unknown error - updating in database failed\"","title":"Return values"},{"location":"spec/api/friendica/#get-apifriendicaprofileshow","text":"Returns the Profile data of the authenticated user.","title":"GET api/friendica/profile/show"},{"location":"spec/api/friendica/#return-values_15","text":"On success: Array of: global_dir : URL of the global directory set in server settings friendica_owner : user data of the authenticated user profiles : array of the profile data On error: HTTP 403 Forbidden: when no authentication was provided HTTP 400 Bad Request: if given profile_id is not in the database or is not assigned to the authenticated user General description of profile data in API returns: - hide_friends: true if friends are hidden - profile_photo - profile_thumb - publish: true if published on the server's local directory - net_publish: true if published to global_dir - fullname - date_of_birth - description - xmpp - homepage - address - locality - region - postal_code - country - pub_keywords - custom_fields: list of public custom fields","title":"Return values"},{"location":"spec/api/friendica/#deprecated-endpoints","text":"POST api/statuses/mediap","title":"Deprecated endpoints"},{"location":"spec/api/gnu-social/","tags":["specification","api","gnu social"],"text":"GNU Social API # Overview # Friendica provides the following endpoints defined in the official GNU Social Twitter-like API reference . Authentication is the same as described in Using the APIs . Entities # These endpoints use the Friendica API entities . Implemented endpoints # GET api/account/rate_limit_status POST api/account/update_profile_image GET api/account/verify_credentials GET api/direct_messages POST/DELETE api/direct_messages/destroy POST api/direct_messages/new GET api/direct_messages/sent GET api/favorites POST api/favorites/create/:id POST api/favorites/destroy/:id GET api/followers/ids POST api/friendships/destroy GET api/friends/ids GET/POST api/help/test GET api/search GET api/statuses/show/:id POST api/statuses/destroy/:id GET api/statuses/followers GET api/statuses/friends GET api/statuses/friends_timeline GET api/statuses/friends_timeline/:username GET api/statuses/home_timeline GET api/statuses/mentions GET api/statuses/replies GET api/statuses/replies/:username POST api/statuses/retweet/:id GET api/statuses/public_timeline POST api/statuses/update GET api/statuses/user_timeline GET api/users/show Non-implemented endpoints # statuses/retweeted_to_me statuses/retweeted_by_me statuses/retweets_of_me friendships/create friendships/exists friendships/show account/end_session account/update_delivery_device account/update_profile_background_image notifications/follow notifications/leave blocks/create blocks/destroy blocks/exists blocks/blocking oauth/authorize oauth/access_token oauth/request_token statusnet/groups/timeline statusnet/groups/show statusnet/groups/create statusnet/groups/join statusnet/groups/leave statusnet/groups/list statusnet/groups/list_all statusnet/groups/membership statusnet/groups/is_member statusnet/tags/timeline statusnet/media/upload statusnet/config","title":"GNU Social"},{"location":"spec/api/gnu-social/#gnu-social-api","text":"","title":"GNU Social API"},{"location":"spec/api/gnu-social/#overview","text":"Friendica provides the following endpoints defined in the official GNU Social Twitter-like API reference . Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"spec/api/gnu-social/#entities","text":"These endpoints use the Friendica API entities .","title":"Entities"},{"location":"spec/api/gnu-social/#implemented-endpoints","text":"GET api/account/rate_limit_status POST api/account/update_profile_image GET api/account/verify_credentials GET api/direct_messages POST/DELETE api/direct_messages/destroy POST api/direct_messages/new GET api/direct_messages/sent GET api/favorites POST api/favorites/create/:id POST api/favorites/destroy/:id GET api/followers/ids POST api/friendships/destroy GET api/friends/ids GET/POST api/help/test GET api/search GET api/statuses/show/:id POST api/statuses/destroy/:id GET api/statuses/followers GET api/statuses/friends GET api/statuses/friends_timeline GET api/statuses/friends_timeline/:username GET api/statuses/home_timeline GET api/statuses/mentions GET api/statuses/replies GET api/statuses/replies/:username POST api/statuses/retweet/:id GET api/statuses/public_timeline POST api/statuses/update GET api/statuses/user_timeline GET api/users/show","title":"Implemented endpoints"},{"location":"spec/api/gnu-social/#non-implemented-endpoints","text":"statuses/retweeted_to_me statuses/retweeted_by_me statuses/retweets_of_me friendships/create friendships/exists friendships/show account/end_session account/update_delivery_device account/update_profile_background_image notifications/follow notifications/leave blocks/create blocks/destroy blocks/exists blocks/blocking oauth/authorize oauth/access_token oauth/request_token statusnet/groups/timeline statusnet/groups/show statusnet/groups/create statusnet/groups/join statusnet/groups/leave statusnet/groups/list statusnet/groups/list_all statusnet/groups/membership statusnet/groups/is_member statusnet/tags/timeline statusnet/media/upload statusnet/config","title":"Non-implemented endpoints"},{"location":"spec/api/mastodon/","tags":["specification","api","mastodon"],"text":"Mastodon API # Overview # Friendica provides the following endpoints defined in the official Mastodon API reference . Authentication is the same as described in Using the APIs . Clients # Supported apps # For supported apps please have a look at the FAQ Unsupported apps # Android # Fedilab Automatically uses the legacy API, see issue: https://framagit.org/tom79/fedilab/-/issues/520 Mammut There are problems with the token request, see issue https://github.com/jamiesanson/Mammut/issues/19 iOS # Mast Doesn't accept the entered instance name. Claims that it is invalid (Message is: \"Not a valid instance (maybe closed or dead)\") Toot! Entities # These endpoints use the Mastodon API entities . Implemented endpoints # GET /api/v1/accounts/:id POST /api/v1/accounts/:id/block POST /api/v1/accounts/:id/follow GET /api/v1/accounts/:id/followers GET /api/v1/accounts/:id/following GET /api/v1/accounts/:id/lists POST /api/v1/accounts/:id/mute POST /api/v1/accounts/:id/note GET /api/v1/accounts/:id/statuses POST /api/v1/accounts/:id/unfollow POST /api/v1/accounts/:id/unblock POST /api/v1/accounts/:id/unmute GET /api/v1/accounts/relationships GET /api/v1/accounts/search GET /api/v1/accounts/verify_credentials POST /api/v1/apps GET /api/v1/apps/verify_credentials GET /api/v1/blocks GET /api/v1/bookmarks GET /api/v1/conversations DELETE /api/v1/conversations/:id POST /api/v1/conversations/:id/read GET /api/v1/custom_emojis Doesn't return unicode emojis since they aren't using an image URL GET /api/v1/directory GET /api/v1/favourites GET /api/v1/follow_requests Returned IDs are specific to follow requests POST /api/v1/follow_requests/:id/authorize :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/reject :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/ignore Friendica-specific, hides the follow request from the list and prevents the remote contact from retrying. :id is a follow request ID, not a regular account id Returns a Relationship object. GET /api/v1/instance GET /api/v1/instance/rules Undocumented, returns Terms of Service GET /api/v1/instance/peers GET /api/v1/lists POST /api/v1/lists GET /api/v1/lists/:id PUT /api/v1/lists/:id DELETE /api/v1/lists/:id GET /api/v1/lists/:id/accounts POST /api/v1/lists/:id/accounts DELETE /api/v1/lists/:id/accounts POST /api/v1/markers GET /api/v1/markers POST /api/v1/media GET /api/v1/media/:id PUT /api/v1/media/:id GET /api/v1/mutes GET /api/v1/notifications GET /api/v1/notifications/:id POST /api/v1/notifications/clear POST /api/v1/notifications/:id/dismiss GET /api/v1/polls/:id GET /api/v1/preferences DELETE /api/v1/push/subscription GET /api/v1/push/subscription PUSH /api/v1/push/subscription PUT /api/v1/push/subscription GET /api/v1/scheduled_statuses DELETE /api/v1/scheduled_statuses/:id GET /api/v1/scheduled_statuses/:id GET /api/v1/search POST /api/v1/statuses Additionally, to the static values public , unlisted and private , the visibility parameter can contain a numeric value with a group id. GET /api/v1/statuses/:id DELETE /api/v1/statuses/:id GET /api/v1/statuses/:id/card GET /api/v1/statuses/:id/context GET /api/v1/statuses/:id/reblogged_by GET /api/v1/statuses/:id/favourited_by POST /api/v1/statuses/:id/favourite POST /api/v1/statuses/:id/unfavourite POST /api/v1/statuses/:id/reblog POST /api/v1/statuses/:id/unreblog POST /api/v1/statuses/:id/bookmark POST /api/v1/statuses/:id/unbookmark POST /api/v1/statuses/:id/mute POST /api/v1/statuses/:id/unmute POST /api/v1/statuses/:id/pin POST /api/v1/statuses/:id/unpin GET /api/v1/suggestions GET /api/v1/timelines/direct GET /api/v1/timelines/home GET /api/v1/timelines/list/:id GET /api/v1/timelines/public GET /api/v1/timelines/tag/:hashtag GET /api/v1/trends GET /api/v2/search Currently unimplemented endpoints # These endpoints are planned to be implemented somewhere in the future. PATCH /api/v1/accounts/update_credentials POST /api/v1/accounts/:id/remove_from_followers GET /api/v1/accounts/familiar_followers GET /api/v1/accounts/lookup GET /api/v1/trends/links GET /api/v1/trends/statuses GET /api/v1/trends/tags POST /api/v1/polls/:id/votes GET /api/v1/statuses/{id:\\d+}/source GET /api/v1/featured_tags POST /api/v1/featured_tags DELETE /api/v1/featured_tags/:id Dummy endpoints # These endpoints are returning empty data to avoid error messages when using third party clients. They refer to features that don't exist in Friendica yet. GET /api/v1/accounts/:id/identity_proofs GET /api/v1/announcements GET /api/v1/endorsements GET /api/v1/filters Non supportable endpoints # These endpoints won't be implemented at the moment. They refer to features or data that don't exist in Friendica yet. POST /api/meta Misskey API endpoint. POST /api/v1/accounts GET /api/v1/accounts/:id/featured_tags POST /api/v1/accounts/:id/pin POST /api/v1/accounts/:id/unpin GET /api/v1/admin/accounts GET /api/v1/admin/accounts/:id POST /api/v1/admin/accounts/:id/{action} GET /api/v1/admin/reports GET /api/v1/admin/reports/:id POST /api/v1/admin/reports/:id/{action} POST /api/v1/announcements/:id/dismiss PUT /api/v1/announcements/:id/reactions/{name} DELETE /api/v1/announcements/:id/reactions/{name} GET /api/v1/domain_blocks POST /api/v1/domain_blocks DELETE /api/v1/domain_blocks DELETE /api/v1/emails/confirmations GET /api/v1/featured_tags/suggestions GET /api/v1/filters/:id POST /api/v1/filters/:id PUT /api/v1/filters/:id DELETE /api/v1/filters/:id GET /api/v1/instance/activity POST /api/v1/markers POST /api/v1/reports PUT /api/v1/scheduled_statuses/:id GET /api/v1/statuses/{id:\\d+}/history GET /api/v1/streaming DELETE /api/v1/suggestions/:id","title":"Mastodon"},{"location":"spec/api/mastodon/#mastodon-api","text":"","title":"Mastodon API"},{"location":"spec/api/mastodon/#overview","text":"Friendica provides the following endpoints defined in the official Mastodon API reference . Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"spec/api/mastodon/#clients","text":"","title":"Clients"},{"location":"spec/api/mastodon/#supported-apps","text":"For supported apps please have a look at the FAQ","title":"Supported apps"},{"location":"spec/api/mastodon/#unsupported-apps","text":"","title":"Unsupported apps"},{"location":"spec/api/mastodon/#android","text":"Fedilab Automatically uses the legacy API, see issue: https://framagit.org/tom79/fedilab/-/issues/520 Mammut There are problems with the token request, see issue https://github.com/jamiesanson/Mammut/issues/19","title":"Android"},{"location":"spec/api/mastodon/#ios","text":"Mast Doesn't accept the entered instance name. Claims that it is invalid (Message is: \"Not a valid instance (maybe closed or dead)\") Toot!","title":"iOS"},{"location":"spec/api/mastodon/#entities","text":"These endpoints use the Mastodon API entities .","title":"Entities"},{"location":"spec/api/mastodon/#implemented-endpoints","text":"GET /api/v1/accounts/:id POST /api/v1/accounts/:id/block POST /api/v1/accounts/:id/follow GET /api/v1/accounts/:id/followers GET /api/v1/accounts/:id/following GET /api/v1/accounts/:id/lists POST /api/v1/accounts/:id/mute POST /api/v1/accounts/:id/note GET /api/v1/accounts/:id/statuses POST /api/v1/accounts/:id/unfollow POST /api/v1/accounts/:id/unblock POST /api/v1/accounts/:id/unmute GET /api/v1/accounts/relationships GET /api/v1/accounts/search GET /api/v1/accounts/verify_credentials POST /api/v1/apps GET /api/v1/apps/verify_credentials GET /api/v1/blocks GET /api/v1/bookmarks GET /api/v1/conversations DELETE /api/v1/conversations/:id POST /api/v1/conversations/:id/read GET /api/v1/custom_emojis Doesn't return unicode emojis since they aren't using an image URL GET /api/v1/directory GET /api/v1/favourites GET /api/v1/follow_requests Returned IDs are specific to follow requests POST /api/v1/follow_requests/:id/authorize :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/reject :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/ignore Friendica-specific, hides the follow request from the list and prevents the remote contact from retrying. :id is a follow request ID, not a regular account id Returns a Relationship object. GET /api/v1/instance GET /api/v1/instance/rules Undocumented, returns Terms of Service GET /api/v1/instance/peers GET /api/v1/lists POST /api/v1/lists GET /api/v1/lists/:id PUT /api/v1/lists/:id DELETE /api/v1/lists/:id GET /api/v1/lists/:id/accounts POST /api/v1/lists/:id/accounts DELETE /api/v1/lists/:id/accounts POST /api/v1/markers GET /api/v1/markers POST /api/v1/media GET /api/v1/media/:id PUT /api/v1/media/:id GET /api/v1/mutes GET /api/v1/notifications GET /api/v1/notifications/:id POST /api/v1/notifications/clear POST /api/v1/notifications/:id/dismiss GET /api/v1/polls/:id GET /api/v1/preferences DELETE /api/v1/push/subscription GET /api/v1/push/subscription PUSH /api/v1/push/subscription PUT /api/v1/push/subscription GET /api/v1/scheduled_statuses DELETE /api/v1/scheduled_statuses/:id GET /api/v1/scheduled_statuses/:id GET /api/v1/search POST /api/v1/statuses Additionally, to the static values public , unlisted and private , the visibility parameter can contain a numeric value with a group id. GET /api/v1/statuses/:id DELETE /api/v1/statuses/:id GET /api/v1/statuses/:id/card GET /api/v1/statuses/:id/context GET /api/v1/statuses/:id/reblogged_by GET /api/v1/statuses/:id/favourited_by POST /api/v1/statuses/:id/favourite POST /api/v1/statuses/:id/unfavourite POST /api/v1/statuses/:id/reblog POST /api/v1/statuses/:id/unreblog POST /api/v1/statuses/:id/bookmark POST /api/v1/statuses/:id/unbookmark POST /api/v1/statuses/:id/mute POST /api/v1/statuses/:id/unmute POST /api/v1/statuses/:id/pin POST /api/v1/statuses/:id/unpin GET /api/v1/suggestions GET /api/v1/timelines/direct GET /api/v1/timelines/home GET /api/v1/timelines/list/:id GET /api/v1/timelines/public GET /api/v1/timelines/tag/:hashtag GET /api/v1/trends GET /api/v2/search","title":"Implemented endpoints"},{"location":"spec/api/mastodon/#currently-unimplemented-endpoints","text":"These endpoints are planned to be implemented somewhere in the future. PATCH /api/v1/accounts/update_credentials POST /api/v1/accounts/:id/remove_from_followers GET /api/v1/accounts/familiar_followers GET /api/v1/accounts/lookup GET /api/v1/trends/links GET /api/v1/trends/statuses GET /api/v1/trends/tags POST /api/v1/polls/:id/votes GET /api/v1/statuses/{id:\\d+}/source GET /api/v1/featured_tags POST /api/v1/featured_tags DELETE /api/v1/featured_tags/:id","title":"Currently unimplemented endpoints"},{"location":"spec/api/mastodon/#dummy-endpoints","text":"These endpoints are returning empty data to avoid error messages when using third party clients. They refer to features that don't exist in Friendica yet. GET /api/v1/accounts/:id/identity_proofs GET /api/v1/announcements GET /api/v1/endorsements GET /api/v1/filters","title":"Dummy endpoints"},{"location":"spec/api/mastodon/#non-supportable-endpoints","text":"These endpoints won't be implemented at the moment. They refer to features or data that don't exist in Friendica yet. POST /api/meta Misskey API endpoint. POST /api/v1/accounts GET /api/v1/accounts/:id/featured_tags POST /api/v1/accounts/:id/pin POST /api/v1/accounts/:id/unpin GET /api/v1/admin/accounts GET /api/v1/admin/accounts/:id POST /api/v1/admin/accounts/:id/{action} GET /api/v1/admin/reports GET /api/v1/admin/reports/:id POST /api/v1/admin/reports/:id/{action} POST /api/v1/announcements/:id/dismiss PUT /api/v1/announcements/:id/reactions/{name} DELETE /api/v1/announcements/:id/reactions/{name} GET /api/v1/domain_blocks POST /api/v1/domain_blocks DELETE /api/v1/domain_blocks DELETE /api/v1/emails/confirmations GET /api/v1/featured_tags/suggestions GET /api/v1/filters/:id POST /api/v1/filters/:id PUT /api/v1/filters/:id DELETE /api/v1/filters/:id GET /api/v1/instance/activity POST /api/v1/markers POST /api/v1/reports PUT /api/v1/scheduled_statuses/:id GET /api/v1/statuses/{id:\\d+}/history GET /api/v1/streaming DELETE /api/v1/suggestions/:id","title":"Non supportable endpoints"},{"location":"spec/api/twitter/","tags":["specification","api","twitter"],"text":"Twitter API # Overview # Friendica provides the following endpoints defined in the official Twitter API reference . Authentication is the same as described in Using the APIs . Entities # These endpoints use the Friendica API entities . Different behaviour # screen_name : The nickname in Friendica is only unique in each network but not for all networks. The users are searched in the following priority: Friendica, StatusNet/GNU Social, Diaspora, pump.io, Twitter. If no contact was found by this way, then the first contact is taken. include_entities : Default is \"false\". If set to \"true\" then the plain text is formatted so that links are having descriptions. Friendica-specific return values # cid : Contact id of the user (important for \"contact_allow\" and \"contact_deny\") network : network of the user Unsupported parameters # cursor trim_user contributor_details place_id display_coordinates include_rts : To-Do include_my_retweet : Retweets in Friendica are implemented in a different way Implemented endpoints # POST api/oauth/access_token Unsupported parameters: x_auth_password x_auth_username x_auth_mode POST api/oauth/request_token Unsupported parameter: x_auth_access_type GET api/account/verify_credentials Unsupported parameter: include_email POST api/account/update_profile Unsupported parameters: url location profile_link_color include_entities skip_status POST api/account/update_profile_image Additional parameter: profile_id (optional): Numerical id of the profile for which the image should be used, default is changing the default profile. POST api/statuses/update Unsupported parameter: display_coordinates POST api/statuses/update_with_media (deprecated) POST api/media/upload Additional return value: image.friendica_preview_url : image preview url POST api/media/metadata/create GET api/users/show GET api/users/search Unsupported parameters: page count include_entities GET api/users/lookup Unsupported parameters: screen_name include_entities GET api/search/tweets Unsupported parameters: geocode lang locale result_type until include_entities GET api/saved_searches/list GET api/statuses/home_timeline Alias: GET api/statuses/friends_timeline GET api/statuses/user_timeline GET api/statuses/mentions (deprecated) GET api/statuses/show/:id POST api/statuses/retweet/:id POST api/statuses/destroy/:id GET api/statuses/followers (deprecated) Alias: GET api/statuses/friends GET api/favorites (deprecated) Unsupported parameters: user_id : Favorites aren't returned for other users than self screen_name : Favorites aren't returned for other users than self POST api/favorites/create POST api/favorites/destroy GET api/lists/list GET api/lists/ownerships Unsupported parameters: slug owner_screen_name owner_id include_entities GET api/lists/statuses Unsupported parameters: screen_name count GET api/lists/subscriptions POST api/lists/update Unsupported parameters: slug name mode description owner_screen_name owner_id POST api/lists/create Unsupported parameters: mode description POST api/lists/destroy Unsupported parameters: owner_screen_name owner_id slug GET api/blocks/list GET api/friendships/incoming Unsupported parameters stringify_ids GET api/followers/ids GET api/followers/list GET api/friends/ids GET api/friends/list Additional parameters: since_id : You can use the next_cursor value to load the next page. max_id : You can use the inverse of the previous_cursor value to load the previous page. Unsupported parameter: skip_status : No status is returned even if it isn't set to true. Caveats: cursor trumps since_id trumps max_id if any combination is provided. user_id must be the ID of a contact associated with a local user account. screen_name must be associated with a local user account. screen_name trumps user_id if both are provided (undocumented Twitter behavior). Will succeed but return an empty array for users hiding their contact lists. POST api/friendships/destroy Non-implemented endpoints # GET oauth/authenticate GET oauth/authorize POST oauth/invalidate_token POST oauth2/invalidate_token POST oauth2/token GET lists/members GET lists/members/show GET lists/memberships GET lists/show GET lists/subscribers GET lists/subscribers/show POST lists/members/create POST lists/members/create_all POST lists/members/destroy POST lists/members/destroy_all POST lists/subscribers/create POST lists/subscribers/destroy GET friendships/lookup GET friendships/no_retweets/ids GET friendships/outgoing GET friendships/show GET users/suggestions (deprecated) GET users/suggestions/:slug (deprecated) GET users/suggestions/:slug/members (deprecated) POST friendships/create POST friendships/update GET account/settings GET saved_searches/show/:id GET users/profile_banner POST account/remove_profile_banner POST account/settings POST account/update_profile_background_image (deprecated) POST account/update_profile_banner POST saved_searches/create POST saved_searches/destroy/:id GET blocks/ids GET mutes/users/ids GET mutes/users/list POST blocks/create POST blocks/destroy POST mutes/users/create POST mutes/users/destroy POST users/report_spam GET collections/entries GET collections/list GET collections/show POST collections/create POST collections/destroy POST collections/entries/add POST collections/entries/curate POST collections/entries/move POST collections/entries/remove POST collections/update POST statuses/filter GET statuses/mentions_timeline GET favorites/list GET statuses/lookup GET statuses/oembed GET statuses/retweeters/ids GET statuses/retweets/:id GET statuses/retweets_of_me POST statuses/unretweet/:id GET statuses/sample GET compliance/firehose DELETE custom_profiles/destroy.json GET custom_profiles/:id GET custom_profiles/list POST custom_profiles/new.json DELETE direct_messages/events/destroy GET direct_messages/events/list GET direct_messages/events/show POST direct_messages/events/new (message_create) POST direct_messages/indicate_typing POST direct_messages/mark_read DELETE direct_messages/welcome_messages/destroy DELETE direct_messages/welcome_messages/rules/destroy PUT direct_messages/welcome_messages/update GET direct_messages/welcome_messages/list GET direct_messages/welcome_messages/rules/list GET direct_messages/welcome_messages/rules/show GET direct_messages/welcome_messages/show POST direct_messages/welcome_messages/new POST direct_messages/welcome_messages/rules/new GET media/upload (STATUS) POST media/subtitles/create POST media/subtitles/delete POST media/upload (APPEND) POST media/upload (FINALIZE) POST media/upload (INIT) GET trends/available GET trends/closest GET trends/place GET geo/id/:place_id GET geo/reverse_geocode GET geo/search","title":"Twitter"},{"location":"spec/api/twitter/#twitter-api","text":"","title":"Twitter API"},{"location":"spec/api/twitter/#overview","text":"Friendica provides the following endpoints defined in the official Twitter API reference . Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"spec/api/twitter/#entities","text":"These endpoints use the Friendica API entities .","title":"Entities"},{"location":"spec/api/twitter/#different-behaviour","text":"screen_name : The nickname in Friendica is only unique in each network but not for all networks. The users are searched in the following priority: Friendica, StatusNet/GNU Social, Diaspora, pump.io, Twitter. If no contact was found by this way, then the first contact is taken. include_entities : Default is \"false\". If set to \"true\" then the plain text is formatted so that links are having descriptions.","title":"Different behaviour"},{"location":"spec/api/twitter/#friendica-specific-return-values","text":"cid : Contact id of the user (important for \"contact_allow\" and \"contact_deny\") network : network of the user","title":"Friendica-specific return values"},{"location":"spec/api/twitter/#unsupported-parameters","text":"cursor trim_user contributor_details place_id display_coordinates include_rts : To-Do include_my_retweet : Retweets in Friendica are implemented in a different way","title":"Unsupported parameters"},{"location":"spec/api/twitter/#implemented-endpoints","text":"POST api/oauth/access_token Unsupported parameters: x_auth_password x_auth_username x_auth_mode POST api/oauth/request_token Unsupported parameter: x_auth_access_type GET api/account/verify_credentials Unsupported parameter: include_email POST api/account/update_profile Unsupported parameters: url location profile_link_color include_entities skip_status POST api/account/update_profile_image Additional parameter: profile_id (optional): Numerical id of the profile for which the image should be used, default is changing the default profile. POST api/statuses/update Unsupported parameter: display_coordinates POST api/statuses/update_with_media (deprecated) POST api/media/upload Additional return value: image.friendica_preview_url : image preview url POST api/media/metadata/create GET api/users/show GET api/users/search Unsupported parameters: page count include_entities GET api/users/lookup Unsupported parameters: screen_name include_entities GET api/search/tweets Unsupported parameters: geocode lang locale result_type until include_entities GET api/saved_searches/list GET api/statuses/home_timeline Alias: GET api/statuses/friends_timeline GET api/statuses/user_timeline GET api/statuses/mentions (deprecated) GET api/statuses/show/:id POST api/statuses/retweet/:id POST api/statuses/destroy/:id GET api/statuses/followers (deprecated) Alias: GET api/statuses/friends GET api/favorites (deprecated) Unsupported parameters: user_id : Favorites aren't returned for other users than self screen_name : Favorites aren't returned for other users than self POST api/favorites/create POST api/favorites/destroy GET api/lists/list GET api/lists/ownerships Unsupported parameters: slug owner_screen_name owner_id include_entities GET api/lists/statuses Unsupported parameters: screen_name count GET api/lists/subscriptions POST api/lists/update Unsupported parameters: slug name mode description owner_screen_name owner_id POST api/lists/create Unsupported parameters: mode description POST api/lists/destroy Unsupported parameters: owner_screen_name owner_id slug GET api/blocks/list GET api/friendships/incoming Unsupported parameters stringify_ids GET api/followers/ids GET api/followers/list GET api/friends/ids GET api/friends/list Additional parameters: since_id : You can use the next_cursor value to load the next page. max_id : You can use the inverse of the previous_cursor value to load the previous page. Unsupported parameter: skip_status : No status is returned even if it isn't set to true. Caveats: cursor trumps since_id trumps max_id if any combination is provided. user_id must be the ID of a contact associated with a local user account. screen_name must be associated with a local user account. screen_name trumps user_id if both are provided (undocumented Twitter behavior). Will succeed but return an empty array for users hiding their contact lists. POST api/friendships/destroy","title":"Implemented endpoints"},{"location":"spec/api/twitter/#non-implemented-endpoints","text":"GET oauth/authenticate GET oauth/authorize POST oauth/invalidate_token POST oauth2/invalidate_token POST oauth2/token GET lists/members GET lists/members/show GET lists/memberships GET lists/show GET lists/subscribers GET lists/subscribers/show POST lists/members/create POST lists/members/create_all POST lists/members/destroy POST lists/members/destroy_all POST lists/subscribers/create POST lists/subscribers/destroy GET friendships/lookup GET friendships/no_retweets/ids GET friendships/outgoing GET friendships/show GET users/suggestions (deprecated) GET users/suggestions/:slug (deprecated) GET users/suggestions/:slug/members (deprecated) POST friendships/create POST friendships/update GET account/settings GET saved_searches/show/:id GET users/profile_banner POST account/remove_profile_banner POST account/settings POST account/update_profile_background_image (deprecated) POST account/update_profile_banner POST saved_searches/create POST saved_searches/destroy/:id GET blocks/ids GET mutes/users/ids GET mutes/users/list POST blocks/create POST blocks/destroy POST mutes/users/create POST mutes/users/destroy POST users/report_spam GET collections/entries GET collections/list GET collections/show POST collections/create POST collections/destroy POST collections/entries/add POST collections/entries/curate POST collections/entries/move POST collections/entries/remove POST collections/update POST statuses/filter GET statuses/mentions_timeline GET favorites/list GET statuses/lookup GET statuses/oembed GET statuses/retweeters/ids GET statuses/retweets/:id GET statuses/retweets_of_me POST statuses/unretweet/:id GET statuses/sample GET compliance/firehose DELETE custom_profiles/destroy.json GET custom_profiles/:id GET custom_profiles/list POST custom_profiles/new.json DELETE direct_messages/events/destroy GET direct_messages/events/list GET direct_messages/events/show POST direct_messages/events/new (message_create) POST direct_messages/indicate_typing POST direct_messages/mark_read DELETE direct_messages/welcome_messages/destroy DELETE direct_messages/welcome_messages/rules/destroy PUT direct_messages/welcome_messages/update GET direct_messages/welcome_messages/list GET direct_messages/welcome_messages/rules/list GET direct_messages/welcome_messages/rules/show GET direct_messages/welcome_messages/show POST direct_messages/welcome_messages/new POST direct_messages/welcome_messages/rules/new GET media/upload (STATUS) POST media/subtitles/create POST media/subtitles/delete POST media/upload (APPEND) POST media/upload (FINALIZE) POST media/upload (INIT) GET trends/available GET trends/closest GET trends/place GET geo/id/:place_id GET geo/reverse_geocode GET geo/search","title":"Non-implemented endpoints"},{"location":"spec/database/","text":"Database Tables # Table Comment 2fa_app_specific_password Two-factor app-specific _password 2fa_recovery_codes Two-factor authentication recovery codes 2fa_trusted_browser Two-factor authentication trusted browsers addon registered addons apcontact ActivityPub compatible contacts - used in the ActivityPub implementation application-marker Timeline marker application-token OAuth user token application OAuth application attach file attachments cache Stores temporary data config main configuration storage contact-relation Contact relations contact contact table conv private messages conversation Raw data and structure information for messages delayed-post Posts that are about to be distributed at a later time diaspora-interaction Signed Diaspora Interaction endpoint ActivityPub endpoints - used in the ActivityPub implementation event Events fcontact Diaspora compatible contacts - used in the Diaspora implementation fsuggest friend suggestion stuff group privacy groups, group info group_member privacy groups, member info gserver-tag Tags that the server has subscribed gserver Global servers hook addon hook registry inbox-entry-receiver Receiver for the incoming activity inbox-entry Incoming activity inbox-status Status of ActivityPub inboxes intro item-uri URI and GUID for items locks mail private messages mailacct Mail account data for fetching mails manage table of accounts that can manage each other notification notifications notify-threads notify [Deprecated] User notifications oembed cache for OEmbed queries openwebauth-token Store OpenWebAuth token to verify contacts parsed_url cache for 'parse_url' queries pconfig personal (per user) configuration storage permissionset photo photo storage post-category post relation to categories post-collection Collection of posts post-content Content for all posts post-delivery-data Delivery data for items post-delivery Delivery data for posts for the batch processing post-history Post history post-link Post related external links post-media Attached media post-question-option Question option post-question Question post-tag post relation to tags post-thread-user Thread related data per user post-thread Thread related data post-user-notification User post notifications post-user User specific post data post Structure for all posts process Currently running system processes profile user profiles data profile_field Custom profile fields push_subscriber Used for OStatus: Contains feed subscribers register registrations requiring admin approval search session web session storage storage Data stored by Database storage backend subscription Push Subscription for the API tag tags and mentions user-contact User specific public contact data user The local users userd Deleted usernames verb Activity Verbs worker-ipc Inter process communication between the frontend and the worker workerqueue Background tasks queue entries","title":"Database Tables"},{"location":"spec/database/#database-tables","text":"Table Comment 2fa_app_specific_password Two-factor app-specific _password 2fa_recovery_codes Two-factor authentication recovery codes 2fa_trusted_browser Two-factor authentication trusted browsers addon registered addons apcontact ActivityPub compatible contacts - used in the ActivityPub implementation application-marker Timeline marker application-token OAuth user token application OAuth application attach file attachments cache Stores temporary data config main configuration storage contact-relation Contact relations contact contact table conv private messages conversation Raw data and structure information for messages delayed-post Posts that are about to be distributed at a later time diaspora-interaction Signed Diaspora Interaction endpoint ActivityPub endpoints - used in the ActivityPub implementation event Events fcontact Diaspora compatible contacts - used in the Diaspora implementation fsuggest friend suggestion stuff group privacy groups, group info group_member privacy groups, member info gserver-tag Tags that the server has subscribed gserver Global servers hook addon hook registry inbox-entry-receiver Receiver for the incoming activity inbox-entry Incoming activity inbox-status Status of ActivityPub inboxes intro item-uri URI and GUID for items locks mail private messages mailacct Mail account data for fetching mails manage table of accounts that can manage each other notification notifications notify-threads notify [Deprecated] User notifications oembed cache for OEmbed queries openwebauth-token Store OpenWebAuth token to verify contacts parsed_url cache for 'parse_url' queries pconfig personal (per user) configuration storage permissionset photo photo storage post-category post relation to categories post-collection Collection of posts post-content Content for all posts post-delivery-data Delivery data for items post-delivery Delivery data for posts for the batch processing post-history Post history post-link Post related external links post-media Attached media post-question-option Question option post-question Question post-tag post relation to tags post-thread-user Thread related data per user post-thread Thread related data post-user-notification User post notifications post-user User specific post data post Structure for all posts process Currently running system processes profile user profiles data profile_field Custom profile fields push_subscriber Used for OStatus: Contains feed subscribers register registrations requiring admin approval search session web session storage storage Data stored by Database storage backend subscription Push Subscription for the API tag tags and mentions user-contact User specific public contact data user The local users userd Deleted usernames verb Activity Verbs worker-ipc Inter process communication between the frontend and the worker workerqueue Background tasks queue entries","title":"Database Tables"},{"location":"spec/database/db_2fa_app_specific_password/","tags":["database","table","developer"],"text":"Table 2fa_app_specific_password # Two-factor app-specific _password Fields # Field Description Type Null Key Default Extra id Password ID for revocation mediumint unsigned NO PRI NULL auto_increment uid User ID mediumint unsigned NO NULL description Description of the usage of the password varchar(255) YES NULL hashed_password Hashed password varchar(255) NO NULL generated Datetime the password was generated datetime NO NULL last_used Datetime the password was last used datetime YES NULL Indexes # Name Fields PRIMARY id uid_description uid, description(190) Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"2fa_app_specific_password"},{"location":"spec/database/db_2fa_app_specific_password/#table-2fa_app_specific_password","text":"Two-factor app-specific _password","title":"Table 2fa_app_specific_password"},{"location":"spec/database/db_2fa_app_specific_password/#fields","text":"Field Description Type Null Key Default Extra id Password ID for revocation mediumint unsigned NO PRI NULL auto_increment uid User ID mediumint unsigned NO NULL description Description of the usage of the password varchar(255) YES NULL hashed_password Hashed password varchar(255) NO NULL generated Datetime the password was generated datetime NO NULL last_used Datetime the password was last used datetime YES NULL","title":"Fields"},{"location":"spec/database/db_2fa_app_specific_password/#indexes","text":"Name Fields PRIMARY id uid_description uid, description(190)","title":"Indexes"},{"location":"spec/database/db_2fa_app_specific_password/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_2fa_recovery_codes/","tags":["database","table","developer"],"text":"Table 2fa_recovery_codes # Two-factor authentication recovery codes Fields # Field Description Type Null Key Default Extra uid User ID mediumint unsigned NO PRI NULL code Recovery code string varchar(50) NO PRI NULL generated Datetime the code was generated datetime NO NULL used Datetime the code was used datetime YES NULL Indexes # Name Fields PRIMARY uid, code Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"2fa_recovery_codes"},{"location":"spec/database/db_2fa_recovery_codes/#table-2fa_recovery_codes","text":"Two-factor authentication recovery codes","title":"Table 2fa_recovery_codes"},{"location":"spec/database/db_2fa_recovery_codes/#fields","text":"Field Description Type Null Key Default Extra uid User ID mediumint unsigned NO PRI NULL code Recovery code string varchar(50) NO PRI NULL generated Datetime the code was generated datetime NO NULL used Datetime the code was used datetime YES NULL","title":"Fields"},{"location":"spec/database/db_2fa_recovery_codes/#indexes","text":"Name Fields PRIMARY uid, code","title":"Indexes"},{"location":"spec/database/db_2fa_recovery_codes/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_2fa_trusted_browser/","tags":["database","table","developer"],"text":"Table 2fa_trusted_browser # Two-factor authentication trusted browsers Fields # Field Description Type Null Key Default Extra cookie_hash Trusted cookie hash varchar(80) NO PRI NULL uid User ID mediumint unsigned NO NULL user_agent User agent string text YES NULL trusted Whenever this browser should be trusted or not boolean NO 1 created Datetime the trusted browser was recorded datetime NO NULL last_used Datetime the trusted browser was last used datetime YES NULL Indexes # Name Fields PRIMARY cookie_hash uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"2fa_trusted_browser"},{"location":"spec/database/db_2fa_trusted_browser/#table-2fa_trusted_browser","text":"Two-factor authentication trusted browsers","title":"Table 2fa_trusted_browser"},{"location":"spec/database/db_2fa_trusted_browser/#fields","text":"Field Description Type Null Key Default Extra cookie_hash Trusted cookie hash varchar(80) NO PRI NULL uid User ID mediumint unsigned NO NULL user_agent User agent string text YES NULL trusted Whenever this browser should be trusted or not boolean NO 1 created Datetime the trusted browser was recorded datetime NO NULL last_used Datetime the trusted browser was last used datetime YES NULL","title":"Fields"},{"location":"spec/database/db_2fa_trusted_browser/#indexes","text":"Name Fields PRIMARY cookie_hash uid uid","title":"Indexes"},{"location":"spec/database/db_2fa_trusted_browser/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_addon/","tags":["database","table","developer"],"text":"Table addon # registered addons Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name addon base (file)name varchar(50) NO version currently unused varchar(50) NO installed currently always 1 boolean NO 0 hidden currently unused boolean NO 0 timestamp file timestamp to check for reloads int unsigned NO 0 plugin_admin 1 = has admin config, 0 = has no admin config boolean NO 0 Indexes # Name Fields PRIMARY id installed_name installed, name name UNIQUE, name Return to database documentation","title":"addon"},{"location":"spec/database/db_addon/#table-addon","text":"registered addons","title":"Table addon"},{"location":"spec/database/db_addon/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name addon base (file)name varchar(50) NO version currently unused varchar(50) NO installed currently always 1 boolean NO 0 hidden currently unused boolean NO 0 timestamp file timestamp to check for reloads int unsigned NO 0 plugin_admin 1 = has admin config, 0 = has no admin config boolean NO 0","title":"Fields"},{"location":"spec/database/db_addon/#indexes","text":"Name Fields PRIMARY id installed_name installed, name name UNIQUE, name Return to database documentation","title":"Indexes"},{"location":"spec/database/db_apcontact/","tags":["database","table","developer"],"text":"Table apcontact # ActivityPub compatible contacts - used in the ActivityPub implementation Fields # Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL uuid varchar(255) YES NULL type varchar(20) NO NULL following varchar(255) YES NULL followers varchar(255) YES NULL inbox varchar(255) NO NULL outbox varchar(255) YES NULL sharedinbox varchar(255) YES NULL featured Address for the collection of featured posts varchar(255) YES NULL featured-tags Address for the collection of featured tags varchar(255) YES NULL manually-approve boolean YES NULL discoverable Mastodon extension: true if profile is published in their directory boolean YES NULL nick varchar(255) NO name varchar(255) YES NULL about text YES NULL xmpp XMPP address varchar(255) YES NULL matrix Matrix address varchar(255) YES NULL photo varchar(255) YES NULL header Header picture varchar(255) YES NULL addr varchar(255) YES NULL alias varchar(255) YES NULL pubkey text YES NULL subscribe varchar(255) YES NULL baseurl baseurl of the ap contact varchar(255) YES NULL gsid Global Server ID int unsigned YES NULL generator Name of the contact's system varchar(255) YES NULL following_count Number of following contacts int unsigned YES 0 followers_count Number of followers int unsigned YES 0 statuses_count Number of posts int unsigned YES 0 updated datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY url addr addr(32) alias alias(190) followers followers(190) baseurl baseurl(190) sharedinbox sharedinbox(190) gsid gsid uri-id UNIQUE, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id gsid gserver id Return to database documentation","title":"apcontact"},{"location":"spec/database/db_apcontact/#table-apcontact","text":"ActivityPub compatible contacts - used in the ActivityPub implementation","title":"Table apcontact"},{"location":"spec/database/db_apcontact/#fields","text":"Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL uuid varchar(255) YES NULL type varchar(20) NO NULL following varchar(255) YES NULL followers varchar(255) YES NULL inbox varchar(255) NO NULL outbox varchar(255) YES NULL sharedinbox varchar(255) YES NULL featured Address for the collection of featured posts varchar(255) YES NULL featured-tags Address for the collection of featured tags varchar(255) YES NULL manually-approve boolean YES NULL discoverable Mastodon extension: true if profile is published in their directory boolean YES NULL nick varchar(255) NO name varchar(255) YES NULL about text YES NULL xmpp XMPP address varchar(255) YES NULL matrix Matrix address varchar(255) YES NULL photo varchar(255) YES NULL header Header picture varchar(255) YES NULL addr varchar(255) YES NULL alias varchar(255) YES NULL pubkey text YES NULL subscribe varchar(255) YES NULL baseurl baseurl of the ap contact varchar(255) YES NULL gsid Global Server ID int unsigned YES NULL generator Name of the contact's system varchar(255) YES NULL following_count Number of following contacts int unsigned YES 0 followers_count Number of followers int unsigned YES 0 statuses_count Number of posts int unsigned YES 0 updated datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_apcontact/#indexes","text":"Name Fields PRIMARY url addr addr(32) alias alias(190) followers followers(190) baseurl baseurl(190) sharedinbox sharedinbox(190) gsid gsid uri-id UNIQUE, uri-id","title":"Indexes"},{"location":"spec/database/db_apcontact/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id gsid gserver id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_application-marker/","tags":["database","table","developer"],"text":"Table application-marker # Timeline marker Fields # Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL timeline Marker (home, notifications) varchar(64) NO PRI NULL last_read_id Marker id for the timeline varchar(255) YES NULL version Version number smallint unsigned YES NULL updated_at creation time datetime YES NULL Indexes # Name Fields PRIMARY application-id, uid, timeline uid_id uid Foreign Keys # Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"application-marker"},{"location":"spec/database/db_application-marker/#table-application-marker","text":"Timeline marker","title":"Table application-marker"},{"location":"spec/database/db_application-marker/#fields","text":"Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL timeline Marker (home, notifications) varchar(64) NO PRI NULL last_read_id Marker id for the timeline varchar(255) YES NULL version Version number smallint unsigned YES NULL updated_at creation time datetime YES NULL","title":"Fields"},{"location":"spec/database/db_application-marker/#indexes","text":"Name Fields PRIMARY application-id, uid, timeline uid_id uid","title":"Indexes"},{"location":"spec/database/db_application-marker/#foreign-keys","text":"Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_application-token/","tags":["database","table","developer"],"text":"Table application-token # OAuth user token Fields # Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL code varchar(64) NO NULL access_token varchar(64) NO NULL created_at creation time datetime NO NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL Indexes # Name Fields PRIMARY application-id, uid uid_id uid, application-id Foreign Keys # Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"application-token"},{"location":"spec/database/db_application-token/#table-application-token","text":"OAuth user token","title":"Table application-token"},{"location":"spec/database/db_application-token/#fields","text":"Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL code varchar(64) NO NULL access_token varchar(64) NO NULL created_at creation time datetime NO NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL","title":"Fields"},{"location":"spec/database/db_application-token/#indexes","text":"Name Fields PRIMARY application-id, uid uid_id uid, application-id","title":"Indexes"},{"location":"spec/database/db_application-token/#foreign-keys","text":"Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_application/","tags":["database","table","developer"],"text":"Table application # OAuth application Fields # Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment client_id varchar(64) NO NULL client_secret varchar(64) NO NULL name varchar(255) NO NULL redirect_uri varchar(255) NO NULL website varchar(255) YES NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL Indexes # Name Fields PRIMARY id client_id UNIQUE, client_id Return to database documentation","title":"application"},{"location":"spec/database/db_application/#table-application","text":"OAuth application","title":"Table application"},{"location":"spec/database/db_application/#fields","text":"Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment client_id varchar(64) NO NULL client_secret varchar(64) NO NULL name varchar(255) NO NULL redirect_uri varchar(255) NO NULL website varchar(255) YES NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL","title":"Fields"},{"location":"spec/database/db_application/#indexes","text":"Name Fields PRIMARY id client_id UNIQUE, client_id Return to database documentation","title":"Indexes"},{"location":"spec/database/db_attach/","tags":["database","table","developer"],"text":"Table attach # file attachments Fields # Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 hash hash varchar(64) NO filename filename of original varchar(255) NO filetype mimetype varchar(64) NO filesize size in bytes int unsigned NO 0 data file data longblob NO NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 allow_cid Access Control - list of allowed contact.id '<19><78> mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"attach"},{"location":"spec/database/db_attach/#table-attach","text":"file attachments","title":"Table attach"},{"location":"spec/database/db_attach/#fields","text":"Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 hash hash varchar(64) NO filename filename of original varchar(255) NO filetype mimetype varchar(64) NO filesize size in bytes int unsigned NO 0 data file data longblob NO NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 allow_cid Access Control - list of allowed contact.id '<19><78> mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL","title":"Fields"},{"location":"spec/database/db_attach/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"spec/database/db_attach/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_cache/","tags":["database","table","developer"],"text":"Table cache # Stores temporary data Fields # Field Description Type Null Key Default Extra k cache key varbinary(255) NO PRI NULL v cached serialized value mediumtext YES NULL expires datetime of cache expiration datetime NO 0001-01-01 00:00:00 updated datetime of cache insertion datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY k k_expires k, expires Return to database documentation","title":"cache"},{"location":"spec/database/db_cache/#table-cache","text":"Stores temporary data","title":"Table cache"},{"location":"spec/database/db_cache/#fields","text":"Field Description Type Null Key Default Extra k cache key varbinary(255) NO PRI NULL v cached serialized value mediumtext YES NULL expires datetime of cache expiration datetime NO 0001-01-01 00:00:00 updated datetime of cache insertion datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_cache/#indexes","text":"Name Fields PRIMARY k k_expires k, expires Return to database documentation","title":"Indexes"},{"location":"spec/database/db_config/","tags":["database","table","developer"],"text":"Table config # main configuration storage Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment cat varbinary(50) NO k varbinary(50) NO v mediumtext YES NULL Indexes # Name Fields PRIMARY id cat_k UNIQUE, cat, k Return to database documentation","title":"config"},{"location":"spec/database/db_config/#table-config","text":"main configuration storage","title":"Table config"},{"location":"spec/database/db_config/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment cat varbinary(50) NO k varbinary(50) NO v mediumtext YES NULL","title":"Fields"},{"location":"spec/database/db_config/#indexes","text":"Name Fields PRIMARY id cat_k UNIQUE, cat, k Return to database documentation","title":"Indexes"},{"location":"spec/database/db_contact-relation/","tags":["database","table","developer"],"text":"Table contact-relation # Contact relations Fields # Field Description Type Null Key Default Extra cid contact the related contact had interacted with int unsigned NO PRI 0 relation-cid related contact who had interacted with the contact int unsigned NO PRI 0 last-interaction Date of the last interaction datetime NO 0001-01-01 00:00:00 follow-updated Date of the last update of the contact relationship datetime NO 0001-01-01 00:00:00 follows boolean NO 0 Indexes # Name Fields PRIMARY cid, relation-cid relation-cid relation-cid Foreign Keys # Field Target Table Target Field cid contact id relation-cid contact id Return to database documentation","title":"contact-relation"},{"location":"spec/database/db_contact-relation/#table-contact-relation","text":"Contact relations","title":"Table contact-relation"},{"location":"spec/database/db_contact-relation/#fields","text":"Field Description Type Null Key Default Extra cid contact the related contact had interacted with int unsigned NO PRI 0 relation-cid related contact who had interacted with the contact int unsigned NO PRI 0 last-interaction Date of the last interaction datetime NO 0001-01-01 00:00:00 follow-updated Date of the last update of the contact relationship datetime NO 0001-01-01 00:00:00 follows boolean NO 0","title":"Fields"},{"location":"spec/database/db_contact-relation/#indexes","text":"Name Fields PRIMARY cid, relation-cid relation-cid relation-cid","title":"Indexes"},{"location":"spec/database/db_contact-relation/#foreign-keys","text":"Field Target Table Target Field cid contact id relation-cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_contact/","tags":["database","table","developer"],"text":"Table contact # contact table Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 created datetime NO 0001-01-01 00:00:00 updated Date of last contact update datetime YES 0001-01-01 00:00:00 network Network of the contact char(4) NO name Name that this contact is known by varchar(255) NO nick Nick- and user name of the contact varchar(255) NO location varchar(255) YES about text YES NULL keywords public keywords (interests) of the contact text YES NULL xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO avatar varchar(255) NO header Header picture varchar(255) YES NULL url varchar(255) NO nurl varchar(255) NO uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL addr varchar(255) NO alias varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL batch varchar(255) NO notify varchar(255) YES NULL poll varchar(255) YES NULL subscribe varchar(255) YES NULL last-update Date of the last try to update the contact info datetime NO 0001-01-01 00:00:00 success_update Date of the last successful contact update datetime NO 0001-01-01 00:00:00 failure_update Date of the last failed update datetime NO 0001-01-01 00:00:00 failed Connection failed boolean YES NULL term-date datetime NO 0001-01-01 00:00:00 last-item date of the last post datetime NO 0001-01-01 00:00:00 last-discovery date of the last follower discovery datetime NO 0001-01-01 00:00:00 blocked Node-wide block status boolean NO 1 block_reason Node-wide block reason text YES NULL readonly posts of the contact are readonly boolean NO 0 contact-type Person, organisation, news, community, relay tinyint NO 0 manually-approve Contact requests have to be approved manually boolean YES NULL archive boolean NO 0 unsearchable Contact prefers to not be searchable boolean NO 0 sensitive Contact posts sensitive content boolean NO 0 baseurl baseurl of the contact varchar(255) YES gsid Global Server ID int unsigned YES NULL bd date NO 0001-01-01 reason text YES NULL self 1 if the contact is the user him/her self boolean NO 0 remote_self boolean NO 0 rel The kind of the relation between the user and the contact tinyint unsigned NO 0 protocol Protocol of the contact char(4) NO subhub boolean NO 0 hub-verify varchar(255) NO rating Automatically detected feed poll frequency tinyint NO 0 priority Feed poll priority tinyint unsigned NO 0 attag varchar(255) NO hidden boolean NO 0 pending Contact request is pending boolean NO 1 deleted Contact has been deleted boolean NO 0 info mediumtext YES NULL notify_new_posts boolean NO 0 fetch_further_information tinyint unsigned NO 0 ffi_keyword_denylist text YES NULL photo Link to the profile photo of the contact varchar(255) YES thumb Link to the profile photo (thumb size) varchar(255) YES micro Link to the profile photo (micro size) varchar(255) YES name-date datetime NO 0001-01-01 00:00:00 uri-date datetime NO 0001-01-01 00:00:00 avatar-date datetime NO 0001-01-01 00:00:00 request varchar(255) YES NULL confirm varchar(255) YES NULL poco varchar(255) YES NULL writable boolean NO 0 forum contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead boolean NO 0 prv contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead boolean NO 0 bdyear varchar(4) NO site-pubkey Deprecated text YES NULL gender Deprecated varchar(32) NO duplex Deprecated boolean NO 0 issued-id Deprecated varchar(255) NO dfrn-id Deprecated varchar(255) NO aes_allow Deprecated boolean NO 0 ret-aes Deprecated boolean NO 0 usehub Deprecated boolean NO 0 closeness Deprecated tinyint unsigned NO 99 profile-id Deprecated int unsigned YES NULL Indexes # Name Fields PRIMARY id uid_name uid, name(190) self_uid self, uid alias_uid alias(128), uid pending_uid pending, uid blocked_uid blocked, uid uid_rel_network_poll uid, rel, network, poll(64), archive uid_network_batch uid, network, batch(64) batch_contact-type batch(64), contact-type addr_uid addr(128), uid nurl_uid nurl(128), uid nick_uid nick(128), uid attag_uid attag(96), uid network_uid_lastupdate network, uid, last-update uid_network_self_lastupdate uid, network, self, last-update uid_lastitem uid, last-item baseurl baseurl(64) uid_contact-type uid, contact-type uid_self_contact-type uid, self, contact-type self_network_uid self, network, uid gsid gsid uri-id uri-id Foreign Keys # Field Target Table Target Field uid user uid uri-id item-uri id gsid gserver id Return to database documentation","title":"contact"},{"location":"spec/database/db_contact/#table-contact","text":"contact table","title":"Table contact"},{"location":"spec/database/db_contact/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 created datetime NO 0001-01-01 00:00:00 updated Date of last contact update datetime YES 0001-01-01 00:00:00 network Network of the contact char(4) NO name Name that this contact is known by varchar(255) NO nick Nick- and user name of the contact varchar(255) NO location varchar(255) YES about text YES NULL keywords public keywords (interests) of the contact text YES NULL xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO avatar varchar(255) NO header Header picture varchar(255) YES NULL url varchar(255) NO nurl varchar(255) NO uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL addr varchar(255) NO alias varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL batch varchar(255) NO notify varchar(255) YES NULL poll varchar(255) YES NULL subscribe varchar(255) YES NULL last-update Date of the last try to update the contact info datetime NO 0001-01-01 00:00:00 success_update Date of the last successful contact update datetime NO 0001-01-01 00:00:00 failure_update Date of the last failed update datetime NO 0001-01-01 00:00:00 failed Connection failed boolean YES NULL term-date datetime NO 0001-01-01 00:00:00 last-item date of the last post datetime NO 0001-01-01 00:00:00 last-discovery date of the last follower discovery datetime NO 0001-01-01 00:00:00 blocked Node-wide block status boolean NO 1 block_reason Node-wide block reason text YES NULL readonly posts of the contact are readonly boolean NO 0 contact-type Person, organisation, news, community, relay tinyint NO 0 manually-approve Contact requests have to be approved manually boolean YES NULL archive boolean NO 0 unsearchable Contact prefers to not be searchable boolean NO 0 sensitive Contact posts sensitive content boolean NO 0 baseurl baseurl of the contact varchar(255) YES gsid Global Server ID int unsigned YES NULL bd date NO 0001-01-01 reason text YES NULL self 1 if the contact is the user him/her self boolean NO 0 remote_self boolean NO 0 rel The kind of the relation between the user and the contact tinyint unsigned NO 0 protocol Protocol of the contact char(4) NO subhub boolean NO 0 hub-verify varchar(255) NO rating Automatically detected feed poll frequency tinyint NO 0 priority Feed poll priority tinyint unsigned NO 0 attag varchar(255) NO hidden boolean NO 0 pending Contact request is pending boolean NO 1 deleted Contact has been deleted boolean NO 0 info mediumtext YES NULL notify_new_posts boolean NO 0 fetch_further_information tinyint unsigned NO 0 ffi_keyword_denylist text YES NULL photo Link to the profile photo of the contact varchar(255) YES thumb Link to the profile photo (thumb size) varchar(255) YES micro Link to the profile photo (micro size) varchar(255) YES name-date datetime NO 0001-01-01 00:00:00 uri-date datetime NO 0001-01-01 00:00:00 avatar-date datetime NO 0001-01-01 00:00:00 request varchar(255) YES NULL confirm varchar(255) YES NULL poco varchar(255) YES NULL writable boolean NO 0 forum contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead boolean NO 0 prv contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead boolean NO 0 bdyear varchar(4) NO site-pubkey Deprecated text YES NULL gender Deprecated varchar(32) NO duplex Deprecated boolean NO 0 issued-id Deprecated varchar(255) NO dfrn-id Deprecated varchar(255) NO aes_allow Deprecated boolean NO 0 ret-aes Deprecated boolean NO 0 usehub Deprecated boolean NO 0 closeness Deprecated tinyint unsigned NO 99 profile-id Deprecated int unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_contact/#indexes","text":"Name Fields PRIMARY id uid_name uid, name(190) self_uid self, uid alias_uid alias(128), uid pending_uid pending, uid blocked_uid blocked, uid uid_rel_network_poll uid, rel, network, poll(64), archive uid_network_batch uid, network, batch(64) batch_contact-type batch(64), contact-type addr_uid addr(128), uid nurl_uid nurl(128), uid nick_uid nick(128), uid attag_uid attag(96), uid network_uid_lastupdate network, uid, last-update uid_network_self_lastupdate uid, network, self, last-update uid_lastitem uid, last-item baseurl baseurl(64) uid_contact-type uid, contact-type uid_self_contact-type uid, self, contact-type self_network_uid self, network, uid gsid gsid uri-id uri-id","title":"Indexes"},{"location":"spec/database/db_contact/#foreign-keys","text":"Field Target Table Target Field uid user uid uri-id item-uri id gsid gserver id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_conv/","tags":["database","table","developer"],"text":"Table conv # private messages Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid A unique identifier for this conversation varchar(255) NO recips sender_handle;recipient_handle text YES NULL uid Owner User id mediumint unsigned NO 0 creator handle of creator varchar(255) NO created creation timestamp datetime NO 0001-01-01 00:00:00 updated edited timestamp datetime NO 0001-01-01 00:00:00 subject subject of initial message text YES NULL Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"conv"},{"location":"spec/database/db_conv/#table-conv","text":"private messages","title":"Table conv"},{"location":"spec/database/db_conv/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid A unique identifier for this conversation varchar(255) NO recips sender_handle;recipient_handle text YES NULL uid Owner User id mediumint unsigned NO 0 creator handle of creator varchar(255) NO created creation timestamp datetime NO 0001-01-01 00:00:00 updated edited timestamp datetime NO 0001-01-01 00:00:00 subject subject of initial message text YES NULL","title":"Fields"},{"location":"spec/database/db_conv/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"spec/database/db_conv/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_conversation/","tags":["database","table","developer"],"text":"Table conversation # Raw data and structure information for messages Fields # Field Description Type Null Key Default Extra item-uri Original URI of the item - unrelated to the table with the same name varbinary(255) NO PRI NULL reply-to-uri URI to which this item is a reply varbinary(255) NO conversation-uri GNU Social conversation URI varbinary(255) NO conversation-href GNU Social conversation link varbinary(255) NO protocol The protocol of the item tinyint unsigned NO 255 direction How the message arrived here: 1=push, 2=pull tinyint unsigned NO 0 source Original source mediumtext YES NULL received Receiving date datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY item-uri conversation-uri conversation-uri received received Return to database documentation","title":"conversation"},{"location":"spec/database/db_conversation/#table-conversation","text":"Raw data and structure information for messages","title":"Table conversation"},{"location":"spec/database/db_conversation/#fields","text":"Field Description Type Null Key Default Extra item-uri Original URI of the item - unrelated to the table with the same name varbinary(255) NO PRI NULL reply-to-uri URI to which this item is a reply varbinary(255) NO conversation-uri GNU Social conversation URI varbinary(255) NO conversation-href GNU Social conversation link varbinary(255) NO protocol The protocol of the item tinyint unsigned NO 255 direction How the message arrived here: 1=push, 2=pull tinyint unsigned NO 0 source Original source mediumtext YES NULL received Receiving date datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_conversation/#indexes","text":"Name Fields PRIMARY item-uri conversation-uri conversation-uri received received Return to database documentation","title":"Indexes"},{"location":"spec/database/db_delayed-post/","tags":["database","table","developer"],"text":"Table delayed-post # Posts that are about to be distributed at a later time Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of the post that will be distributed later varchar(255) YES NULL uid Owner User id mediumint unsigned YES NULL delayed delay time datetime YES NULL wid Workerqueue id int unsigned YES NULL Indexes # Name Fields PRIMARY id uid_uri UNIQUE, uid, uri(190) wid wid Foreign Keys # Field Target Table Target Field uid user uid wid workerqueue id Return to database documentation","title":"delayed-post"},{"location":"spec/database/db_delayed-post/#table-delayed-post","text":"Posts that are about to be distributed at a later time","title":"Table delayed-post"},{"location":"spec/database/db_delayed-post/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of the post that will be distributed later varchar(255) YES NULL uid Owner User id mediumint unsigned YES NULL delayed delay time datetime YES NULL wid Workerqueue id int unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_delayed-post/#indexes","text":"Name Fields PRIMARY id uid_uri UNIQUE, uid, uri(190) wid wid","title":"Indexes"},{"location":"spec/database/db_delayed-post/#foreign-keys","text":"Field Target Table Target Field uid user uid wid workerqueue id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_diaspora-interaction/","tags":["database","table","developer"],"text":"Table diaspora-interaction # Signed Diaspora Interaction Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL interaction The Diaspora interaction mediumtext YES NULL Indexes # Name Fields PRIMARY uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"diaspora-interaction"},{"location":"spec/database/db_diaspora-interaction/#table-diaspora-interaction","text":"Signed Diaspora Interaction","title":"Table diaspora-interaction"},{"location":"spec/database/db_diaspora-interaction/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL interaction The Diaspora interaction mediumtext YES NULL","title":"Fields"},{"location":"spec/database/db_diaspora-interaction/#indexes","text":"Name Fields PRIMARY uri-id","title":"Indexes"},{"location":"spec/database/db_diaspora-interaction/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_endpoint/","tags":["database","table","developer"],"text":"Table endpoint # ActivityPub endpoints - used in the ActivityPub implementation Fields # Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL type varchar(20) NO NULL owner-uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL Indexes # Name Fields PRIMARY url owner-uri-id_type UNIQUE, owner-uri-id, type Foreign Keys # Field Target Table Target Field owner-uri-id item-uri id Return to database documentation","title":"endpoint"},{"location":"spec/database/db_endpoint/#table-endpoint","text":"ActivityPub endpoints - used in the ActivityPub implementation","title":"Table endpoint"},{"location":"spec/database/db_endpoint/#fields","text":"Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL type varchar(20) NO NULL owner-uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_endpoint/#indexes","text":"Name Fields PRIMARY url owner-uri-id_type UNIQUE, owner-uri-id, type","title":"Indexes"},{"location":"spec/database/db_endpoint/#foreign-keys","text":"Field Target Table Target Field owner-uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_event/","tags":["database","table","developer"],"text":"Table event # Events Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid varchar(255) NO uid Owner User id mediumint unsigned NO 0 cid contact_id (ID of the contact in contact table) int unsigned NO 0 uri varchar(255) NO uri-id Id of the item-uri table entry that contains the event uri int unsigned YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 start event start time datetime NO 0001-01-01 00:00:00 finish event end time datetime NO 0001-01-01 00:00:00 summary short description or title of the event text YES NULL desc event description text YES NULL location event location text YES NULL type event or birthday varchar(20) NO nofinish if event does have no end this is 1 boolean NO 0 ignore 0 or 1 boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL Indexes # Name Fields PRIMARY id uid_start uid, start cid cid uri-id uri-id Foreign Keys # Field Target Table Target Field uid user uid cid contact id uri-id item-uri id Return to database documentation","title":"event"},{"location":"spec/database/db_event/#table-event","text":"Events","title":"Table event"},{"location":"spec/database/db_event/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid varchar(255) NO uid Owner User id mediumint unsigned NO 0 cid contact_id (ID of the contact in contact table) int unsigned NO 0 uri varchar(255) NO uri-id Id of the item-uri table entry that contains the event uri int unsigned YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 start event start time datetime NO 0001-01-01 00:00:00 finish event end time datetime NO 0001-01-01 00:00:00 summary short description or title of the event text YES NULL desc event description text YES NULL location event location text YES NULL type event or birthday varchar(20) NO nofinish if event does have no end this is 1 boolean NO 0 ignore 0 or 1 boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL","title":"Fields"},{"location":"spec/database/db_event/#indexes","text":"Name Fields PRIMARY id uid_start uid, start cid cid uri-id uri-id","title":"Indexes"},{"location":"spec/database/db_event/#foreign-keys","text":"Field Target Table Target Field uid user uid cid contact id uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_fcontact/","tags":["database","table","developer"],"text":"Table fcontact # Diaspora compatible contacts - used in the Diaspora implementation Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid unique id varchar(255) NO url varchar(255) NO uri-id Id of the item-uri table entry that contains the fcontact url int unsigned YES NULL name varchar(255) NO photo varchar(255) NO request varchar(255) NO nick varchar(255) NO addr varchar(255) NO batch varchar(255) NO notify varchar(255) NO poll varchar(255) NO confirm varchar(255) NO priority tinyint unsigned NO 0 network char(4) NO alias varchar(255) NO pubkey text YES NULL updated datetime NO 0001-01-01 00:00:00 interacting_count Number of contacts this contact interactes with int unsigned YES 0 interacted_count Number of contacts that interacted with this contact int unsigned YES 0 post_count Number of posts and comments int unsigned YES 0 Indexes # Name Fields PRIMARY id addr addr(32) url UNIQUE, url(190) uri-id UNIQUE, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"fcontact"},{"location":"spec/database/db_fcontact/#table-fcontact","text":"Diaspora compatible contacts - used in the Diaspora implementation","title":"Table fcontact"},{"location":"spec/database/db_fcontact/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid unique id varchar(255) NO url varchar(255) NO uri-id Id of the item-uri table entry that contains the fcontact url int unsigned YES NULL name varchar(255) NO photo varchar(255) NO request varchar(255) NO nick varchar(255) NO addr varchar(255) NO batch varchar(255) NO notify varchar(255) NO poll varchar(255) NO confirm varchar(255) NO priority tinyint unsigned NO 0 network char(4) NO alias varchar(255) NO pubkey text YES NULL updated datetime NO 0001-01-01 00:00:00 interacting_count Number of contacts this contact interactes with int unsigned YES 0 interacted_count Number of contacts that interacted with this contact int unsigned YES 0 post_count Number of posts and comments int unsigned YES 0","title":"Fields"},{"location":"spec/database/db_fcontact/#indexes","text":"Name Fields PRIMARY id addr addr(32) url UNIQUE, url(190) uri-id UNIQUE, uri-id","title":"Indexes"},{"location":"spec/database/db_fcontact/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_fsuggest/","tags":["database","table","developer"],"text":"Table fsuggest # friend suggestion stuff Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cid int unsigned NO 0 name varchar(255) NO url varchar(255) NO request varchar(255) NO photo varchar(255) NO note text YES NULL created datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id cid cid uid uid Foreign Keys # Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"fsuggest"},{"location":"spec/database/db_fsuggest/#table-fsuggest","text":"friend suggestion stuff","title":"Table fsuggest"},{"location":"spec/database/db_fsuggest/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cid int unsigned NO 0 name varchar(255) NO url varchar(255) NO request varchar(255) NO photo varchar(255) NO note text YES NULL created datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_fsuggest/#indexes","text":"Name Fields PRIMARY id cid cid uid uid","title":"Indexes"},{"location":"spec/database/db_fsuggest/#foreign-keys","text":"Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_group/","tags":["database","table","developer"],"text":"Table group # privacy groups, group info Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 visible 1 indicates the member list is not private boolean NO 0 deleted 1 indicates the group has been deleted boolean NO 0 cid Contact id of forum. When this field is filled then the members are synced automatically. int unsigned YES NULL name human readable name of group varchar(255) NO Indexes # Name Fields PRIMARY id uid uid cid cid Foreign Keys # Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"group"},{"location":"spec/database/db_group/#table-group","text":"privacy groups, group info","title":"Table group"},{"location":"spec/database/db_group/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 visible 1 indicates the member list is not private boolean NO 0 deleted 1 indicates the group has been deleted boolean NO 0 cid Contact id of forum. When this field is filled then the members are synced automatically. int unsigned YES NULL name human readable name of group varchar(255) NO","title":"Fields"},{"location":"spec/database/db_group/#indexes","text":"Name Fields PRIMARY id uid uid cid cid","title":"Indexes"},{"location":"spec/database/db_group/#foreign-keys","text":"Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_group_member/","tags":["database","table","developer"],"text":"Table group_member # privacy groups, member info Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment gid groups.id of the associated group int unsigned NO 0 contact-id contact.id of the member assigned to the associated group int unsigned NO 0 Indexes # Name Fields PRIMARY id contactid contact-id gid_contactid UNIQUE, gid, contact-id Foreign Keys # Field Target Table Target Field gid group id contact-id contact id Return to database documentation","title":"group_member"},{"location":"spec/database/db_group_member/#table-group_member","text":"privacy groups, member info","title":"Table group_member"},{"location":"spec/database/db_group_member/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment gid groups.id of the associated group int unsigned NO 0 contact-id contact.id of the member assigned to the associated group int unsigned NO 0","title":"Fields"},{"location":"spec/database/db_group_member/#indexes","text":"Name Fields PRIMARY id contactid contact-id gid_contactid UNIQUE, gid, contact-id","title":"Indexes"},{"location":"spec/database/db_group_member/#foreign-keys","text":"Field Target Table Target Field gid group id contact-id contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_gserver-tag/","tags":["database","table","developer"],"text":"Table gserver-tag # Tags that the server has subscribed Fields # Field Description Type Null Key Default Extra gserver-id The id of the gserver int unsigned NO PRI 0 tag Tag that the server has subscribed varchar(100) NO PRI Indexes # Name Fields PRIMARY gserver-id, tag tag tag Foreign Keys # Field Target Table Target Field gserver-id gserver id Return to database documentation","title":"gserver-tag"},{"location":"spec/database/db_gserver-tag/#table-gserver-tag","text":"Tags that the server has subscribed","title":"Table gserver-tag"},{"location":"spec/database/db_gserver-tag/#fields","text":"Field Description Type Null Key Default Extra gserver-id The id of the gserver int unsigned NO PRI 0 tag Tag that the server has subscribed varchar(100) NO PRI","title":"Fields"},{"location":"spec/database/db_gserver-tag/#indexes","text":"Name Fields PRIMARY gserver-id, tag tag tag","title":"Indexes"},{"location":"spec/database/db_gserver-tag/#foreign-keys","text":"Field Target Table Target Field gserver-id gserver id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_gserver/","tags":["database","table","developer"],"text":"Table gserver # Global servers Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment url varchar(255) NO nurl varchar(255) NO version varchar(255) NO site_name varchar(255) NO info text YES NULL register_policy tinyint NO 0 registered-users Number of registered users int unsigned NO 0 active-week-users Number of active users in the last week int unsigned YES NULL active-month-users Number of active users in the last month int unsigned YES NULL active-halfyear-users Number of active users in the last six month int unsigned YES NULL local-posts Number of local posts int unsigned YES NULL local-comments Number of local comments int unsigned YES NULL directory-type Type of directory service (Poco, Mastodon) tinyint YES 0 poco varchar(255) NO noscrape varchar(255) NO network char(4) NO protocol The protocol of the server tinyint unsigned YES NULL platform varchar(255) NO relay-subscribe Has the server subscribed to the relay system boolean NO 0 relay-scope The scope of messages that the server wants to get varchar(10) NO detection-method Method that had been used to detect that server tinyint unsigned YES NULL created datetime NO 0001-01-01 00:00:00 last_poco_query datetime YES 0001-01-01 00:00:00 last_contact Last successful connection request datetime YES 0001-01-01 00:00:00 last_failure Last failed connection request datetime YES 0001-01-01 00:00:00 failed Connection failed boolean YES NULL next_contact Next connection request datetime YES 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id nurl UNIQUE, nurl(190) next_contact next_contact network network Return to database documentation","title":"gserver"},{"location":"spec/database/db_gserver/#table-gserver","text":"Global servers","title":"Table gserver"},{"location":"spec/database/db_gserver/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment url varchar(255) NO nurl varchar(255) NO version varchar(255) NO site_name varchar(255) NO info text YES NULL register_policy tinyint NO 0 registered-users Number of registered users int unsigned NO 0 active-week-users Number of active users in the last week int unsigned YES NULL active-month-users Number of active users in the last month int unsigned YES NULL active-halfyear-users Number of active users in the last six month int unsigned YES NULL local-posts Number of local posts int unsigned YES NULL local-comments Number of local comments int unsigned YES NULL directory-type Type of directory service (Poco, Mastodon) tinyint YES 0 poco varchar(255) NO noscrape varchar(255) NO network char(4) NO protocol The protocol of the server tinyint unsigned YES NULL platform varchar(255) NO relay-subscribe Has the server subscribed to the relay system boolean NO 0 relay-scope The scope of messages that the server wants to get varchar(10) NO detection-method Method that had been used to detect that server tinyint unsigned YES NULL created datetime NO 0001-01-01 00:00:00 last_poco_query datetime YES 0001-01-01 00:00:00 last_contact Last successful connection request datetime YES 0001-01-01 00:00:00 last_failure Last failed connection request datetime YES 0001-01-01 00:00:00 failed Connection failed boolean YES NULL next_contact Next connection request datetime YES 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_gserver/#indexes","text":"Name Fields PRIMARY id nurl UNIQUE, nurl(190) next_contact next_contact network network Return to database documentation","title":"Indexes"},{"location":"spec/database/db_hook/","tags":["database","table","developer"],"text":"Table hook # addon hook registry Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hook name of hook varbinary(100) NO file relative filename of hook handler varbinary(200) NO function function name of hook handler varbinary(200) NO priority not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order smallint unsigned NO 0 Indexes # Name Fields PRIMARY id priority priority hook_file_function UNIQUE, hook, file, function Return to database documentation","title":"hook"},{"location":"spec/database/db_hook/#table-hook","text":"addon hook registry","title":"Table hook"},{"location":"spec/database/db_hook/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hook name of hook varbinary(100) NO file relative filename of hook handler varbinary(200) NO function function name of hook handler varbinary(200) NO priority not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order smallint unsigned NO 0","title":"Fields"},{"location":"spec/database/db_hook/#indexes","text":"Name Fields PRIMARY id priority priority hook_file_function UNIQUE, hook, file, function Return to database documentation","title":"Indexes"},{"location":"spec/database/db_inbox-entry-receiver/","tags":["database","table","developer"],"text":"Table inbox-entry-receiver # Receiver for the incoming activity Fields # Field Description Type Null Key Default Extra queue-id int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI NULL Indexes # Name Fields PRIMARY queue-id, uid uid uid Foreign Keys # Field Target Table Target Field queue-id inbox-entry id uid user uid Return to database documentation","title":"inbox-entry-receiver"},{"location":"spec/database/db_inbox-entry-receiver/#table-inbox-entry-receiver","text":"Receiver for the incoming activity","title":"Table inbox-entry-receiver"},{"location":"spec/database/db_inbox-entry-receiver/#fields","text":"Field Description Type Null Key Default Extra queue-id int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI NULL","title":"Fields"},{"location":"spec/database/db_inbox-entry-receiver/#indexes","text":"Name Fields PRIMARY queue-id, uid uid uid","title":"Indexes"},{"location":"spec/database/db_inbox-entry-receiver/#foreign-keys","text":"Field Target Table Target Field queue-id inbox-entry id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_inbox-entry/","tags":["database","table","developer"],"text":"Table inbox-entry # Incoming activity Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment activity-id id of the incoming activity varbinary(255) YES NULL object-id varbinary(255) YES NULL in-reply-to-id varbinary(255) YES NULL conversation varbinary(255) YES NULL type Type of the activity varchar(64) YES NULL object-type Type of the object activity varchar(64) YES NULL object-object-type Type of the object's object activity varchar(64) YES NULL received Receiving date datetime YES NULL activity The JSON activity mediumtext YES NULL signer varchar(255) YES NULL push Is the entry pushed or have pulled it? boolean YES NULL trust Do we trust this entry? boolean YES NULL wid Workerqueue id int unsigned YES NULL Indexes # Name Fields PRIMARY id activity-id UNIQUE, activity-id object-id object-id received received wid wid Foreign Keys # Field Target Table Target Field wid workerqueue id Return to database documentation","title":"inbox-entry"},{"location":"spec/database/db_inbox-entry/#table-inbox-entry","text":"Incoming activity","title":"Table inbox-entry"},{"location":"spec/database/db_inbox-entry/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment activity-id id of the incoming activity varbinary(255) YES NULL object-id varbinary(255) YES NULL in-reply-to-id varbinary(255) YES NULL conversation varbinary(255) YES NULL type Type of the activity varchar(64) YES NULL object-type Type of the object activity varchar(64) YES NULL object-object-type Type of the object's object activity varchar(64) YES NULL received Receiving date datetime YES NULL activity The JSON activity mediumtext YES NULL signer varchar(255) YES NULL push Is the entry pushed or have pulled it? boolean YES NULL trust Do we trust this entry? boolean YES NULL wid Workerqueue id int unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_inbox-entry/#indexes","text":"Name Fields PRIMARY id activity-id UNIQUE, activity-id object-id object-id received received wid wid","title":"Indexes"},{"location":"spec/database/db_inbox-entry/#foreign-keys","text":"Field Target Table Target Field wid workerqueue id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_inbox-status/","tags":["database","table","developer"],"text":"Table inbox-status # Status of ActivityPub inboxes Fields # Field Description Type Null Key Default Extra url URL of the inbox varbinary(255) NO PRI NULL uri-id Item-uri id of inbox url int unsigned YES NULL created Creation date of this entry datetime NO 0001-01-01 00:00:00 success Date of the last successful delivery datetime NO 0001-01-01 00:00:00 failure Date of the last failed delivery datetime NO 0001-01-01 00:00:00 previous Previous delivery date datetime NO 0001-01-01 00:00:00 archive Is the inbox archived? boolean NO 0 shared Is it a shared inbox? boolean NO 0 Indexes # Name Fields PRIMARY url uri-id uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"inbox-status"},{"location":"spec/database/db_inbox-status/#table-inbox-status","text":"Status of ActivityPub inboxes","title":"Table inbox-status"},{"location":"spec/database/db_inbox-status/#fields","text":"Field Description Type Null Key Default Extra url URL of the inbox varbinary(255) NO PRI NULL uri-id Item-uri id of inbox url int unsigned YES NULL created Creation date of this entry datetime NO 0001-01-01 00:00:00 success Date of the last successful delivery datetime NO 0001-01-01 00:00:00 failure Date of the last failed delivery datetime NO 0001-01-01 00:00:00 previous Previous delivery date datetime NO 0001-01-01 00:00:00 archive Is the inbox archived? boolean NO 0 shared Is it a shared inbox? boolean NO 0","title":"Fields"},{"location":"spec/database/db_inbox-status/#indexes","text":"Name Fields PRIMARY url uri-id uri-id","title":"Indexes"},{"location":"spec/database/db_inbox-status/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_intro/","tags":["database","table","developer"],"text":"Table intro # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 fid deprecated int unsigned YES NULL contact-id int unsigned NO 0 suggest-cid Suggested contact int unsigned YES NULL knowyou boolean NO 0 duplex deprecated boolean NO 0 note text YES NULL hash varchar(255) NO datetime datetime NO 0001-01-01 00:00:00 blocked deprecated boolean NO 0 ignore boolean NO 0 Indexes # Name Fields PRIMARY id contact-id contact-id suggest-cid suggest-cid uid uid Foreign Keys # Field Target Table Target Field uid user uid contact-id contact id suggest-cid contact id Return to database documentation","title":"intro"},{"location":"spec/database/db_intro/#table-intro","text":"","title":"Table intro"},{"location":"spec/database/db_intro/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 fid deprecated int unsigned YES NULL contact-id int unsigned NO 0 suggest-cid Suggested contact int unsigned YES NULL knowyou boolean NO 0 duplex deprecated boolean NO 0 note text YES NULL hash varchar(255) NO datetime datetime NO 0001-01-01 00:00:00 blocked deprecated boolean NO 0 ignore boolean NO 0","title":"Fields"},{"location":"spec/database/db_intro/#indexes","text":"Name Fields PRIMARY id contact-id contact-id suggest-cid suggest-cid uid uid","title":"Indexes"},{"location":"spec/database/db_intro/#foreign-keys","text":"Field Target Table Target Field uid user uid contact-id contact id suggest-cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_item-uri/","tags":["database","table","developer"],"text":"Table item-uri # URI and GUID for items Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of an item varbinary(255) NO NULL guid A unique identifier for an item varbinary(255) YES NULL Indexes # Name Fields PRIMARY id uri UNIQUE, uri guid guid Return to database documentation","title":"item-uri"},{"location":"spec/database/db_item-uri/#table-item-uri","text":"URI and GUID for items","title":"Table item-uri"},{"location":"spec/database/db_item-uri/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of an item varbinary(255) NO NULL guid A unique identifier for an item varbinary(255) YES NULL","title":"Fields"},{"location":"spec/database/db_item-uri/#indexes","text":"Name Fields PRIMARY id uri UNIQUE, uri guid guid Return to database documentation","title":"Indexes"},{"location":"spec/database/db_locks/","tags":["database","table","developer"],"text":"Table locks # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment name varchar(128) NO locked boolean NO 0 pid Process ID int unsigned NO 0 expires datetime of cache expiration datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id name_expires name, expires Return to database documentation","title":"locks"},{"location":"spec/database/db_locks/#table-locks","text":"","title":"Table locks"},{"location":"spec/database/db_locks/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment name varchar(128) NO locked boolean NO 0 pid Process ID int unsigned NO 0 expires datetime of cache expiration datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_locks/#indexes","text":"Name Fields PRIMARY id name_expires name, expires Return to database documentation","title":"Indexes"},{"location":"spec/database/db_mail/","tags":["database","table","developer"],"text":"Table mail # private messages Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 guid A unique identifier for this private message varchar(255) NO from-name name of the sender varchar(255) NO from-photo contact photo link of the sender varchar(255) NO from-url profile linke of the sender varchar(255) NO contact-id contact.id varchar(255) YES NULL author-id Link to the contact table with uid=0 of the author of the mail int unsigned YES NULL convid conv.id int unsigned YES NULL title varchar(255) NO body mediumtext YES NULL seen if message visited it is 1 boolean NO 0 reply boolean NO 0 replied boolean NO 0 unknown if sender not in the contact table this is 1 boolean NO 0 uri varchar(255) NO uri-id Item-uri id of the related mail int unsigned YES NULL parent-uri varchar(255) NO parent-uri-id Item-uri id of the parent of the related mail int unsigned YES NULL thr-parent varchar(255) YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL created creation time of the private message datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid_seen uid, seen convid convid uri uri(64) parent-uri parent-uri(64) contactid contact-id(32) author-id author-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id Foreign Keys # Field Target Table Target Field uid user uid author-id contact id uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id Return to database documentation","title":"mail"},{"location":"spec/database/db_mail/#table-mail","text":"private messages","title":"Table mail"},{"location":"spec/database/db_mail/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 guid A unique identifier for this private message varchar(255) NO from-name name of the sender varchar(255) NO from-photo contact photo link of the sender varchar(255) NO from-url profile linke of the sender varchar(255) NO contact-id contact.id varchar(255) YES NULL author-id Link to the contact table with uid=0 of the author of the mail int unsigned YES NULL convid conv.id int unsigned YES NULL title varchar(255) NO body mediumtext YES NULL seen if message visited it is 1 boolean NO 0 reply boolean NO 0 replied boolean NO 0 unknown if sender not in the contact table this is 1 boolean NO 0 uri varchar(255) NO uri-id Item-uri id of the related mail int unsigned YES NULL parent-uri varchar(255) NO parent-uri-id Item-uri id of the parent of the related mail int unsigned YES NULL thr-parent varchar(255) YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL created creation time of the private message datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_mail/#indexes","text":"Name Fields PRIMARY id uid_seen uid, seen convid convid uri uri(64) parent-uri parent-uri(64) contactid contact-id(32) author-id author-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id","title":"Indexes"},{"location":"spec/database/db_mail/#foreign-keys","text":"Field Target Table Target Field uid user uid author-id contact id uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_mailacct/","tags":["database","table","developer"],"text":"Table mailacct # Mail account data for fetching mails Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 server varchar(255) NO port smallint unsigned NO 0 ssltype varchar(16) NO mailbox varchar(255) NO user varchar(255) NO pass text YES NULL reply_to varchar(255) NO action tinyint unsigned NO 0 movetofolder varchar(255) NO pubmail boolean NO 0 last_check datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"mailacct"},{"location":"spec/database/db_mailacct/#table-mailacct","text":"Mail account data for fetching mails","title":"Table mailacct"},{"location":"spec/database/db_mailacct/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 server varchar(255) NO port smallint unsigned NO 0 ssltype varchar(16) NO mailbox varchar(255) NO user varchar(255) NO pass text YES NULL reply_to varchar(255) NO action tinyint unsigned NO 0 movetofolder varchar(255) NO pubmail boolean NO 0 last_check datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_mailacct/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"spec/database/db_mailacct/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_manage/","tags":["database","table","developer"],"text":"Table manage # table of accounts that can manage each other Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 mid User id mediumint unsigned NO 0 Indexes # Name Fields PRIMARY id uid_mid UNIQUE, uid, mid mid mid Foreign Keys # Field Target Table Target Field uid user uid mid user uid Return to database documentation","title":"manage"},{"location":"spec/database/db_manage/#table-manage","text":"table of accounts that can manage each other","title":"Table manage"},{"location":"spec/database/db_manage/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 mid User id mediumint unsigned NO 0","title":"Fields"},{"location":"spec/database/db_manage/#indexes","text":"Name Fields PRIMARY id uid_mid UNIQUE, uid, mid mid mid","title":"Indexes"},{"location":"spec/database/db_manage/#foreign-keys","text":"Field Target Table Target Field uid user uid mid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_notification/","tags":["database","table","developer"],"text":"Table notification # notifications Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned YES NULL vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL type smallint unsigned YES NULL actor-id Link to the contact table with uid=0 of the actor that caused the notification int unsigned YES NULL target-uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL created datetime YES NULL seen Seen on the desktop boolean YES 0 dismissed Dismissed via the API boolean YES 0 Indexes # Name Fields PRIMARY id uid_vid_type_actor-id_target-uri-id UNIQUE, uid, vid, type, actor-id, target-uri-id vid vid actor-id actor-id target-uri-id target-uri-id parent-uri-id parent-uri-id seen_uid seen, uid Foreign Keys # Field Target Table Target Field uid user uid vid verb id actor-id contact id target-uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"notification"},{"location":"spec/database/db_notification/#table-notification","text":"notifications","title":"Table notification"},{"location":"spec/database/db_notification/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned YES NULL vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL type smallint unsigned YES NULL actor-id Link to the contact table with uid=0 of the actor that caused the notification int unsigned YES NULL target-uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL created datetime YES NULL seen Seen on the desktop boolean YES 0 dismissed Dismissed via the API boolean YES 0","title":"Fields"},{"location":"spec/database/db_notification/#indexes","text":"Name Fields PRIMARY id uid_vid_type_actor-id_target-uri-id UNIQUE, uid, vid, type, actor-id, target-uri-id vid vid actor-id actor-id target-uri-id target-uri-id parent-uri-id parent-uri-id seen_uid seen, uid","title":"Indexes"},{"location":"spec/database/db_notification/#foreign-keys","text":"Field Target Table Target Field uid user uid vid verb id actor-id contact id target-uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_notify-threads/","tags":["database","table","developer"],"text":"Table notify-threads # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment notify-id int unsigned NO 0 master-parent-item Deprecated int unsigned YES NULL master-parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL parent-item int unsigned NO 0 receiver-uid User id mediumint unsigned NO 0 Indexes # Name Fields PRIMARY id master-parent-uri-id master-parent-uri-id receiver-uid receiver-uid notify-id notify-id Foreign Keys # Field Target Table Target Field notify-id notify id master-parent-uri-id item-uri id receiver-uid user uid Return to database documentation","title":"notify-threads"},{"location":"spec/database/db_notify-threads/#table-notify-threads","text":"","title":"Table notify-threads"},{"location":"spec/database/db_notify-threads/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment notify-id int unsigned NO 0 master-parent-item Deprecated int unsigned YES NULL master-parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL parent-item int unsigned NO 0 receiver-uid User id mediumint unsigned NO 0","title":"Fields"},{"location":"spec/database/db_notify-threads/#indexes","text":"Name Fields PRIMARY id master-parent-uri-id master-parent-uri-id receiver-uid receiver-uid notify-id notify-id","title":"Indexes"},{"location":"spec/database/db_notify-threads/#foreign-keys","text":"Field Target Table Target Field notify-id notify id master-parent-uri-id item-uri id receiver-uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_notify/","tags":["database","table","developer"],"text":"Table notify # [Deprecated] User notifications Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment type smallint unsigned NO 0 name varchar(255) NO url varchar(255) NO photo varchar(255) NO date datetime NO 0001-01-01 00:00:00 msg mediumtext YES NULL uid Owner User id mediumint unsigned NO 0 link varchar(255) NO iid int unsigned YES NULL parent int unsigned YES NULL uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL seen boolean NO 0 verb varchar(100) NO otype varchar(10) NO name_cache Cached bbcode parsing of name tinytext YES NULL msg_cache Cached bbcode parsing of msg mediumtext YES NULL Indexes # Name Fields PRIMARY id seen_uid_date seen, uid, date uid_date uid, date uid_type_link uid, type, link(190) uri-id uri-id parent-uri-id parent-uri-id Foreign Keys # Field Target Table Target Field uid user uid uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"notify"},{"location":"spec/database/db_notify/#table-notify","text":"[Deprecated] User notifications","title":"Table notify"},{"location":"spec/database/db_notify/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment type smallint unsigned NO 0 name varchar(255) NO url varchar(255) NO photo varchar(255) NO date datetime NO 0001-01-01 00:00:00 msg mediumtext YES NULL uid Owner User id mediumint unsigned NO 0 link varchar(255) NO iid int unsigned YES NULL parent int unsigned YES NULL uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL seen boolean NO 0 verb varchar(100) NO otype varchar(10) NO name_cache Cached bbcode parsing of name tinytext YES NULL msg_cache Cached bbcode parsing of msg mediumtext YES NULL","title":"Fields"},{"location":"spec/database/db_notify/#indexes","text":"Name Fields PRIMARY id seen_uid_date seen, uid, date uid_date uid, date uid_type_link uid, type, link(190) uri-id uri-id parent-uri-id parent-uri-id","title":"Indexes"},{"location":"spec/database/db_notify/#foreign-keys","text":"Field Target Table Target Field uid user uid uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_oembed/","tags":["database","table","developer"],"text":"Table oembed # cache for OEmbed queries Fields # Field Description Type Null Key Default Extra url page url varbinary(255) NO PRI NULL maxwidth Maximum width passed to Oembed mediumint unsigned NO PRI NULL content OEmbed data of the page mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY url, maxwidth created created Return to database documentation","title":"oembed"},{"location":"spec/database/db_oembed/#table-oembed","text":"cache for OEmbed queries","title":"Table oembed"},{"location":"spec/database/db_oembed/#fields","text":"Field Description Type Null Key Default Extra url page url varbinary(255) NO PRI NULL maxwidth Maximum width passed to Oembed mediumint unsigned NO PRI NULL content OEmbed data of the page mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_oembed/#indexes","text":"Name Fields PRIMARY url, maxwidth created created Return to database documentation","title":"Indexes"},{"location":"spec/database/db_openwebauth-token/","tags":["database","table","developer"],"text":"Table openwebauth-token # Store OpenWebAuth token to verify contacts Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id - currently unused mediumint unsigned NO 0 type Verify type varchar(32) NO token A generated token varchar(255) NO meta varchar(255) NO created datetime of creation datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"openwebauth-token"},{"location":"spec/database/db_openwebauth-token/#table-openwebauth-token","text":"Store OpenWebAuth token to verify contacts","title":"Table openwebauth-token"},{"location":"spec/database/db_openwebauth-token/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id - currently unused mediumint unsigned NO 0 type Verify type varchar(32) NO token A generated token varchar(255) NO meta varchar(255) NO created datetime of creation datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_openwebauth-token/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"spec/database/db_openwebauth-token/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_parsed_url/","tags":["database","table","developer"],"text":"Table parsed_url # cache for 'parse_url' queries Fields # Field Description Type Null Key Default Extra url_hash page url hash binary(64) NO PRI NULL guessing is the 'guessing' mode active? boolean NO PRI 0 oembed is the data the result of oembed? boolean NO PRI 0 url page url text NO NULL content page data mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00 expires datetime of expiration datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY url_hash, guessing, oembed created created expires expires Return to database documentation","title":"parsed_url"},{"location":"spec/database/db_parsed_url/#table-parsed_url","text":"cache for 'parse_url' queries","title":"Table parsed_url"},{"location":"spec/database/db_parsed_url/#fields","text":"Field Description Type Null Key Default Extra url_hash page url hash binary(64) NO PRI NULL guessing is the 'guessing' mode active? boolean NO PRI 0 oembed is the data the result of oembed? boolean NO PRI 0 url page url text NO NULL content page data mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00 expires datetime of expiration datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_parsed_url/#indexes","text":"Name Fields PRIMARY url_hash, guessing, oembed created created expires expires Return to database documentation","title":"Indexes"},{"location":"spec/database/db_pconfig/","tags":["database","table","developer"],"text":"Table pconfig # personal (per user) configuration storage Fields # Field Description Type Null Key Default Extra id Primary key int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cat Category varchar(50) NO k Key varchar(100) NO v Value mediumtext YES NULL Indexes # Name Fields PRIMARY id uid_cat_k UNIQUE, uid, cat, k Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"pconfig"},{"location":"spec/database/db_pconfig/#table-pconfig","text":"personal (per user) configuration storage","title":"Table pconfig"},{"location":"spec/database/db_pconfig/#fields","text":"Field Description Type Null Key Default Extra id Primary key int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cat Category varchar(50) NO k Key varchar(100) NO v Value mediumtext YES NULL","title":"Fields"},{"location":"spec/database/db_pconfig/#indexes","text":"Name Fields PRIMARY id uid_cat_k UNIQUE, uid, cat, k","title":"Indexes"},{"location":"spec/database/db_pconfig/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_permissionset/","tags":["database","table","developer"],"text":"Table permissionset # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner id of this permission set mediumint unsigned NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL Indexes # Name Fields PRIMARY id uid_allow_cid_allow_gid_deny_cid_deny_gid uid, allow_cid(50), allow_gid(30), deny_cid(50), deny_gid(30) Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"permissionset"},{"location":"spec/database/db_permissionset/#table-permissionset","text":"","title":"Table permissionset"},{"location":"spec/database/db_permissionset/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner id of this permission set mediumint unsigned NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL","title":"Fields"},{"location":"spec/database/db_permissionset/#indexes","text":"Name Fields PRIMARY id uid_allow_cid_allow_gid_deny_cid_deny_gid uid, allow_cid(50), allow_gid(30), deny_cid(50), deny_gid(30)","title":"Indexes"},{"location":"spec/database/db_permissionset/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_photo/","tags":["database","table","developer"],"text":"Table photo # photo storage Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 contact-id contact.id int unsigned NO 0 guid A unique identifier for this photo char(16) NO resource-id char(32) NO hash hash value of the photo char(32) YES NULL created creation date datetime NO 0001-01-01 00:00:00 edited last edited date datetime NO 0001-01-01 00:00:00 title varchar(255) NO desc text YES NULL album The name of the album to which the photo belongs varchar(255) NO photo-type User avatar, user banner, contact avatar, contact banner or default tinyint unsigned YES NULL filename varchar(255) NO type varchar(30) NO image/jpeg height smallint unsigned NO 0 width smallint unsigned NO 0 datasize int unsigned NO 0 data mediumblob NO NULL scale tinyint unsigned NO 0 profile boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL accessible Make photo publicly accessible, ignoring permissions boolean NO 0 backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL updated datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id contactid contact-id uid_contactid uid, contact-id uid_profile uid, profile uid_album_scale_created uid, album(32), scale, created uid_album_resource-id_created uid, album(32), resource-id, created resource-id resource-id uid_photo-type uid, photo-type Foreign Keys # Field Target Table Target Field uid user uid contact-id contact id Return to database documentation","title":"photo"},{"location":"spec/database/db_photo/#table-photo","text":"photo storage","title":"Table photo"},{"location":"spec/database/db_photo/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 contact-id contact.id int unsigned NO 0 guid A unique identifier for this photo char(16) NO resource-id char(32) NO hash hash value of the photo char(32) YES NULL created creation date datetime NO 0001-01-01 00:00:00 edited last edited date datetime NO 0001-01-01 00:00:00 title varchar(255) NO desc text YES NULL album The name of the album to which the photo belongs varchar(255) NO photo-type User avatar, user banner, contact avatar, contact banner or default tinyint unsigned YES NULL filename varchar(255) NO type varchar(30) NO image/jpeg height smallint unsigned NO 0 width smallint unsigned NO 0 datasize int unsigned NO 0 data mediumblob NO NULL scale tinyint unsigned NO 0 profile boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL accessible Make photo publicly accessible, ignoring permissions boolean NO 0 backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL updated datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_photo/#indexes","text":"Name Fields PRIMARY id contactid contact-id uid_contactid uid, contact-id uid_profile uid, profile uid_album_scale_created uid, album(32), scale, created uid_album_resource-id_created uid, album(32), resource-id, created resource-id resource-id uid_photo-type uid, photo-type","title":"Indexes"},{"location":"spec/database/db_photo/#foreign-keys","text":"Field Target Table Target Field uid user uid contact-id contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-category/","tags":["database","table","developer"],"text":"Table post-category # post relation to categories Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI 0 type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0 Indexes # Name Fields PRIMARY uri-id, uid, type, tid tid tid uid_uri-id uid, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id uid user uid tid tag id Return to database documentation","title":"post-category"},{"location":"spec/database/db_post-category/#table-post-category","text":"post relation to categories","title":"Table post-category"},{"location":"spec/database/db_post-category/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI 0 type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0","title":"Fields"},{"location":"spec/database/db_post-category/#indexes","text":"Name Fields PRIMARY uri-id, uid, type, tid tid tid uid_uri-id uid, uri-id","title":"Indexes"},{"location":"spec/database/db_post-category/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id uid user uid tid tag id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-collection/","tags":["database","table","developer"],"text":"Table post-collection # Collection of posts Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type 0 - Featured tinyint unsigned NO PRI 0 Indexes # Name Fields PRIMARY uri-id, type type type Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-collection"},{"location":"spec/database/db_post-collection/#table-post-collection","text":"Collection of posts","title":"Table post-collection"},{"location":"spec/database/db_post-collection/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type 0 - Featured tinyint unsigned NO PRI 0","title":"Fields"},{"location":"spec/database/db_post-collection/#indexes","text":"Name Fields PRIMARY uri-id, type type type","title":"Indexes"},{"location":"spec/database/db_post-collection/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-content/","tags":["database","table","developer"],"text":"Table post-content # Content for all posts Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO Indexes # Name Fields PRIMARY uri-id plink plink(191) resource-id resource-id title-content-warning-body FULLTEXT, title, content-warning, body Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-content"},{"location":"spec/database/db_post-content/#table-post-content","text":"Content for all posts","title":"Table post-content"},{"location":"spec/database/db_post-content/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO","title":"Fields"},{"location":"spec/database/db_post-content/#indexes","text":"Name Fields PRIMARY uri-id plink plink(191) resource-id resource-id title-content-warning-body FULLTEXT, title, content-warning, body","title":"Indexes"},{"location":"spec/database/db_post-content/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-delivery-data/","tags":["database","table","developer"],"text":"Table post-delivery-data # Delivery data for items Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL postopts External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery text YES NULL inform Additional receivers of the linked item mediumtext YES NULL queue_count Initial number of delivery recipients, used as item.delivery_queue_count mediumint NO 0 queue_done Number of successful deliveries, used as item.delivery_queue_done mediumint NO 0 queue_failed Number of unsuccessful deliveries, used as item.delivery_queue_failed mediumint NO 0 activitypub Number of successful deliveries via ActivityPub mediumint NO 0 dfrn Number of successful deliveries via DFRN mediumint NO 0 legacy_dfrn Number of successful deliveries via legacy DFRN mediumint NO 0 diaspora Number of successful deliveries via Diaspora mediumint NO 0 ostatus Number of successful deliveries via OStatus mediumint NO 0 Indexes # Name Fields PRIMARY uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-delivery-data"},{"location":"spec/database/db_post-delivery-data/#table-post-delivery-data","text":"Delivery data for items","title":"Table post-delivery-data"},{"location":"spec/database/db_post-delivery-data/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL postopts External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery text YES NULL inform Additional receivers of the linked item mediumtext YES NULL queue_count Initial number of delivery recipients, used as item.delivery_queue_count mediumint NO 0 queue_done Number of successful deliveries, used as item.delivery_queue_done mediumint NO 0 queue_failed Number of unsuccessful deliveries, used as item.delivery_queue_failed mediumint NO 0 activitypub Number of successful deliveries via ActivityPub mediumint NO 0 dfrn Number of successful deliveries via DFRN mediumint NO 0 legacy_dfrn Number of successful deliveries via legacy DFRN mediumint NO 0 diaspora Number of successful deliveries via Diaspora mediumint NO 0 ostatus Number of successful deliveries via OStatus mediumint NO 0","title":"Fields"},{"location":"spec/database/db_post-delivery-data/#indexes","text":"Name Fields PRIMARY uri-id","title":"Indexes"},{"location":"spec/database/db_post-delivery-data/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-delivery/","tags":["database","table","developer"],"text":"Table post-delivery # Delivery data for posts for the batch processing Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL inbox-id Item-uri id of inbox url int unsigned NO PRI NULL uid Delivering user mediumint unsigned YES NULL created datetime YES 0001-01-01 00:00:00 command varbinary(32) YES NULL failed Number of times the delivery has failed tinyint YES 0 receivers JSON encoded array with the receiving contacts mediumtext YES NULL Indexes # Name Fields PRIMARY uri-id, inbox-id inbox-id_created inbox-id, created uid uid Foreign Keys # Field Target Table Target Field uri-id item-uri id inbox-id item-uri id uid user uid Return to database documentation","title":"post-delivery"},{"location":"spec/database/db_post-delivery/#table-post-delivery","text":"Delivery data for posts for the batch processing","title":"Table post-delivery"},{"location":"spec/database/db_post-delivery/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL inbox-id Item-uri id of inbox url int unsigned NO PRI NULL uid Delivering user mediumint unsigned YES NULL created datetime YES 0001-01-01 00:00:00 command varbinary(32) YES NULL failed Number of times the delivery has failed tinyint YES 0 receivers JSON encoded array with the receiving contacts mediumtext YES NULL","title":"Fields"},{"location":"spec/database/db_post-delivery/#indexes","text":"Name Fields PRIMARY uri-id, inbox-id inbox-id_created inbox-id, created uid uid","title":"Indexes"},{"location":"spec/database/db_post-delivery/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id inbox-id item-uri id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-history/","tags":["database","table","developer"],"text":"Table post-history # Post history Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL edited Date of edit datetime NO PRI 0001-01-01 00:00:00 title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO Indexes # Name Fields PRIMARY uri-id, edited Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-history"},{"location":"spec/database/db_post-history/#table-post-history","text":"Post history","title":"Table post-history"},{"location":"spec/database/db_post-history/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL edited Date of edit datetime NO PRI 0001-01-01 00:00:00 title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO","title":"Fields"},{"location":"spec/database/db_post-history/#indexes","text":"Name Fields PRIMARY uri-id, edited","title":"Indexes"},{"location":"spec/database/db_post-history/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-link/","tags":["database","table","developer"],"text":"Table post-link # Post related external links Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url External URL varbinary(511) NO NULL mimetype varchar(60) YES NULL Indexes # Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-link"},{"location":"spec/database/db_post-link/#table-post-link","text":"Post related external links","title":"Table post-link"},{"location":"spec/database/db_post-link/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url External URL varbinary(511) NO NULL mimetype varchar(60) YES NULL","title":"Fields"},{"location":"spec/database/db_post-link/#indexes","text":"Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url","title":"Indexes"},{"location":"spec/database/db_post-link/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-media/","tags":["database","table","developer"],"text":"Table post-media # Attached media Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url Media URL varbinary(1024) NO NULL type Media type tinyint unsigned NO 0 mimetype varchar(60) YES NULL height Height of the media smallint unsigned YES NULL width Width of the media smallint unsigned YES NULL size Media size bigint unsigned YES NULL preview Preview URL varbinary(512) YES NULL preview-height Height of the preview picture smallint unsigned YES NULL preview-width Width of the preview picture smallint unsigned YES NULL description text YES NULL name Name of the media varchar(255) YES NULL author-url URL of the author of the media varbinary(255) YES NULL author-name Name of the author of the media varchar(255) YES NULL author-image Image of the author of the media varbinary(255) YES NULL publisher-url URL of the publisher of the media varbinary(255) YES NULL publisher-name Name of the publisher of the media varchar(255) YES NULL publisher-image Image of the publisher of the media varbinary(255) YES NULL Indexes # Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url(512) uri-id-id uri-id, id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-media"},{"location":"spec/database/db_post-media/#table-post-media","text":"Attached media","title":"Table post-media"},{"location":"spec/database/db_post-media/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url Media URL varbinary(1024) NO NULL type Media type tinyint unsigned NO 0 mimetype varchar(60) YES NULL height Height of the media smallint unsigned YES NULL width Width of the media smallint unsigned YES NULL size Media size bigint unsigned YES NULL preview Preview URL varbinary(512) YES NULL preview-height Height of the preview picture smallint unsigned YES NULL preview-width Width of the preview picture smallint unsigned YES NULL description text YES NULL name Name of the media varchar(255) YES NULL author-url URL of the author of the media varbinary(255) YES NULL author-name Name of the author of the media varchar(255) YES NULL author-image Image of the author of the media varbinary(255) YES NULL publisher-url URL of the publisher of the media varbinary(255) YES NULL publisher-name Name of the publisher of the media varchar(255) YES NULL publisher-image Image of the publisher of the media varbinary(255) YES NULL","title":"Fields"},{"location":"spec/database/db_post-media/#indexes","text":"Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url(512) uri-id-id uri-id, id","title":"Indexes"},{"location":"spec/database/db_post-media/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-question-option/","tags":["database","table","developer"],"text":"Table post-question-option # Question option Fields # Field Description Type Null Key Default Extra id Id of the question int unsigned NO PRI NULL uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL name Name of the option varchar(255) YES NULL replies Number of replies for this question option int unsigned YES NULL Indexes # Name Fields PRIMARY uri-id, id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-question-option"},{"location":"spec/database/db_post-question-option/#table-post-question-option","text":"Question option","title":"Table post-question-option"},{"location":"spec/database/db_post-question-option/#fields","text":"Field Description Type Null Key Default Extra id Id of the question int unsigned NO PRI NULL uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL name Name of the option varchar(255) YES NULL replies Number of replies for this question option int unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_post-question-option/#indexes","text":"Name Fields PRIMARY uri-id, id","title":"Indexes"},{"location":"spec/database/db_post-question-option/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-question/","tags":["database","table","developer"],"text":"Table post-question # Question Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL multiple Multiple choice boolean NO 0 voters Number of voters for this question int unsigned YES NULL end-time Question end time datetime YES 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uri-id UNIQUE, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-question"},{"location":"spec/database/db_post-question/#table-post-question","text":"Question","title":"Table post-question"},{"location":"spec/database/db_post-question/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL multiple Multiple choice boolean NO 0 voters Number of voters for this question int unsigned YES NULL end-time Question end time datetime YES 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_post-question/#indexes","text":"Name Fields PRIMARY id uri-id UNIQUE, uri-id","title":"Indexes"},{"location":"spec/database/db_post-question/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-tag/","tags":["database","table","developer"],"text":"Table post-tag # post relation to tags Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0 cid Contact id of the mentioned public contact int unsigned NO PRI 0 Indexes # Name Fields PRIMARY uri-id, type, tid, cid tid tid cid cid Foreign Keys # Field Target Table Target Field uri-id item-uri id tid tag id cid contact id Return to database documentation","title":"post-tag"},{"location":"spec/database/db_post-tag/#table-post-tag","text":"post relation to tags","title":"Table post-tag"},{"location":"spec/database/db_post-tag/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0 cid Contact id of the mentioned public contact int unsigned NO PRI 0","title":"Fields"},{"location":"spec/database/db_post-tag/#indexes","text":"Name Fields PRIMARY uri-id, type, tid, cid tid tid cid cid","title":"Indexes"},{"location":"spec/database/db_post-tag/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id tid tag id cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-thread-user/","tags":["database","table","developer"],"text":"Table post-thread-user # Thread related data per user Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00 uid Owner id which owns this copy of the item mediumint unsigned NO PRI 0 pinned deprecated boolean NO 0 starred boolean NO 0 ignored Ignore updates for this thread boolean NO 0 wall This item was posted to the wall of uid boolean NO 0 mention boolean NO 0 pubmail boolean NO 0 forum_mode Deprecated tinyint unsigned NO 0 contact-id contact.id int unsigned NO 0 unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL post-user-id Id of the post-user table int unsigned YES NULL Indexes # Name Fields PRIMARY uid, uri-id uri-id uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id uid uid contact-id contact-id psid psid post-user-id post-user-id commented commented uid_received uid, received uid_wall_received uid, wall, received uid_commented uid, commented uid_starred uid, starred uid_mention uid, mention Foreign Keys # Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id uid user uid contact-id contact id psid permissionset id post-user-id post-user id Return to database documentation","title":"post-thread-user"},{"location":"spec/database/db_post-thread-user/#table-post-thread-user","text":"Thread related data per user","title":"Table post-thread-user"},{"location":"spec/database/db_post-thread-user/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00 uid Owner id which owns this copy of the item mediumint unsigned NO PRI 0 pinned deprecated boolean NO 0 starred boolean NO 0 ignored Ignore updates for this thread boolean NO 0 wall This item was posted to the wall of uid boolean NO 0 mention boolean NO 0 pubmail boolean NO 0 forum_mode Deprecated tinyint unsigned NO 0 contact-id contact.id int unsigned NO 0 unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL post-user-id Id of the post-user table int unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_post-thread-user/#indexes","text":"Name Fields PRIMARY uid, uri-id uri-id uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id uid uid contact-id contact-id psid psid post-user-id post-user-id commented commented uid_received uid, received uid_wall_received uid, wall, received uid_commented uid, commented uid_starred uid, starred uid_mention uid, mention","title":"Indexes"},{"location":"spec/database/db_post-thread-user/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id uid user uid contact-id contact id psid permissionset id post-user-id post-user id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-thread/","tags":["database","table","developer"],"text":"Table post-thread # Thread related data Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id received received commented commented Foreign Keys # Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id Return to database documentation","title":"post-thread"},{"location":"spec/database/db_post-thread/#table-post-thread","text":"Thread related data","title":"Table post-thread"},{"location":"spec/database/db_post-thread/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_post-thread/#indexes","text":"Name Fields PRIMARY uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id received received commented commented","title":"Indexes"},{"location":"spec/database/db_post-thread/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-user-notification/","tags":["database","table","developer"],"text":"Table post-user-notification # User post notifications Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid Owner id which owns this copy of the item mediumint unsigned NO PRI NULL notification-type smallint unsigned NO 0 Indexes # Name Fields PRIMARY uid, uri-id uri-id uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id uid user uid Return to database documentation","title":"post-user-notification"},{"location":"spec/database/db_post-user-notification/#table-post-user-notification","text":"User post notifications","title":"Table post-user-notification"},{"location":"spec/database/db_post-user-notification/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid Owner id which owns this copy of the item mediumint unsigned NO PRI NULL notification-type smallint unsigned NO 0","title":"Fields"},{"location":"spec/database/db_post-user-notification/#indexes","text":"Name Fields PRIMARY uid, uri-id uri-id uri-id","title":"Indexes"},{"location":"spec/database/db_post-user-notification/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post-user/","tags":["database","table","developer"],"text":"Table post-user # User specific post data Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 post-reason Reason why the post arrived at the user tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0 uid Owner id which owns this copy of the item mediumint unsigned NO NULL protocol Protocol used to deliver the item for this user tinyint unsigned YES NULL contact-id contact.id int unsigned NO 0 event-id Used to link to the event.id int unsigned YES NULL unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 notification-type tinyint unsigned NO 0 wall This item was posted to the wall of uid boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL Indexes # Name Fields PRIMARY id uid_uri-id UNIQUE, uid, uri-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid contact-id contact-id event-id event-id psid psid author-id_uid author-id, uid author-id_received author-id, received parent-uri-id_uid parent-uri-id, uid uid_contactid uid, contact-id uid_unseen_contactid uid, unseen, contact-id uid_unseen uid, unseen uid_hidden_uri-id uid, hidden, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id uid user uid contact-id contact id event-id event id psid permissionset id Return to database documentation","title":"post-user"},{"location":"spec/database/db_post-user/#table-post-user","text":"User specific post data","title":"Table post-user"},{"location":"spec/database/db_post-user/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 post-reason Reason why the post arrived at the user tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0 uid Owner id which owns this copy of the item mediumint unsigned NO NULL protocol Protocol used to deliver the item for this user tinyint unsigned YES NULL contact-id contact.id int unsigned NO 0 event-id Used to link to the event.id int unsigned YES NULL unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 notification-type tinyint unsigned NO 0 wall This item was posted to the wall of uid boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_post-user/#indexes","text":"Name Fields PRIMARY id uid_uri-id UNIQUE, uid, uri-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid contact-id contact-id event-id event-id psid psid author-id_uid author-id, uid author-id_received author-id, received parent-uri-id_uid parent-uri-id, uid uid_contactid uid, contact-id uid_unseen_contactid uid, unseen, contact-id uid_unseen uid, unseen uid_hidden_uri-id uid, hidden, uri-id","title":"Indexes"},{"location":"spec/database/db_post-user/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id uid user uid contact-id contact id event-id event id psid permissionset id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_post/","tags":["database","table","developer"],"text":"Table post # Structure for all posts Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0 Indexes # Name Fields PRIMARY uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid Foreign Keys # Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id Return to database documentation","title":"post"},{"location":"spec/database/db_post/#table-post","text":"Structure for all posts","title":"Table post"},{"location":"spec/database/db_post/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0","title":"Fields"},{"location":"spec/database/db_post/#indexes","text":"Name Fields PRIMARY uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid","title":"Indexes"},{"location":"spec/database/db_post/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_process/","tags":["database","table","developer"],"text":"Table process # Currently running system processes Fields # Field Description Type Null Key Default Extra pid The ID of the process int unsigned NO PRI NULL hostname The name of the host the process is ran on varchar(32) NO PRI NULL command varbinary(32) NO created datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY pid, hostname command command Return to database documentation","title":"process"},{"location":"spec/database/db_process/#table-process","text":"Currently running system processes","title":"Table process"},{"location":"spec/database/db_process/#fields","text":"Field Description Type Null Key Default Extra pid The ID of the process int unsigned NO PRI NULL hostname The name of the host the process is ran on varchar(32) NO PRI NULL command varbinary(32) NO created datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_process/#indexes","text":"Name Fields PRIMARY pid, hostname command command Return to database documentation","title":"Indexes"},{"location":"spec/database/db_profile/","tags":["database","table","developer"],"text":"Table profile # user profiles data Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 profile-name Deprecated varchar(255) YES NULL is-default Deprecated boolean YES NULL hide-friends Hide friend list from viewers of this profile boolean NO 0 name varchar(255) NO pdesc Deprecated varchar(255) YES NULL dob Day of birth varchar(32) NO 0000-00-00 address varchar(255) NO locality varchar(255) NO region varchar(255) NO postal-code varchar(32) NO country-name varchar(255) NO hometown Deprecated varchar(255) YES NULL gender Deprecated varchar(32) YES NULL marital Deprecated varchar(255) YES NULL with Deprecated text YES NULL howlong Deprecated datetime YES NULL sexual Deprecated varchar(255) YES NULL politic Deprecated varchar(255) YES NULL religion Deprecated varchar(255) YES NULL pub_keywords text YES NULL prv_keywords text YES NULL likes Deprecated text YES NULL dislikes Deprecated text YES NULL about Profile description text YES NULL summary Deprecated varchar(255) YES NULL music Deprecated text YES NULL book Deprecated text YES NULL tv Deprecated text YES NULL film Deprecated text YES NULL interest Deprecated text YES NULL romance Deprecated text YES NULL work Deprecated text YES NULL education Deprecated text YES NULL contact Deprecated text YES NULL homepage varchar(255) NO xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO photo varchar(255) NO thumb varchar(255) NO publish publish default profile in local directory boolean NO 0 net-publish publish profile in global directory boolean NO 0 Indexes # Name Fields PRIMARY id uid_is-default uid, is-default pub_keywords FULLTEXT, pub_keywords Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"profile"},{"location":"spec/database/db_profile/#table-profile","text":"user profiles data","title":"Table profile"},{"location":"spec/database/db_profile/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 profile-name Deprecated varchar(255) YES NULL is-default Deprecated boolean YES NULL hide-friends Hide friend list from viewers of this profile boolean NO 0 name varchar(255) NO pdesc Deprecated varchar(255) YES NULL dob Day of birth varchar(32) NO 0000-00-00 address varchar(255) NO locality varchar(255) NO region varchar(255) NO postal-code varchar(32) NO country-name varchar(255) NO hometown Deprecated varchar(255) YES NULL gender Deprecated varchar(32) YES NULL marital Deprecated varchar(255) YES NULL with Deprecated text YES NULL howlong Deprecated datetime YES NULL sexual Deprecated varchar(255) YES NULL politic Deprecated varchar(255) YES NULL religion Deprecated varchar(255) YES NULL pub_keywords text YES NULL prv_keywords text YES NULL likes Deprecated text YES NULL dislikes Deprecated text YES NULL about Profile description text YES NULL summary Deprecated varchar(255) YES NULL music Deprecated text YES NULL book Deprecated text YES NULL tv Deprecated text YES NULL film Deprecated text YES NULL interest Deprecated text YES NULL romance Deprecated text YES NULL work Deprecated text YES NULL education Deprecated text YES NULL contact Deprecated text YES NULL homepage varchar(255) NO xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO photo varchar(255) NO thumb varchar(255) NO publish publish default profile in local directory boolean NO 0 net-publish publish profile in global directory boolean NO 0","title":"Fields"},{"location":"spec/database/db_profile/#indexes","text":"Name Fields PRIMARY id uid_is-default uid, is-default pub_keywords FULLTEXT, pub_keywords","title":"Indexes"},{"location":"spec/database/db_profile/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_profile_field/","tags":["database","table","developer"],"text":"Table profile_field # Custom profile fields Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner user id mediumint unsigned NO 0 order Field ordering per user mediumint unsigned NO 1 psid ID of the permission set of this profile field - 0 = public int unsigned YES NULL label Label of the field varchar(255) NO value Value of the field text YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid uid order order psid psid Foreign Keys # Field Target Table Target Field uid user uid psid permissionset id Return to database documentation","title":"profile_field"},{"location":"spec/database/db_profile_field/#table-profile_field","text":"Custom profile fields","title":"Table profile_field"},{"location":"spec/database/db_profile_field/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner user id mediumint unsigned NO 0 order Field ordering per user mediumint unsigned NO 1 psid ID of the permission set of this profile field - 0 = public int unsigned YES NULL label Label of the field varchar(255) NO value Value of the field text YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"spec/database/db_profile_field/#indexes","text":"Name Fields PRIMARY id uid uid order order psid psid","title":"Indexes"},{"location":"spec/database/db_profile_field/#foreign-keys","text":"Field Target Table Target Field uid user uid psid permissionset id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_push_subscriber/","tags":["database","table","developer"],"text":"Table push_subscriber # Used for OStatus: Contains feed subscribers Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 callback_url varchar(255) NO topic varchar(255) NO nickname varchar(255) NO push Retrial counter tinyint NO 0 last_update Date of last successful trial datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 renewed Date of last subscription renewal datetime NO 0001-01-01 00:00:00 secret varchar(255) NO Indexes # Name Fields PRIMARY id next_try next_try uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"push_subscriber"},{"location":"spec/database/db_push_subscriber/#table-push_subscriber","text":"Used for OStatus: Contains feed subscribers","title":"Table push_subscriber"},{"location":"spec/database/db_push_subscriber/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 callback_url varchar(255) NO topic varchar(255) NO nickname varchar(255) NO push Retrial counter tinyint NO 0 last_update Date of last successful trial datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 renewed Date of last subscription renewal datetime NO 0001-01-01 00:00:00 secret varchar(255) NO","title":"Fields"},{"location":"spec/database/db_push_subscriber/#indexes","text":"Name Fields PRIMARY id next_try next_try uid uid","title":"Indexes"},{"location":"spec/database/db_push_subscriber/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_register/","tags":["database","table","developer"],"text":"Table register # registrations requiring admin approval Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hash varchar(255) NO created datetime NO 0001-01-01 00:00:00 uid User id mediumint unsigned NO 0 password varchar(255) NO language varchar(16) NO note text YES NULL Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"register"},{"location":"spec/database/db_register/#table-register","text":"registrations requiring admin approval","title":"Table register"},{"location":"spec/database/db_register/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hash varchar(255) NO created datetime NO 0001-01-01 00:00:00 uid User id mediumint unsigned NO 0 password varchar(255) NO language varchar(16) NO note text YES NULL","title":"Fields"},{"location":"spec/database/db_register/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"spec/database/db_register/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_search/","tags":["database","table","developer"],"text":"Table search # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 term varchar(255) NO Indexes # Name Fields PRIMARY id uid_term uid, term(64) term term(64) Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"search"},{"location":"spec/database/db_search/#table-search","text":"","title":"Table search"},{"location":"spec/database/db_search/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 term varchar(255) NO","title":"Fields"},{"location":"spec/database/db_search/#indexes","text":"Name Fields PRIMARY id uid_term uid, term(64) term term(64)","title":"Indexes"},{"location":"spec/database/db_search/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_session/","tags":["database","table","developer"],"text":"Table session # web session storage Fields # Field Description Type Null Key Default Extra id sequential ID bigint unsigned NO PRI NULL auto_increment sid varbinary(255) NO data text YES NULL expire int unsigned NO 0 Indexes # Name Fields PRIMARY id sid sid(64) expire expire Return to database documentation","title":"session"},{"location":"spec/database/db_session/#table-session","text":"web session storage","title":"Table session"},{"location":"spec/database/db_session/#fields","text":"Field Description Type Null Key Default Extra id sequential ID bigint unsigned NO PRI NULL auto_increment sid varbinary(255) NO data text YES NULL expire int unsigned NO 0","title":"Fields"},{"location":"spec/database/db_session/#indexes","text":"Name Fields PRIMARY id sid sid(64) expire expire Return to database documentation","title":"Indexes"},{"location":"spec/database/db_storage/","tags":["database","table","developer"],"text":"Table storage # Data stored by Database storage backend Fields # Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment data file data longblob NO NULL Indexes # Name Fields PRIMARY id Return to database documentation","title":"storage"},{"location":"spec/database/db_storage/#table-storage","text":"Data stored by Database storage backend","title":"Table storage"},{"location":"spec/database/db_storage/#fields","text":"Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment data file data longblob NO NULL","title":"Fields"},{"location":"spec/database/db_storage/#indexes","text":"Name Fields PRIMARY id Return to database documentation","title":"Indexes"},{"location":"spec/database/db_subscription/","tags":["database","table","developer"],"text":"Table subscription # Push Subscription for the API Fields # Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment application-id int unsigned NO NULL uid Owner User id mediumint unsigned NO NULL endpoint Endpoint URL varchar(511) YES NULL pubkey User agent public key varchar(127) YES NULL secret Auth secret varchar(32) YES NULL follow boolean YES NULL favourite boolean YES NULL reblog boolean YES NULL mention boolean YES NULL poll boolean YES NULL follow_request boolean YES NULL status boolean YES NULL Indexes # Name Fields PRIMARY id application-id_uid UNIQUE, application-id, uid uid_application-id uid, application-id Foreign Keys # Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"subscription"},{"location":"spec/database/db_subscription/#table-subscription","text":"Push Subscription for the API","title":"Table subscription"},{"location":"spec/database/db_subscription/#fields","text":"Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment application-id int unsigned NO NULL uid Owner User id mediumint unsigned NO NULL endpoint Endpoint URL varchar(511) YES NULL pubkey User agent public key varchar(127) YES NULL secret Auth secret varchar(32) YES NULL follow boolean YES NULL favourite boolean YES NULL reblog boolean YES NULL mention boolean YES NULL poll boolean YES NULL follow_request boolean YES NULL status boolean YES NULL","title":"Fields"},{"location":"spec/database/db_subscription/#indexes","text":"Name Fields PRIMARY id application-id_uid UNIQUE, application-id, uid uid_application-id uid, application-id","title":"Indexes"},{"location":"spec/database/db_subscription/#foreign-keys","text":"Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_tag/","tags":["database","table","developer"],"text":"Table tag # tags and mentions Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name varchar(96) NO url varbinary(255) NO type Type of the tag (Unknown, General Collection, Follower Collection or Account) tinyint unsigned YES NULL Indexes # Name Fields PRIMARY id type_name_url UNIQUE, name, url url url Return to database documentation","title":"tag"},{"location":"spec/database/db_tag/#table-tag","text":"tags and mentions","title":"Table tag"},{"location":"spec/database/db_tag/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name varchar(96) NO url varbinary(255) NO type Type of the tag (Unknown, General Collection, Follower Collection or Account) tinyint unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_tag/#indexes","text":"Name Fields PRIMARY id type_name_url UNIQUE, name, url url url Return to database documentation","title":"Indexes"},{"location":"spec/database/db_user-contact/","tags":["database","table","developer"],"text":"Table user-contact # User specific public contact data Fields # Field Description Type Null Key Default Extra cid Contact id of the linked public contact int unsigned NO PRI 0 uid User id mediumint unsigned NO PRI 0 uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL blocked Contact is completely blocked for this user boolean YES NULL ignored Posts from this contact are ignored boolean YES NULL collapsed Posts from this contact are collapsed boolean YES NULL hidden This contact is hidden from the others boolean YES NULL is-blocked User is blocked by this contact boolean YES NULL pending boolean YES NULL rel The kind of the relation between the user and the contact tinyint unsigned YES NULL info mediumtext YES NULL notify_new_posts boolean YES NULL remote_self boolean YES NULL fetch_further_information tinyint unsigned YES NULL ffi_keyword_denylist text YES NULL subhub boolean YES NULL hub-verify varchar(255) YES NULL protocol Protocol of the contact char(4) YES NULL rating Automatically detected feed poll frequency tinyint YES NULL priority Feed poll priority tinyint unsigned YES NULL Indexes # Name Fields PRIMARY uid, cid cid cid uri-id_uid UNIQUE, uri-id, uid Foreign Keys # Field Target Table Target Field cid contact id uid user uid uri-id item-uri id Return to database documentation","title":"user-contact"},{"location":"spec/database/db_user-contact/#table-user-contact","text":"User specific public contact data","title":"Table user-contact"},{"location":"spec/database/db_user-contact/#fields","text":"Field Description Type Null Key Default Extra cid Contact id of the linked public contact int unsigned NO PRI 0 uid User id mediumint unsigned NO PRI 0 uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL blocked Contact is completely blocked for this user boolean YES NULL ignored Posts from this contact are ignored boolean YES NULL collapsed Posts from this contact are collapsed boolean YES NULL hidden This contact is hidden from the others boolean YES NULL is-blocked User is blocked by this contact boolean YES NULL pending boolean YES NULL rel The kind of the relation between the user and the contact tinyint unsigned YES NULL info mediumtext YES NULL notify_new_posts boolean YES NULL remote_self boolean YES NULL fetch_further_information tinyint unsigned YES NULL ffi_keyword_denylist text YES NULL subhub boolean YES NULL hub-verify varchar(255) YES NULL protocol Protocol of the contact char(4) YES NULL rating Automatically detected feed poll frequency tinyint YES NULL priority Feed poll priority tinyint unsigned YES NULL","title":"Fields"},{"location":"spec/database/db_user-contact/#indexes","text":"Name Fields PRIMARY uid, cid cid cid uri-id_uid UNIQUE, uri-id, uid","title":"Indexes"},{"location":"spec/database/db_user-contact/#foreign-keys","text":"Field Target Table Target Field cid contact id uid user uid uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_user/","tags":["database","table","developer"],"text":"Table user # The local users Fields # Field Description Type Null Key Default Extra uid sequential ID mediumint unsigned NO PRI NULL auto_increment parent-uid The parent user that has full control about this user mediumint unsigned YES NULL guid A unique identifier for this user varchar(64) NO username Name that this user is known by varchar(255) NO password encrypted password varchar(255) NO legacy_password Is the password hash double-hashed? boolean NO 0 nickname nick- and user name varchar(255) NO email the users email address varchar(255) NO openid varchar(255) NO timezone PHP-legal timezone varchar(128) NO language default language varchar(32) NO en register_date timestamp of registration datetime NO 0001-01-01 00:00:00 login_date timestamp of last login datetime NO 0001-01-01 00:00:00 default-location Default for item.location varchar(255) NO allow_location 1 allows to display the location boolean NO 0 theme user theme preference varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL spubkey text YES NULL sprvkey text YES NULL verified user is verified through email boolean NO 0 blocked 1 for user is blocked boolean NO 0 blockwall Prohibit contacts to post to the profile page of the user boolean NO 0 hidewall Hide profile details from unkown viewers boolean NO 0 blocktags Prohibit contacts to tag the post of this user boolean NO 0 unkmail Permit unknown people to send private mails to this user boolean NO 0 cntunkmail int unsigned NO 10 notify-flags email notification options smallint unsigned NO 65535 page-flags page/profile type tinyint unsigned NO 0 account-type tinyint unsigned NO 0 prvnets boolean NO 0 pwdreset Password reset request token varchar(255) YES NULL pwdreset_time Timestamp of the last password reset request datetime YES NULL maxreq int unsigned NO 10 expire int unsigned NO 0 account_removed if 1 the account is removed boolean NO 0 account_expired boolean NO 0 account_expires_on timestamp when account expires and will be deleted datetime NO 0001-01-01 00:00:00 expire_notification_sent timestamp of last warning of account expiration datetime NO 0001-01-01 00:00:00 def_gid int unsigned NO 0 allow_cid default permission for this user mediumtext YES NULL allow_gid default permission for this user mediumtext YES NULL deny_cid default permission for this user mediumtext YES NULL deny_gid default permission for this user mediumtext YES NULL openidserver text YES NULL Indexes # Name Fields PRIMARY uid nickname nickname(32) parent-uid parent-uid guid guid email email(64) Foreign Keys # Field Target Table Target Field parent-uid user uid Return to database documentation","title":"user"},{"location":"spec/database/db_user/#table-user","text":"The local users","title":"Table user"},{"location":"spec/database/db_user/#fields","text":"Field Description Type Null Key Default Extra uid sequential ID mediumint unsigned NO PRI NULL auto_increment parent-uid The parent user that has full control about this user mediumint unsigned YES NULL guid A unique identifier for this user varchar(64) NO username Name that this user is known by varchar(255) NO password encrypted password varchar(255) NO legacy_password Is the password hash double-hashed? boolean NO 0 nickname nick- and user name varchar(255) NO email the users email address varchar(255) NO openid varchar(255) NO timezone PHP-legal timezone varchar(128) NO language default language varchar(32) NO en register_date timestamp of registration datetime NO 0001-01-01 00:00:00 login_date timestamp of last login datetime NO 0001-01-01 00:00:00 default-location Default for item.location varchar(255) NO allow_location 1 allows to display the location boolean NO 0 theme user theme preference varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL spubkey text YES NULL sprvkey text YES NULL verified user is verified through email boolean NO 0 blocked 1 for user is blocked boolean NO 0 blockwall Prohibit contacts to post to the profile page of the user boolean NO 0 hidewall Hide profile details from unkown viewers boolean NO 0 blocktags Prohibit contacts to tag the post of this user boolean NO 0 unkmail Permit unknown people to send private mails to this user boolean NO 0 cntunkmail int unsigned NO 10 notify-flags email notification options smallint unsigned NO 65535 page-flags page/profile type tinyint unsigned NO 0 account-type tinyint unsigned NO 0 prvnets boolean NO 0 pwdreset Password reset request token varchar(255) YES NULL pwdreset_time Timestamp of the last password reset request datetime YES NULL maxreq int unsigned NO 10 expire int unsigned NO 0 account_removed if 1 the account is removed boolean NO 0 account_expired boolean NO 0 account_expires_on timestamp when account expires and will be deleted datetime NO 0001-01-01 00:00:00 expire_notification_sent timestamp of last warning of account expiration datetime NO 0001-01-01 00:00:00 def_gid int unsigned NO 0 allow_cid default permission for this user mediumtext YES NULL allow_gid default permission for this user mediumtext YES NULL deny_cid default permission for this user mediumtext YES NULL deny_gid default permission for this user mediumtext YES NULL openidserver text YES NULL","title":"Fields"},{"location":"spec/database/db_user/#indexes","text":"Name Fields PRIMARY uid nickname nickname(32) parent-uid parent-uid guid guid email email(64)","title":"Indexes"},{"location":"spec/database/db_user/#foreign-keys","text":"Field Target Table Target Field parent-uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"spec/database/db_userd/","tags":["database","table","developer"],"text":"Table userd # Deleted usernames Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment username varchar(255) NO NULL Indexes # Name Fields PRIMARY id username username(32) Return to database documentation","title":"userd"},{"location":"spec/database/db_userd/#table-userd","text":"Deleted usernames","title":"Table userd"},{"location":"spec/database/db_userd/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment username varchar(255) NO NULL","title":"Fields"},{"location":"spec/database/db_userd/#indexes","text":"Name Fields PRIMARY id username username(32) Return to database documentation","title":"Indexes"},{"location":"spec/database/db_verb/","tags":["database","table","developer"],"text":"Table verb # Activity Verbs Fields # Field Description Type Null Key Default Extra id smallint unsigned NO PRI NULL auto_increment name varchar(100) NO Indexes # Name Fields PRIMARY id name name Return to database documentation","title":"verb"},{"location":"spec/database/db_verb/#table-verb","text":"Activity Verbs","title":"Table verb"},{"location":"spec/database/db_verb/#fields","text":"Field Description Type Null Key Default Extra id smallint unsigned NO PRI NULL auto_increment name varchar(100) NO","title":"Fields"},{"location":"spec/database/db_verb/#indexes","text":"Name Fields PRIMARY id name name Return to database documentation","title":"Indexes"},{"location":"spec/database/db_worker-ipc/","tags":["database","table","developer"],"text":"Table worker-ipc # Inter process communication between the frontend and the worker Fields # Field Description Type Null Key Default Extra key int NO PRI NULL jobs Flag for outstanding jobs boolean YES NULL Indexes # Name Fields PRIMARY key Return to database documentation","title":"worker-ipc"},{"location":"spec/database/db_worker-ipc/#table-worker-ipc","text":"Inter process communication between the frontend and the worker","title":"Table worker-ipc"},{"location":"spec/database/db_worker-ipc/#fields","text":"Field Description Type Null Key Default Extra key int NO PRI NULL jobs Flag for outstanding jobs boolean YES NULL","title":"Fields"},{"location":"spec/database/db_worker-ipc/#indexes","text":"Name Fields PRIMARY key Return to database documentation","title":"Indexes"},{"location":"spec/database/db_workerqueue/","tags":["database","table","developer"],"text":"Table workerqueue # Background tasks queue entries Fields # Field Description Type Null Key Default Extra id Auto incremented worker task id int unsigned NO PRI NULL auto_increment command Task command varchar(100) YES NULL parameter Task parameter mediumtext YES NULL priority Task priority tinyint unsigned NO 0 created Creation date datetime NO 0001-01-01 00:00:00 pid Process id of the worker int unsigned NO 0 executed Execution date datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 retrial Retrial counter tinyint NO 0 done Marked 1 when the task was done - will be deleted later boolean NO 0 Indexes # Name Fields PRIMARY id command command done_command_parameter done, command, parameter(64) done_executed done, executed done_priority_retrial_created done, priority, retrial, created done_priority_next_try done, priority, next_try done_pid_next_try done, pid, next_try done_pid_retrial done, pid, retrial done_pid_priority_created done, pid, priority, created Return to database documentation","title":"workerqueue"},{"location":"spec/database/db_workerqueue/#table-workerqueue","text":"Background tasks queue entries","title":"Table workerqueue"},{"location":"spec/database/db_workerqueue/#fields","text":"Field Description Type Null Key Default Extra id Auto incremented worker task id int unsigned NO PRI NULL auto_increment command Task command varchar(100) YES NULL parameter Task parameter mediumtext YES NULL priority Task priority tinyint unsigned NO 0 created Creation date datetime NO 0001-01-01 00:00:00 pid Process id of the worker int unsigned NO 0 executed Execution date datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 retrial Retrial counter tinyint NO 0 done Marked 1 when the task was done - will be deleted later boolean NO 0","title":"Fields"},{"location":"spec/database/db_workerqueue/#indexes","text":"Name Fields PRIMARY id command command done_command_parameter done, command, parameter(64) done_executed done, executed done_priority_retrial_created done, priority, retrial, created done_priority_next_try done, priority, next_try done_pid_next_try done, pid, next_try done_pid_retrial done, pid, retrial done_pid_priority_created done, pid, priority, created Return to database documentation","title":"Indexes"},{"location":"spec/protocol/message-flow/","tags":["specification","federation"],"text":"Friendica Message Flow # This page documents some details of how messages get from one person to another in the Friendica network. There are multiple paths, using multiple protocols and message formats. Those attempting to understand these message flows should become familiar with (at the minimum) the DFRN protocol document and the message passing elements of the OStatus stack (salmon and Pubsubhubbub). When a message is posted, all immediate deliveries to all networks are made using include/notifier.php, which chooses how (and to whom) to deliver the message. This file also invokes the local side of all deliveries including DFRN-notify. mod/dfrn_notify.php handles the remote side of DFRN-notify. Local feeds are generated by mod/dfrn_poll.php - which also handles the remote side of DFRN-poll protocol. Salmon notifications arrive via mod/salmon.php. Push (pubsubhubbub) feeds arrive via mod/pubsub.php DFRN-poll feed imports arrive via src/Worker/OnePoll.php as a scheduled task, this implements the local side of the DFRN-poll protocol. Scenario #1. Bob posts a public status message # This is a public message with no conversation members so no private transport is used. There are two paths it can take - as a bbcode path to DFRN clients, and converted to HTML with the server's PuSH (pubsubhubbub) hubs notified. When a PuSH hub is operational, dfrn-poll clients prefer to receive their information through the PuSH channel. They will fall back on a daily poll in case the hub has delivery issues (this is quite common when using the default Google reference hub). If there is no specified hub or hubs, DFRN clients will poll at a configurable (per-contact) rate at up to 5-minute intervals. Feeds retrieved via dfrn-poll are bbcode and may also contain private conversations which the worker has permissions to see. Scenario #2. Jack replies to Bob's public message. Jack is on the Friendica/DFRN network. # Jack uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation using dfrn-notify. PuSH hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks). Scenario #3. Mary replies to Bob's public message. Mary is on the Friendica/DFRN network. # Mary uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation (excluding himself, the conversation is now sent to both Jack and Mary). Messages are sent using dfrn-notify. Push hubs are also notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks). Scenario #4. William replies to Bob's public message. William is on the OStatus network. # William uses salmon to notify Bob of the reply. Content is html embedded in salmon magic envelope. Bob then creates a feed of the conversation and sends it to all Friendica participants involved in the conversation using dfrn-notify (excluding himself, the conversation is sent to both Jack and Mary). Push hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks). Scenario #5. Bob posts a private message to Mary and Jack. # Message is delivered immediately to Mary and Jack using dfrn_notify. Public hubs are not notified. Requeueing is attempted in case of timeout. Replies follow the same flow as the public replies except that hubs are not notified and message is never made available in the public feed. The entire conversation is also made available to Mary and Jack (and nobody else) through their dfrn-poll personalised feed.","title":"Message Flow"},{"location":"spec/protocol/message-flow/#friendica-message-flow","text":"This page documents some details of how messages get from one person to another in the Friendica network. There are multiple paths, using multiple protocols and message formats. Those attempting to understand these message flows should become familiar with (at the minimum) the DFRN protocol document and the message passing elements of the OStatus stack (salmon and Pubsubhubbub). When a message is posted, all immediate deliveries to all networks are made using include/notifier.php, which chooses how (and to whom) to deliver the message. This file also invokes the local side of all deliveries including DFRN-notify. mod/dfrn_notify.php handles the remote side of DFRN-notify. Local feeds are generated by mod/dfrn_poll.php - which also handles the remote side of DFRN-poll protocol. Salmon notifications arrive via mod/salmon.php. Push (pubsubhubbub) feeds arrive via mod/pubsub.php DFRN-poll feed imports arrive via src/Worker/OnePoll.php as a scheduled task, this implements the local side of the DFRN-poll protocol.","title":"Friendica Message Flow"},{"location":"spec/protocol/message-flow/#scenario-1-bob-posts-a-public-status-message","text":"This is a public message with no conversation members so no private transport is used. There are two paths it can take - as a bbcode path to DFRN clients, and converted to HTML with the server's PuSH (pubsubhubbub) hubs notified. When a PuSH hub is operational, dfrn-poll clients prefer to receive their information through the PuSH channel. They will fall back on a daily poll in case the hub has delivery issues (this is quite common when using the default Google reference hub). If there is no specified hub or hubs, DFRN clients will poll at a configurable (per-contact) rate at up to 5-minute intervals. Feeds retrieved via dfrn-poll are bbcode and may also contain private conversations which the worker has permissions to see.","title":"Scenario #1. Bob posts a public status message"},{"location":"spec/protocol/message-flow/#scenario-2-jack-replies-to-bobs-public-message-jack-is-on-the-friendicadfrn-network","text":"Jack uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation using dfrn-notify. PuSH hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).","title":"Scenario #2. Jack replies to Bob's public message. Jack is on the Friendica/DFRN network."},{"location":"spec/protocol/message-flow/#scenario-3-mary-replies-to-bobs-public-message-mary-is-on-the-friendicadfrn-network","text":"Mary uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation (excluding himself, the conversation is now sent to both Jack and Mary). Messages are sent using dfrn-notify. Push hubs are also notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).","title":"Scenario #3. Mary replies to Bob's public message. Mary is on the Friendica/DFRN network."},{"location":"spec/protocol/message-flow/#scenario-4-william-replies-to-bobs-public-message-william-is-on-the-ostatus-network","text":"William uses salmon to notify Bob of the reply. Content is html embedded in salmon magic envelope. Bob then creates a feed of the conversation and sends it to all Friendica participants involved in the conversation using dfrn-notify (excluding himself, the conversation is sent to both Jack and Mary). Push hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).","title":"Scenario #4. William replies to Bob's public message. William is on the OStatus network."},{"location":"spec/protocol/message-flow/#scenario-5-bob-posts-a-private-message-to-mary-and-jack","text":"Message is delivered immediately to Mary and Jack using dfrn_notify. Public hubs are not notified. Requeueing is attempted in case of timeout. Replies follow the same flow as the public replies except that hubs are not notified and message is never made available in the public feed. The entire conversation is also made available to Mary and Jack (and nobody else) through their dfrn-poll personalised feed.","title":"Scenario #5. Bob posts a private message to Mary and Jack."},{"location":"spec/protocol/protocol/","tags":["specification"],"text":"Used Protocols # Friendicas DFRN Protocol # Document with the DFRN specification Schema of the contact request process Schema of the contact request confirmation Description of the message flow ActivityStreams # Friendica is using ActivityStreams in version 1.0 for its activities and object types. Additional types are used for non-standard activities. Link to the specification List of used ActivityStreams verbs and object types. Salmon # Salmon is used as a message exchange protocol for replies and mentions. Link to the protocol summary Portable Contacts # Portable Contacts is used for friends lists. Link to the specification (Link to archive.org) pubsubhubbub # pubsubhubbub is used for OStatus. Link to the specification","title":"Protocols"},{"location":"spec/protocol/protocol/#used-protocols","text":"","title":"Used Protocols"},{"location":"spec/protocol/protocol/#friendicas-dfrn-protocol","text":"Document with the DFRN specification Schema of the contact request process Schema of the contact request confirmation Description of the message flow","title":"Friendicas DFRN Protocol"},{"location":"spec/protocol/protocol/#activitystreams","text":"Friendica is using ActivityStreams in version 1.0 for its activities and object types. Additional types are used for non-standard activities. Link to the specification List of used ActivityStreams verbs and object types.","title":"ActivityStreams"},{"location":"spec/protocol/protocol/#salmon","text":"Salmon is used as a message exchange protocol for replies and mentions. Link to the protocol summary","title":"Salmon"},{"location":"spec/protocol/protocol/#portable-contacts","text":"Portable Contacts is used for friends lists. Link to the specification (Link to archive.org)","title":"Portable Contacts"},{"location":"spec/protocol/protocol/#pubsubhubbub","text":"pubsubhubbub is used for OStatus. Link to the specification","title":"pubsubhubbub"},{"location":"user/accesskeys/","tags":["user","shortcuts","accesskeys"],"text":"Access-keys reference # Access keys are keyboard shortcuts that allow you to easily navigate the user interface. Access keys are currently not available with the Frio theme. The specific key combinations depend on how your browser's the modifier key setting. For an overview of modifier keys in different browsers, have a look at Wikipedia article. For example, for moving to profile page in Firefox, press these three keys simultaneously. [Shift] [Alt] [p] General # p - Profile n - Network c - Community s - Search a - Admin f - Notifications u - User menu community # l - Local community g - Global community profile # m - Status Messages and Posts r - Profile Details h - Photo Albums d - Media e - Events and Calendar t - Personal Notes o - Scheduled Posts k - View Contacts contacts (contact list) # g - Suggestions l - Show all Contacts o - Only show unblocked contacts b - Only show blocked contacts i - Only show ignored contacts y - Only show archived contacts h - Only show hidden contacts e - Edit contact groups contact (single contact view) # m - Status messages p - Posts and Comments d - Media o - Profile t - Contacts r - Advanced message # m - New message network # e - Sort by Comment Date t - Sort by Receipt Date q - Sort by Creation Date r - Conversation (Posts that mention or involve you) w - New posts m - Favourite Posts notifications # y - System w - Network r - Personal h - Home i - Introductions settings # o - Account 2 - Two-factor authentication p - Profiles t - Additional features w - Social Networks l - Addons d - Delegations b - Connected apps e - Export personal data r - Remove account","title":"Accesskeys"},{"location":"user/accesskeys/#access-keys-reference","text":"Access keys are keyboard shortcuts that allow you to easily navigate the user interface. Access keys are currently not available with the Frio theme. The specific key combinations depend on how your browser's the modifier key setting. For an overview of modifier keys in different browsers, have a look at Wikipedia article. For example, for moving to profile page in Firefox, press these three keys simultaneously. [Shift] [Alt] [p]","title":"Access-keys reference"},{"location":"user/accesskeys/#general","text":"p - Profile n - Network c - Community s - Search a - Admin f - Notifications u - User menu","title":"General"},{"location":"user/accesskeys/#community","text":"l - Local community g - Global community","title":"community"},{"location":"user/accesskeys/#profile","text":"m - Status Messages and Posts r - Profile Details h - Photo Albums d - Media e - Events and Calendar t - Personal Notes o - Scheduled Posts k - View Contacts","title":"profile"},{"location":"user/accesskeys/#contacts-contact-list","text":"g - Suggestions l - Show all Contacts o - Only show unblocked contacts b - Only show blocked contacts i - Only show ignored contacts y - Only show archived contacts h - Only show hidden contacts e - Edit contact groups","title":"contacts (contact list)"},{"location":"user/accesskeys/#contact-single-contact-view","text":"m - Status messages p - Posts and Comments d - Media o - Profile t - Contacts r - Advanced","title":"contact (single contact view)"},{"location":"user/accesskeys/#message","text":"m - New message","title":"message"},{"location":"user/accesskeys/#network","text":"e - Sort by Comment Date t - Sort by Receipt Date q - Sort by Creation Date r - Conversation (Posts that mention or involve you) w - New posts m - Favourite Posts","title":"network"},{"location":"user/accesskeys/#notifications","text":"y - System w - Network r - Personal h - Home i - Introductions","title":"notifications"},{"location":"user/accesskeys/#settings","text":"o - Account 2 - Two-factor authentication p - Profiles t - Additional features w - Social Networks l - Addons d - Delegations b - Connected apps e - Export personal data r - Remove account","title":"settings"},{"location":"user/keyboard-shortcuts/","tags":["user","accesskeys","shortcuts"],"text":"Keyboard shortcuts in Friendica # General # j: Scroll to next thread k: Scroll to previous thread","title":"Shortcuts"},{"location":"user/keyboard-shortcuts/#keyboard-shortcuts-in-friendica","text":"","title":"Keyboard shortcuts in Friendica"},{"location":"user/keyboard-shortcuts/#general","text":"j: Scroll to next thread k: Scroll to previous thread","title":"General"},{"location":"user/making-friends/","tags":["user"],"text":"Making Friends # Friendship in Friendica can sometimes take on different meaning. But let's keep it simple; you want to be friends with somebody. How do you do it? The Directories # Friendica has two different kinds of \"address book\". The directory of the Friendica server you are registered on and a global directory to which your and other Friendica servers submit account information. The first thing you can do is look at the Directory . The directory is split up into two parts. If you click the directory button, you will be presented with a list of all members (who chose to be listed) on your server. You'll also see a link to a Global Directory . There are several global directories across the globe that regularly exchange information with each other. The specific global directory that you see usually depends on where your server is located. If you click through to the global directory, you will be presented with a list of everybody who chooses to be listed across all instances of Friendica. You will also see a \"Show Community Forums\" link, which will direct you to Groups, Forums and Fanpages. You connect to people, groups and forums in the same way, except groups and forums will automatically accept your introduction request, whereas a human will approve you manually. Connect to other Friendica users # Visit their profile. Just beneath their profile picture will be the word 'Connect' (we're assuming this is an English language profile). Click that 'Connect' button, and it will take you to a 'Connect' form. The form is going to ask you for your Identity Address. This is necessary so that this person's website can find yours. If your Friendica site is called \"demo.friendica.com\" and your username/nickname on that site is \"bob\", you would enter \"bob@demo.friendica.com\" in this form. Notice this looks just like an email address. It's meant to be that way. It's easy for people to remember. You could also put in the URL of your \"home\" page, such as \"http://demo.friendica.com/profile/bob\" instead of the email-style address. When you've submitted the connection page, it will take you back to your own site where you must then log in (if necessary) and verify the connection request on your site. Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request). If you already know somebody's Identity Address, you can enter it in the \"connect\" box on your \"Contacts\" page. This will take you through a similar process. Connect to users of alternate networks # Across the Federation and Fedivese # You can also use your Identity Address or other people's Identity Addresses to become friends across the so-called Federation/Fedivese of open source social media. Currently, Friendica supports connections with people on diaspora*, Red, Hubzilla, GNU Social, StatusNet, Mastodon, Pleroma, socialhome, and ganggo platforms. If you know (for instance) \"alice\" on gnusocial.net (a GNU Social site) you could put alice@gnusocial.net into your Contact page and become friends across networks. Likewise, you can put in the URL to Alice's gnusocial.net page, if you wish. Note: Some versions of GNU Social software may require the full URL to your profile and may not work with the identity address. People on these networks can also initiate contact with you, if they know your contact details. Other social media # If your server provides this functionality, you can also connect with people one Twitter or important feeds from Tumblr, WordPress, and many more. To connect, enter their contact details in the \"connect\" box on your \"Contacts\" page. Email # If you have supplied your mailbox connection information on your Settings page, you can enter the email address of anybody that has sent you a message recently and have their email messages show up in your social stream. You can also reply to them from within Friendica. Create an email contact with for example Alice on Gmail, enter her email in following format \"mailto:alice@gmail.no\". In order to avoid abuse or spam, you must have an email from Alice with the correct email address in your email inbox. Subscribing to mailing lists is done in the same way, but without the use of the \"mailto:\" prefix. To subscribe to a mailing list, enter the email in following example format \"mailling-list@list-server.net\". Syndication feeds # You can \"follow\" almost anybody or any website that produces a syndication feed (RSS/Atom,etc.). If we can find an information stream and a name to attach to the contact, we'll try to connect with them. Notification # When somebody requests friendship you will receive a notification. You will usually need to approve this before the friendship is complete. Approval # Some networks allow people to send you messages without being friends and without your approval. Friendica does not allow this by default, as it would open a gateway for spam. Unilateral or bilateral friendships # When you receive a friendship notification from another Friendica member, you will have the option of allowing them as a \"Follower\" or as a \"Friend\". If they are a follower, they can see what you have to say, including private communications that you send to them, but not vice versa. As a friend, you can both communicate with each other. diaspora* uses a different terminology, and you are given the option of allowing them to \"share with you\", or being full friends. Ignoring, blocking and deleting contacts # Once you have become friends, if you find the person constantly sends you spam or worthless information, you can \"Ignore\" them - without breaking off the friendship or even alerting them to the fact that you aren't interested in anything they are saying. In many ways they are like a \"follower\" - but they don't know this. They think they are a friend. You can also \"block\" a person. This completely blocks communications with that person. They may still be able to see your public posts, as can anybody in the world, but they cannot communicate with you directly. You can also delete a friend no matter what the friendship status - which completely removes everything relating to that person from your website.","title":"Making friends"},{"location":"user/making-friends/#making-friends","text":"Friendship in Friendica can sometimes take on different meaning. But let's keep it simple; you want to be friends with somebody. How do you do it?","title":"Making Friends"},{"location":"user/making-friends/#the-directories","text":"Friendica has two different kinds of \"address book\". The directory of the Friendica server you are registered on and a global directory to which your and other Friendica servers submit account information. The first thing you can do is look at the Directory . The directory is split up into two parts. If you click the directory button, you will be presented with a list of all members (who chose to be listed) on your server. You'll also see a link to a Global Directory . There are several global directories across the globe that regularly exchange information with each other. The specific global directory that you see usually depends on where your server is located. If you click through to the global directory, you will be presented with a list of everybody who chooses to be listed across all instances of Friendica. You will also see a \"Show Community Forums\" link, which will direct you to Groups, Forums and Fanpages. You connect to people, groups and forums in the same way, except groups and forums will automatically accept your introduction request, whereas a human will approve you manually.","title":"The Directories"},{"location":"user/making-friends/#connect-to-other-friendica-users","text":"Visit their profile. Just beneath their profile picture will be the word 'Connect' (we're assuming this is an English language profile). Click that 'Connect' button, and it will take you to a 'Connect' form. The form is going to ask you for your Identity Address. This is necessary so that this person's website can find yours. If your Friendica site is called \"demo.friendica.com\" and your username/nickname on that site is \"bob\", you would enter \"bob@demo.friendica.com\" in this form. Notice this looks just like an email address. It's meant to be that way. It's easy for people to remember. You could also put in the URL of your \"home\" page, such as \"http://demo.friendica.com/profile/bob\" instead of the email-style address. When you've submitted the connection page, it will take you back to your own site where you must then log in (if necessary) and verify the connection request on your site. Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request). If you already know somebody's Identity Address, you can enter it in the \"connect\" box on your \"Contacts\" page. This will take you through a similar process.","title":"Connect to other Friendica users"},{"location":"user/making-friends/#connect-to-users-of-alternate-networks","text":"","title":"Connect to users of alternate networks"},{"location":"user/making-friends/#across-the-federation-and-fedivese","text":"You can also use your Identity Address or other people's Identity Addresses to become friends across the so-called Federation/Fedivese of open source social media. Currently, Friendica supports connections with people on diaspora*, Red, Hubzilla, GNU Social, StatusNet, Mastodon, Pleroma, socialhome, and ganggo platforms. If you know (for instance) \"alice\" on gnusocial.net (a GNU Social site) you could put alice@gnusocial.net into your Contact page and become friends across networks. Likewise, you can put in the URL to Alice's gnusocial.net page, if you wish. Note: Some versions of GNU Social software may require the full URL to your profile and may not work with the identity address. People on these networks can also initiate contact with you, if they know your contact details.","title":"Across the Federation and Fedivese"},{"location":"user/making-friends/#other-social-media","text":"If your server provides this functionality, you can also connect with people one Twitter or important feeds from Tumblr, WordPress, and many more. To connect, enter their contact details in the \"connect\" box on your \"Contacts\" page.","title":"Other social media"},{"location":"user/making-friends/#email","text":"If you have supplied your mailbox connection information on your Settings page, you can enter the email address of anybody that has sent you a message recently and have their email messages show up in your social stream. You can also reply to them from within Friendica. Create an email contact with for example Alice on Gmail, enter her email in following format \"mailto:alice@gmail.no\". In order to avoid abuse or spam, you must have an email from Alice with the correct email address in your email inbox. Subscribing to mailing lists is done in the same way, but without the use of the \"mailto:\" prefix. To subscribe to a mailing list, enter the email in following example format \"mailling-list@list-server.net\".","title":"Email"},{"location":"user/making-friends/#syndication-feeds","text":"You can \"follow\" almost anybody or any website that produces a syndication feed (RSS/Atom,etc.). If we can find an information stream and a name to attach to the contact, we'll try to connect with them.","title":"Syndication feeds"},{"location":"user/making-friends/#notification","text":"When somebody requests friendship you will receive a notification. You will usually need to approve this before the friendship is complete.","title":"Notification"},{"location":"user/making-friends/#approval","text":"Some networks allow people to send you messages without being friends and without your approval. Friendica does not allow this by default, as it would open a gateway for spam.","title":"Approval"},{"location":"user/making-friends/#unilateral-or-bilateral-friendships","text":"When you receive a friendship notification from another Friendica member, you will have the option of allowing them as a \"Follower\" or as a \"Friend\". If they are a follower, they can see what you have to say, including private communications that you send to them, but not vice versa. As a friend, you can both communicate with each other. diaspora* uses a different terminology, and you are given the option of allowing them to \"share with you\", or being full friends.","title":"Unilateral or bilateral friendships"},{"location":"user/making-friends/#ignoring-blocking-and-deleting-contacts","text":"Once you have become friends, if you find the person constantly sends you spam or worthless information, you can \"Ignore\" them - without breaking off the friendship or even alerting them to the fact that you aren't interested in anything they are saying. In many ways they are like a \"follower\" - but they don't know this. They think they are a friend. You can also \"block\" a person. This completely blocks communications with that person. They may still be able to see your public posts, as can anybody in the world, but they cannot communicate with you directly. You can also delete a friend no matter what the friendship status - which completely removes everything relating to that person from your website.","title":"Ignoring, blocking and deleting contacts"},{"location":"user/two-factor-authentication/","tags":["user"],"text":"Configuring two-factor authentication # You can configure two-factor authentication using a mobile app. A time-based one-time password (TOTP) application automatically generates an authentication code that changes after a certain period of time. Tip : To configure authentication via TOTP on multiple devices, during setup, scan the QR code using each device at the same time. If 2FA is already enabled, and you want to add another device, you must re-configure 2FA from your security settings. Enabling two-factor authentication # 1. Download an authenticator app # Any authenticator app should work with Friendica. Nonetheless, we recommend: For iOS, Matt Rubin's MIT-licensed Authenticator app . For Android, andOTP . 2. Record your one-use recovery codes # From your two-factor authentication user settings ( https://your-site.info/settings/2fa ), enter your password and click on \"Enable two-factor authentication\". You will be presented with a list of one-use recovery codes. Please save those in the same place you are saving your Friendica password (ideally, in a password manager like KeePass ). When you're done, click on \"Next\". 3. Set up your authenticator app # You have three methods to set up your authenticator app: Scan the QR Code with your device camera. This will automatically configure your account on the app. Click/tap on the provided totp:// URl. Ideally your authenticator app should be called with this URL and set up your account. Enter your account settings manually. Friendica is using default settings for token type, code digit count and hashing algorithm, but you may be required to enter them in your app. Tip : If you have multiple devices, configure them all at this point. Then verify your app is correctly configured by submitting a code provided by your app. This will conclude two-factor authentication configuration. Note: If you leave this screen at any point without having submitted a verification code, two-factor authentication won't be enabled on your account. To complete the configuration, just come back to your two-factor authentication user settings and click on \"Finish configuration\" after entering your current password. Disabling two-factor authentication # You can disable two-factor authentication at any time by going to your two-factor authentication user settings and click on \"Disable two-factor authentication\" after entering your current password. You should remove your Friendica account from your authenticator app as it won't work again even if you reenable two-factor authentication. In this case you will have to configure your authenticator app again using the process above. Managing your one-time recovery codes # When two-factor authentication is enabled, you can show your recovery codes, including the ones you've already used. You can freely regenerate a new set of fresh recovery codes, just be sure to replace the previous ones where you saved them as they won't be active anymore. Third-party applications and API # Third-party applications using the Friendica API can't accept two-factor time-based authentication codes. Instead, if you enabled two-factor authentication, you have to generate app-specific randomly generated long passwords to use in your apps instead of your regular account password. Note : Your regular password won't work at all when prompted in third-party apps if you enabled two-factor authentication. You can generate as many app-specific passwords as you want, they will be shown once to you just after you generated it. Just copy and paste it in your third-party app in the Friendica account password input field at this point. We recommend generating a single app-specific password for each separate third-party app you are using, using a meaningful description of the target app (like \"Frienqa on my Fairphone 2\"). You can also revoke any and all app-specific password you generated this way. This may log you out of the third-party application(s) you used the revoked app-specific password to log in with. Trusted browsers # As a convenience, during two-factor authentication it is possible to identify a browser as trusted. This will skip all further two-factor authentication prompt on this browser. You can remove any or all of these trusted browsers in the two-factor authentication settings.","title":"2FA"},{"location":"user/two-factor-authentication/#configuring-two-factor-authentication","text":"You can configure two-factor authentication using a mobile app. A time-based one-time password (TOTP) application automatically generates an authentication code that changes after a certain period of time. Tip : To configure authentication via TOTP on multiple devices, during setup, scan the QR code using each device at the same time. If 2FA is already enabled, and you want to add another device, you must re-configure 2FA from your security settings.","title":"Configuring two-factor authentication"},{"location":"user/two-factor-authentication/#enabling-two-factor-authentication","text":"","title":"Enabling two-factor authentication"},{"location":"user/two-factor-authentication/#1-download-an-authenticator-app","text":"Any authenticator app should work with Friendica. Nonetheless, we recommend: For iOS, Matt Rubin's MIT-licensed Authenticator app . For Android, andOTP .","title":"1. Download an authenticator app"},{"location":"user/two-factor-authentication/#2-record-your-one-use-recovery-codes","text":"From your two-factor authentication user settings ( https://your-site.info/settings/2fa ), enter your password and click on \"Enable two-factor authentication\". You will be presented with a list of one-use recovery codes. Please save those in the same place you are saving your Friendica password (ideally, in a password manager like KeePass ). When you're done, click on \"Next\".","title":"2. Record your one-use recovery codes"},{"location":"user/two-factor-authentication/#3-set-up-your-authenticator-app","text":"You have three methods to set up your authenticator app: Scan the QR Code with your device camera. This will automatically configure your account on the app. Click/tap on the provided totp:// URl. Ideally your authenticator app should be called with this URL and set up your account. Enter your account settings manually. Friendica is using default settings for token type, code digit count and hashing algorithm, but you may be required to enter them in your app. Tip : If you have multiple devices, configure them all at this point. Then verify your app is correctly configured by submitting a code provided by your app. This will conclude two-factor authentication configuration. Note: If you leave this screen at any point without having submitted a verification code, two-factor authentication won't be enabled on your account. To complete the configuration, just come back to your two-factor authentication user settings and click on \"Finish configuration\" after entering your current password.","title":"3. Set up your authenticator app"},{"location":"user/two-factor-authentication/#disabling-two-factor-authentication","text":"You can disable two-factor authentication at any time by going to your two-factor authentication user settings and click on \"Disable two-factor authentication\" after entering your current password. You should remove your Friendica account from your authenticator app as it won't work again even if you reenable two-factor authentication. In this case you will have to configure your authenticator app again using the process above.","title":"Disabling two-factor authentication"},{"location":"user/two-factor-authentication/#managing-your-one-time-recovery-codes","text":"When two-factor authentication is enabled, you can show your recovery codes, including the ones you've already used. You can freely regenerate a new set of fresh recovery codes, just be sure to replace the previous ones where you saved them as they won't be active anymore.","title":"Managing your one-time recovery codes"},{"location":"user/two-factor-authentication/#third-party-applications-and-api","text":"Third-party applications using the Friendica API can't accept two-factor time-based authentication codes. Instead, if you enabled two-factor authentication, you have to generate app-specific randomly generated long passwords to use in your apps instead of your regular account password. Note : Your regular password won't work at all when prompted in third-party apps if you enabled two-factor authentication. You can generate as many app-specific passwords as you want, they will be shown once to you just after you generated it. Just copy and paste it in your third-party app in the Friendica account password input field at this point. We recommend generating a single app-specific password for each separate third-party app you are using, using a meaningful description of the target app (like \"Frienqa on my Fairphone 2\"). You can also revoke any and all app-specific password you generated this way. This may log you out of the third-party application(s) you used the revoked app-specific password to log in with.","title":"Third-party applications and API"},{"location":"user/two-factor-authentication/#trusted-browsers","text":"As a convenience, during two-factor authentication it is possible to identify a browser as trusted. This will skip all further two-factor authentication prompt on this browser. You can remove any or all of these trusted browsers in the two-factor authentication settings.","title":"Trusted browsers"},{"location":"en/developer/addon-storage-backend/","tags":["addon","developer"],"text":"Friendica Storage Backend Addon development # Storage backends can be added via addons. A storage backend is implemented as a class, and the plugin register the class to make it available to the system. The Storage Backend Class # The class must live in Friendica\\Addon\\youraddonname namespace, where youraddonname the folder name of your addon. There are two different interfaces you need to implement. ICanWriteToStorage # The class must implement Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage interface. All method in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; interface ICanWriteToStorage { public function get ( string $reference ); public function put ( string $data , string $reference = '' ); public function delete ( string $reference ); public function __toString (); public static function getName (); } get(string $reference) returns data pointed by $reference put(string $data, string $reference) saves data in $data to position $reference , or a new position if $reference is empty. delete(string $reference) delete data pointed by $reference ICanConfigureStorage # Each storage backend can have options the admin can set in admin page. To make the options possible, you need to implement the Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage interface. All methods in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; interface ICanConfigureStorage { public function getOptions (); public function saveOptions ( array $data ); } getOptions() returns an array with details about each option to build the interface. saveOptions(array $data) get $data from admin page, validate it and save it. The array returned by getOptions() is defined as: [ 'option1name' => [ ..info.. ], 'option2name' => [ ..info.. ], ... ] An empty array can be returned if backend doesn't have any options. The info array for each option is defined as: [ 'type', define the field used in form, and the type of data. one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea' 'label', Translatable label of the field. This label will be shown in admin page value, Current value of the option 'help text', Translatable description for the field. Will be shown in admin page extra data Optional. Depends on which 'type' this option is: 'select': array [ value => label ] of choices 'intcheckbox': value of input element 'select_raw': prebuild html string of <option > tags Each label should be translatable ]; See doxygen documentation of IWritableStorage interface for details about each method. Register a storage backend class # Each backend must be registered in the system when the plugin is installed, to be aviable. DI::facStorage()->register(string $class) is used to register the backend class. When the plugin is uninstalled, registered backends must be unregistered using DI::facStorage()->unregister(string $class) . You have to register a new hook in your addon, listening on storage_instance(App $a, array $data) . In case $data['name'] is your storage class name, you have to instance a new instance of your Friendica\\Core\\Storage\\Capability\\ICanReadFromStorage class. Set the instance of your class as $data['storage'] to pass it back to the backend. This is necessary because it isn't always clear, if you need further construction arguments. Adding tests # Currently testing is limited to core Friendica only, this shows theoretically how tests should work in the future Each new Storage class should be added to the test-environment at Storage Tests . Add a new test class which's naming convention is StorageClassTest , which extend the StorageTest in the same directory. Override the two necessary instances: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; abstract class StorageTest { // returns an instance of your newly created storage class abstract protected function getInstance(); // Assertion for the option array you return for your new StorageClass abstract protected function assertOption(ICanWriteToStorage $storage); } Exception handling # There are two intended types of exceptions for storages ReferenceStorageExecption # This storage exception should be used in case the caller tries to use an invalid references. This could happen in case the caller tries to delete or update an unknown reference. The implementation of the storage backend must not ignore invalid references. Avoid throwing the common StorageExecption instead of the ReferenceStorageException at this particular situation! StorageException # This is the common exception in case unexpected errors happen using the storage backend. If there's a predecessor to this exception (e.g. you caught an exception and are throwing this execption), you should add the predecessor for transparency reasons. Example: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; class ExampleStorage implements ICanWriteToStorage { public function get(string $reference) : string { try { throw new Exception('a real bad exception'); } catch (Exception $exception) { throw new \\Friendica\\Core\\Storage\\Exception\\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception); } } } Example # Here is a hypothetical addon which register a useless storage backend. Let's call it samplestorage . This backend will discard all data we try to save and will return always the same image when we ask for some data. The image returned can be set by the administrator in admin page. First, the backend class. The file will be addon/samplestorage/SampleStorageBackend.php : <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackend implements ICanWriteToStorage { const NAME = 'Sample Storage' ; /** @var string */ private $filename ; /** * SampleStorageBackend constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( string $filename ) { $this -> filename = $filename ; } public function get ( string $reference ) { // we return always the same image data. Which file we load is defined by // a config key return file_get_contents ( $this -> filename ); } public function put ( string $data , string $reference = '' ) { if ( $reference === '' ) { $reference = 'sample' ; } // we don't save $data ! return $reference ; } public function delete ( string $reference ) { // we pretend to delete the data return true ; } public function __toString () { return self :: NAME ; } public static function getName () { return self :: NAME ; } } <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackendConfig implements ICanConfigureStorage { /** @var \\Friendica\\Core\\Config\\Capability\\IManageConfigValues */ private $config ; /** @var L10n */ private $l10n ; /** * SampleStorageBackendConfig constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( IManageConfigValues $config , L10n $l10n ) { $this -> config = $config ; $this -> l10n = $l10n ; } public function getFileName () : string { return $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); } public function getOptions () { $filename = $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); return [ 'filename' => [ 'input' , // will use a simple text input $this -> l10n -> t ( 'The file to return' ), // the label $filename , // the current value $this -> l10n -> t ( 'Enter the path to a file' ), // the help text // no extra data for 'input' type.. ], ]; } public function saveOptions ( array $data ) { // the keys in $data are the same keys we defined in getOptions() $newfilename = trim ( $data [ 'filename' ]); // this function should always validate the data. // in this example we check if file exists if ( ! file_exists ( $newfilename )) { // in case of error we return an array with // ['optionname' => 'error message'] return [ 'filename' => 'The file doesn\\'t exists' ]; } $this -> config -> set ( 'storage' , 'samplestorage' , $newfilename ); // no errors, return empty array return []; } } Now the plugin main file. Here we register and unregister the backend class. The file is addon/samplestorage/samplestorage.php <?php /** * Name: Sample Storage Addon * Description: A sample addon which implements an unusefull storage backend * Version: 1.0.0 * Author: Alice <https://alice.social/~alice> */ use Friendica\\Addon\\samplestorage\\SampleStorageBackend ; use Friendica\\Addon\\samplestorage\\SampleStorageBackendConfig ; use Friendica\\DI ; function samplestorage_install () { Hook :: register ( 'storage_instance' , __FILE__ , 'samplestorage_storage_instance' ); Hook :: register ( 'storage_config' , __FILE__ , 'samplestorage_storage_config' ); DI :: storageManager () -> register ( SampleStorageBackend :: class ); } function samplestorage_storage_uninstall () { DI :: storageManager () -> unregister ( SampleStorageBackend :: class ); } function samplestorage_storage_instance ( App $a , array & $data ) { $config = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); $data [ 'storage' ] = new SampleStorageBackendConfig ( $config -> getFileName ()); } function samplestorage_storage_config ( App $a , array & $data ) { $data [ 'storage_config' ] = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); } **Theoretically - until tests for Addons are enabled too - create a test class with the name addon/tests/SampleStorageTest.php : use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; use Friendica\\Test\\src\\Core\\Storage\\StorageTest; class SampleStorageTest extends StorageTest { // returns an instance of your newly created storage class protected function getInstance() { // create a new SampleStorageBackend instance with all it's dependencies // Have a look at DatabaseStorageTest or FilesystemStorageTest for further insights return new SampleStorageBackend(); } // Assertion for the option array you return for your new StorageClass protected function assertOption(ICanWriteToStorage $storage) { $this->assertEquals([ 'filename' => [ 'input', 'The file to return', 'sample.jpg', 'Enter the path to a file' ], ], $storage->getOptions()); } }","title":"Addon Storage Backend"},{"location":"en/developer/addon-storage-backend/#friendica-storage-backend-addon-development","text":"Storage backends can be added via addons. A storage backend is implemented as a class, and the plugin register the class to make it available to the system.","title":"Friendica Storage Backend Addon development"},{"location":"en/developer/addon-storage-backend/#the-storage-backend-class","text":"The class must live in Friendica\\Addon\\youraddonname namespace, where youraddonname the folder name of your addon. There are two different interfaces you need to implement.","title":"The Storage Backend Class"},{"location":"en/developer/addon-storage-backend/#icanwritetostorage","text":"The class must implement Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage interface. All method in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; interface ICanWriteToStorage { public function get ( string $reference ); public function put ( string $data , string $reference = '' ); public function delete ( string $reference ); public function __toString (); public static function getName (); } get(string $reference) returns data pointed by $reference put(string $data, string $reference) saves data in $data to position $reference , or a new position if $reference is empty. delete(string $reference) delete data pointed by $reference","title":"ICanWriteToStorage"},{"location":"en/developer/addon-storage-backend/#icanconfigurestorage","text":"Each storage backend can have options the admin can set in admin page. To make the options possible, you need to implement the Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage interface. All methods in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; interface ICanConfigureStorage { public function getOptions (); public function saveOptions ( array $data ); } getOptions() returns an array with details about each option to build the interface. saveOptions(array $data) get $data from admin page, validate it and save it. The array returned by getOptions() is defined as: [ 'option1name' => [ ..info.. ], 'option2name' => [ ..info.. ], ... ] An empty array can be returned if backend doesn't have any options. The info array for each option is defined as: [ 'type', define the field used in form, and the type of data. one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea' 'label', Translatable label of the field. This label will be shown in admin page value, Current value of the option 'help text', Translatable description for the field. Will be shown in admin page extra data Optional. Depends on which 'type' this option is: 'select': array [ value => label ] of choices 'intcheckbox': value of input element 'select_raw': prebuild html string of <option > tags Each label should be translatable ]; See doxygen documentation of IWritableStorage interface for details about each method.","title":"ICanConfigureStorage"},{"location":"en/developer/addon-storage-backend/#register-a-storage-backend-class","text":"Each backend must be registered in the system when the plugin is installed, to be aviable. DI::facStorage()->register(string $class) is used to register the backend class. When the plugin is uninstalled, registered backends must be unregistered using DI::facStorage()->unregister(string $class) . You have to register a new hook in your addon, listening on storage_instance(App $a, array $data) . In case $data['name'] is your storage class name, you have to instance a new instance of your Friendica\\Core\\Storage\\Capability\\ICanReadFromStorage class. Set the instance of your class as $data['storage'] to pass it back to the backend. This is necessary because it isn't always clear, if you need further construction arguments.","title":"Register a storage backend class"},{"location":"en/developer/addon-storage-backend/#adding-tests","text":"Currently testing is limited to core Friendica only, this shows theoretically how tests should work in the future Each new Storage class should be added to the test-environment at Storage Tests . Add a new test class which's naming convention is StorageClassTest , which extend the StorageTest in the same directory. Override the two necessary instances: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; abstract class StorageTest { // returns an instance of your newly created storage class abstract protected function getInstance(); // Assertion for the option array you return for your new StorageClass abstract protected function assertOption(ICanWriteToStorage $storage); }","title":"Adding tests"},{"location":"en/developer/addon-storage-backend/#exception-handling","text":"There are two intended types of exceptions for storages","title":"Exception handling"},{"location":"en/developer/addon-storage-backend/#referencestorageexecption","text":"This storage exception should be used in case the caller tries to use an invalid references. This could happen in case the caller tries to delete or update an unknown reference. The implementation of the storage backend must not ignore invalid references. Avoid throwing the common StorageExecption instead of the ReferenceStorageException at this particular situation!","title":"ReferenceStorageExecption"},{"location":"en/developer/addon-storage-backend/#storageexception","text":"This is the common exception in case unexpected errors happen using the storage backend. If there's a predecessor to this exception (e.g. you caught an exception and are throwing this execption), you should add the predecessor for transparency reasons. Example: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; class ExampleStorage implements ICanWriteToStorage { public function get(string $reference) : string { try { throw new Exception('a real bad exception'); } catch (Exception $exception) { throw new \\Friendica\\Core\\Storage\\Exception\\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception); } } }","title":"StorageException"},{"location":"en/developer/addon-storage-backend/#example","text":"Here is a hypothetical addon which register a useless storage backend. Let's call it samplestorage . This backend will discard all data we try to save and will return always the same image when we ask for some data. The image returned can be set by the administrator in admin page. First, the backend class. The file will be addon/samplestorage/SampleStorageBackend.php : <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackend implements ICanWriteToStorage { const NAME = 'Sample Storage' ; /** @var string */ private $filename ; /** * SampleStorageBackend constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( string $filename ) { $this -> filename = $filename ; } public function get ( string $reference ) { // we return always the same image data. Which file we load is defined by // a config key return file_get_contents ( $this -> filename ); } public function put ( string $data , string $reference = '' ) { if ( $reference === '' ) { $reference = 'sample' ; } // we don't save $data ! return $reference ; } public function delete ( string $reference ) { // we pretend to delete the data return true ; } public function __toString () { return self :: NAME ; } public static function getName () { return self :: NAME ; } } <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackendConfig implements ICanConfigureStorage { /** @var \\Friendica\\Core\\Config\\Capability\\IManageConfigValues */ private $config ; /** @var L10n */ private $l10n ; /** * SampleStorageBackendConfig constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( IManageConfigValues $config , L10n $l10n ) { $this -> config = $config ; $this -> l10n = $l10n ; } public function getFileName () : string { return $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); } public function getOptions () { $filename = $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); return [ 'filename' => [ 'input' , // will use a simple text input $this -> l10n -> t ( 'The file to return' ), // the label $filename , // the current value $this -> l10n -> t ( 'Enter the path to a file' ), // the help text // no extra data for 'input' type.. ], ]; } public function saveOptions ( array $data ) { // the keys in $data are the same keys we defined in getOptions() $newfilename = trim ( $data [ 'filename' ]); // this function should always validate the data. // in this example we check if file exists if ( ! file_exists ( $newfilename )) { // in case of error we return an array with // ['optionname' => 'error message'] return [ 'filename' => 'The file doesn\\'t exists' ]; } $this -> config -> set ( 'storage' , 'samplestorage' , $newfilename ); // no errors, return empty array return []; } } Now the plugin main file. Here we register and unregister the backend class. The file is addon/samplestorage/samplestorage.php <?php /** * Name: Sample Storage Addon * Description: A sample addon which implements an unusefull storage backend * Version: 1.0.0 * Author: Alice <https://alice.social/~alice> */ use Friendica\\Addon\\samplestorage\\SampleStorageBackend ; use Friendica\\Addon\\samplestorage\\SampleStorageBackendConfig ; use Friendica\\DI ; function samplestorage_install () { Hook :: register ( 'storage_instance' , __FILE__ , 'samplestorage_storage_instance' ); Hook :: register ( 'storage_config' , __FILE__ , 'samplestorage_storage_config' ); DI :: storageManager () -> register ( SampleStorageBackend :: class ); } function samplestorage_storage_uninstall () { DI :: storageManager () -> unregister ( SampleStorageBackend :: class ); } function samplestorage_storage_instance ( App $a , array & $data ) { $config = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); $data [ 'storage' ] = new SampleStorageBackendConfig ( $config -> getFileName ()); } function samplestorage_storage_config ( App $a , array & $data ) { $data [ 'storage_config' ] = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); } **Theoretically - until tests for Addons are enabled too - create a test class with the name addon/tests/SampleStorageTest.php : use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; use Friendica\\Test\\src\\Core\\Storage\\StorageTest; class SampleStorageTest extends StorageTest { // returns an instance of your newly created storage class protected function getInstance() { // create a new SampleStorageBackend instance with all it's dependencies // Have a look at DatabaseStorageTest or FilesystemStorageTest for further insights return new SampleStorageBackend(); } // Assertion for the option array you return for your new StorageClass protected function assertOption(ICanWriteToStorage $storage) { $this->assertEquals([ 'filename' => [ 'input', 'The file to return', 'sample.jpg', 'Enter the path to a file' ], ], $storage->getOptions()); } }","title":"Example"},{"location":"en/developer/autoloader/","tags":["developer","composer"],"text":"Autoloader with Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Using Composer A quick introduction to class auto-loading # The autoloader dynamically includes the file defining a class when it is first referenced, either by instantiating an object or simply making sure that it is available, without the need to explicitly use \"require_once\". Once it is set up you don't have to directly use it, you can directly use any class that is covered by the autoloader (currently vendor and src ) Under the hood, Composer registers a callback with spl_autoload_register() that receives a class name as an argument and includes the corresponding class definition file. For more info about PHP autoloading, please refer to the official PHP documentation . Example # Let's say you have a PHP file in src/ that define a very useful class: // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager { public function getAll () { ... } public function getByID ( $id ) { ... } } The class ItemsManager has been declared in the Friendica namespace. Namespaces are useful to keep classes separated and avoid names conflicts (could be that a library you want to use also defines a class named ItemsManager , but as long as it is in another namespace, you don't have any problem) Let's say now that you need to load some items in a view, maybe in a fictional mod/network.php . In order for the Composer autoloader to work, it must first be included. In Friendica this is already done at the top of boot.php , with require_once('vendor/autoload.php'); . The code will be something like: // mod/network.php <?php use Friendica\\App ; function network_content ( App $a ) { $itemsmanager = new \\Friendica\\ItemsManager (); $items = $itemsmanager -> getAll (); // pass $items to template // return result } That's a quite simple example, but look: no require() ! If you need to use a class, you can simply use it, and you don't need to do anything else. Going further: now we have a bunch of *Manager classes that cause some code duplication. Let's define a BaseManager class, where we move all common code between all managers: // src/BaseManager.php <?php namespace Friendica ; class BaseManager { public function thatFunctionEveryManagerUses () { ... } } and then let's change the ItemsManager class to use this code // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager extends BaseManager { public function getAll () { ... } public function getByID ( $id ) { ... } } Even though we didn't explicitly include the src/BaseManager.php file, the autoloader will when this class is first defined, because it is referenced as a parent class. It works with the \"BaseManager\" example here, and it works when we need to call static methods: // src/Dfrn.php <?php namespace Friendica ; class Dfrn { public static function mail ( $item , $owner ) { ... } } // mod/mail.php <?php mail_post ( $a ){ ... Friendica\\Protocol\\DFRN :: mail ( $item , $owner ); ... } If your code is in same namespace as the class you need, you don't need to prepend it: // include/delivery.php <?php namespace Friendica ; use Friendica\\Protocol\\DFRN ; // this is the same content of current include/delivery.php, // but has been declared to be in \"Friendica\" namespace [ ... ] switch ( $contact [ 'network' ]) { case NETWORK_DFRN : if ( $mail ) { $item [ 'body' ] = ... $atom = DFRN :: mail ( $item , $owner ); } elseif ( $fsuggest ) { $atom = DFRN :: fsuggest ( $item , $owner ); q ( \"DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1\" , intval ( $item [ 'id' ])); } elseif ( $relocate ) $atom = DFRN :: relocate ( $owner , $uid ); [ ... ] This is the current code of include/delivery.php , and since the code is declared to be in the \"Friendica\" namespace, you don't need to write it when you need to use the \"Dfrn\" class. But if you want to use classes from another library, you need to use the full namespace, e.g. // src/Diaspora.php <?php namespace Friendica ; class Diaspora { public function md2bbcode () { $html = \\Michelf\\MarkdownExtra :: defaultTransform ( $text ); } } if you use that class in many places of the code, and you don't want to write the full path to the class every time, you can use the \"use\" PHP keyword // src/Diaspora.php <?php namespace Friendica ; use \\Michelf\\MarkdownExtra ; class Diaspora { public function md2bbcode () { $html = MarkdownExtra :: defaultTransform ( $text ); } } Note that namespaces are like paths in filesystem, separated by \"\\\", with the first \"\\\" being the global scope. You can go deeper if you want to, like: // src/Network/Dfrn.php <?php namespace Friendica\\Network ; class Dfrn { } Please note that the location of the file defining the class must be placed in the appropriate sub-folders of src if the namespace isn't plain Friendica . or // src/Dba/Mysql <?php namespace Friendica\\Dba ; class Mysql { } So you can think of namespaces as folders in a Unix file system, with global scope as the root (\"\\\"). Related # Using Composer How To Move Classes to src","title":"Autoloader"},{"location":"en/developer/autoloader/#autoloader-with-composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Using Composer","title":"Autoloader with Composer"},{"location":"en/developer/autoloader/#a-quick-introduction-to-class-auto-loading","text":"The autoloader dynamically includes the file defining a class when it is first referenced, either by instantiating an object or simply making sure that it is available, without the need to explicitly use \"require_once\". Once it is set up you don't have to directly use it, you can directly use any class that is covered by the autoloader (currently vendor and src ) Under the hood, Composer registers a callback with spl_autoload_register() that receives a class name as an argument and includes the corresponding class definition file. For more info about PHP autoloading, please refer to the official PHP documentation .","title":"A quick introduction to class auto-loading"},{"location":"en/developer/autoloader/#example","text":"Let's say you have a PHP file in src/ that define a very useful class: // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager { public function getAll () { ... } public function getByID ( $id ) { ... } } The class ItemsManager has been declared in the Friendica namespace. Namespaces are useful to keep classes separated and avoid names conflicts (could be that a library you want to use also defines a class named ItemsManager , but as long as it is in another namespace, you don't have any problem) Let's say now that you need to load some items in a view, maybe in a fictional mod/network.php . In order for the Composer autoloader to work, it must first be included. In Friendica this is already done at the top of boot.php , with require_once('vendor/autoload.php'); . The code will be something like: // mod/network.php <?php use Friendica\\App ; function network_content ( App $a ) { $itemsmanager = new \\Friendica\\ItemsManager (); $items = $itemsmanager -> getAll (); // pass $items to template // return result } That's a quite simple example, but look: no require() ! If you need to use a class, you can simply use it, and you don't need to do anything else. Going further: now we have a bunch of *Manager classes that cause some code duplication. Let's define a BaseManager class, where we move all common code between all managers: // src/BaseManager.php <?php namespace Friendica ; class BaseManager { public function thatFunctionEveryManagerUses () { ... } } and then let's change the ItemsManager class to use this code // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager extends BaseManager { public function getAll () { ... } public function getByID ( $id ) { ... } } Even though we didn't explicitly include the src/BaseManager.php file, the autoloader will when this class is first defined, because it is referenced as a parent class. It works with the \"BaseManager\" example here, and it works when we need to call static methods: // src/Dfrn.php <?php namespace Friendica ; class Dfrn { public static function mail ( $item , $owner ) { ... } } // mod/mail.php <?php mail_post ( $a ){ ... Friendica\\Protocol\\DFRN :: mail ( $item , $owner ); ... } If your code is in same namespace as the class you need, you don't need to prepend it: // include/delivery.php <?php namespace Friendica ; use Friendica\\Protocol\\DFRN ; // this is the same content of current include/delivery.php, // but has been declared to be in \"Friendica\" namespace [ ... ] switch ( $contact [ 'network' ]) { case NETWORK_DFRN : if ( $mail ) { $item [ 'body' ] = ... $atom = DFRN :: mail ( $item , $owner ); } elseif ( $fsuggest ) { $atom = DFRN :: fsuggest ( $item , $owner ); q ( \"DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1\" , intval ( $item [ 'id' ])); } elseif ( $relocate ) $atom = DFRN :: relocate ( $owner , $uid ); [ ... ] This is the current code of include/delivery.php , and since the code is declared to be in the \"Friendica\" namespace, you don't need to write it when you need to use the \"Dfrn\" class. But if you want to use classes from another library, you need to use the full namespace, e.g. // src/Diaspora.php <?php namespace Friendica ; class Diaspora { public function md2bbcode () { $html = \\Michelf\\MarkdownExtra :: defaultTransform ( $text ); } } if you use that class in many places of the code, and you don't want to write the full path to the class every time, you can use the \"use\" PHP keyword // src/Diaspora.php <?php namespace Friendica ; use \\Michelf\\MarkdownExtra ; class Diaspora { public function md2bbcode () { $html = MarkdownExtra :: defaultTransform ( $text ); } } Note that namespaces are like paths in filesystem, separated by \"\\\", with the first \"\\\" being the global scope. You can go deeper if you want to, like: // src/Network/Dfrn.php <?php namespace Friendica\\Network ; class Dfrn { } Please note that the location of the file defining the class must be placed in the appropriate sub-folders of src if the namespace isn't plain Friendica . or // src/Dba/Mysql <?php namespace Friendica\\Dba ; class Mysql { } So you can think of namespaces as folders in a Unix file system, with global scope as the root (\"\\\").","title":"Example"},{"location":"en/developer/autoloader/#related","text":"Using Composer How To Move Classes to src","title":"Related"},{"location":"en/developer/composer/","tags":["developer","composer"],"text":"Using Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Class autoloading How to use Composer # If you don't have Composer installed on your system, Friendica ships with a copy of it at bin/composer.phar . For the purpose of this help, all examples will use this path to run Composer commands, however feel free to replace them with your own way of calling Composer. Composer requires PHP CLI and the following examples assume it's available system-wide. Installing/Updating Friendica # From Archive # If you just unpacked a Friendica release archive, you don't have to use Composer at all, all the required libraries are already bundled in the archive. Installing with Git # If you prefer to use git , you will have to run Composer to fetch the required libraries and build the autoloader before you can run Friendica. Here are the typical commands you will have to run to do so: ~> git clone https://github.com/friendica/friendica.git friendica ~/friendica> cd friendica ~/friendica> bin/composer.phar install That's it! Composer will take care of fetching all the required libraries in the vendor folder and build the autoloader to make those libraries available to Friendica. Updating with Git # Updating Friendica to the current stable or the latest develop version is easy with Git, just remember to run Composer after every branch pull. ~> cd friendica ~/friendica> git pull ~/friendica> bin/composer.phar install And that's it. If any library used by Friendica has been upgraded, Composer will fetch the version currently used by Friendica and refresh the autoloader to ensure the best performances. Developing Friendica # First, thanks for contributing to Friendica! Composer is meant to be used by developers to maintain third-party libraries required by Friendica. If you don't need to use any third-party library, then you don't need to use Composer beyond what is above to install/update Friendica. Adding a third-party library to Friendica # Does your shiny new Addon need to rely on a third-party library not required by Friendica yet? First, this library should be available on Packagist so that Composer knows how to fetch it directly just by mentioning its name in composer.json . This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version. Here's a simplified version of the one we currently use on Friendica: { \"name\" : \"friendica/friendica\" , \"description\" : \"A decentralized social network part of The Federation\" , \"type\" : \"project\" , [ ... ] \"require\" : { \"ezyang/htmlpurifier\" : \"~4.7.0\" , \"mobiledetect/mobiledetectlib\" : \"2.8.*\" }, [ ... ] } The important part is under the require key, this is a list of all the libraries Friendica may need to run. As you can see, at the moment we only require two, HTMLPurifier and MobileDetect. Each library has a different target version, and per Composer documentation about version constraints , this means that: We will update HTMLPurifier up to version 4.8.0 excluded We will update MobileDetect up to version 2.9.0 excluded There are other operators you can use to allow Composer to update the package up to the next major version excluded. Or you can specify the exact version of the library if you code requires it, and Composer will never update it, although it isn't recommended. To add a library, just add its Packagist identifier to the require list and set a target version string. Then you should run bin/composer.phar update to add it to your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Updating an existing dependency # If a package needs to be updated, whether to the next minor version or to the next major version provided you changed the adequate code in Friendica, simply edit composer.json to update the target version string of the relevant library. Then you should run bin/composer.phar update to update it in your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Please note that you should commit both composer.json and composer.lock with your work every time you make a change to the former. Composer FAQ # I used the composer command and got a warning about not to run it as root. # See https://getcomposer.org/root . Composer should be run as the web server user, usually www-data with Apache or http with nginx. If you can't switch to the web server user using su - [web user] , you can directly run the Composer command with sudo -u [web user] . Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer # This is because sudo doesn't always change the HOME environment variable, which means that the command is run as the web server user but the system still uses root home directory. However, you can temporarily change environment variable for the execution of a single command. For Composer, this would be: $> COMPOSER_HOME = /var/tmp/composer sudo -u [ web user ] bin/composer.phar [ mode ] Related # Class autoloading How To Move Classes to src","title":"Composer"},{"location":"en/developer/composer/#using-composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Class autoloading","title":"Using Composer"},{"location":"en/developer/composer/#how-to-use-composer","text":"If you don't have Composer installed on your system, Friendica ships with a copy of it at bin/composer.phar . For the purpose of this help, all examples will use this path to run Composer commands, however feel free to replace them with your own way of calling Composer. Composer requires PHP CLI and the following examples assume it's available system-wide.","title":"How to use Composer"},{"location":"en/developer/composer/#installingupdating-friendica","text":"","title":"Installing/Updating Friendica"},{"location":"en/developer/composer/#from-archive","text":"If you just unpacked a Friendica release archive, you don't have to use Composer at all, all the required libraries are already bundled in the archive.","title":"From Archive"},{"location":"en/developer/composer/#installing-with-git","text":"If you prefer to use git , you will have to run Composer to fetch the required libraries and build the autoloader before you can run Friendica. Here are the typical commands you will have to run to do so: ~> git clone https://github.com/friendica/friendica.git friendica ~/friendica> cd friendica ~/friendica> bin/composer.phar install That's it! Composer will take care of fetching all the required libraries in the vendor folder and build the autoloader to make those libraries available to Friendica.","title":"Installing with Git"},{"location":"en/developer/composer/#updating-with-git","text":"Updating Friendica to the current stable or the latest develop version is easy with Git, just remember to run Composer after every branch pull. ~> cd friendica ~/friendica> git pull ~/friendica> bin/composer.phar install And that's it. If any library used by Friendica has been upgraded, Composer will fetch the version currently used by Friendica and refresh the autoloader to ensure the best performances.","title":"Updating with Git"},{"location":"en/developer/composer/#developing-friendica","text":"First, thanks for contributing to Friendica! Composer is meant to be used by developers to maintain third-party libraries required by Friendica. If you don't need to use any third-party library, then you don't need to use Composer beyond what is above to install/update Friendica.","title":"Developing Friendica"},{"location":"en/developer/composer/#adding-a-third-party-library-to-friendica","text":"Does your shiny new Addon need to rely on a third-party library not required by Friendica yet? First, this library should be available on Packagist so that Composer knows how to fetch it directly just by mentioning its name in composer.json . This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version. Here's a simplified version of the one we currently use on Friendica: { \"name\" : \"friendica/friendica\" , \"description\" : \"A decentralized social network part of The Federation\" , \"type\" : \"project\" , [ ... ] \"require\" : { \"ezyang/htmlpurifier\" : \"~4.7.0\" , \"mobiledetect/mobiledetectlib\" : \"2.8.*\" }, [ ... ] } The important part is under the require key, this is a list of all the libraries Friendica may need to run. As you can see, at the moment we only require two, HTMLPurifier and MobileDetect. Each library has a different target version, and per Composer documentation about version constraints , this means that: We will update HTMLPurifier up to version 4.8.0 excluded We will update MobileDetect up to version 2.9.0 excluded There are other operators you can use to allow Composer to update the package up to the next major version excluded. Or you can specify the exact version of the library if you code requires it, and Composer will never update it, although it isn't recommended. To add a library, just add its Packagist identifier to the require list and set a target version string. Then you should run bin/composer.phar update to add it to your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies.","title":"Adding a third-party library to Friendica"},{"location":"en/developer/composer/#updating-an-existing-dependency","text":"If a package needs to be updated, whether to the next minor version or to the next major version provided you changed the adequate code in Friendica, simply edit composer.json to update the target version string of the relevant library. Then you should run bin/composer.phar update to update it in your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Please note that you should commit both composer.json and composer.lock with your work every time you make a change to the former.","title":"Updating an existing dependency"},{"location":"en/developer/composer/#composer-faq","text":"","title":"Composer FAQ"},{"location":"en/developer/composer/#i-used-the-composer-command-and-got-a-warning-about-not-to-run-it-as-root","text":"See https://getcomposer.org/root . Composer should be run as the web server user, usually www-data with Apache or http with nginx. If you can't switch to the web server user using su - [web user] , you can directly run the Composer command with sudo -u [web user] .","title":"I used the composer command and got a warning about not to run it as root."},{"location":"en/developer/composer/#running-composer-with-sudo-complains-about-not-being-able-to-create-the-composer-cache-directory-in-rootcomposer","text":"This is because sudo doesn't always change the HOME environment variable, which means that the command is run as the web server user but the system still uses root home directory. However, you can temporarily change environment variable for the execution of a single command. For Composer, this would be: $> COMPOSER_HOME = /var/tmp/composer sudo -u [ web user ] bin/composer.phar [ mode ]","title":"Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer"},{"location":"en/developer/composer/#related","text":"Class autoloading How To Move Classes to src","title":"Related"},{"location":"en/developer/domain-driven-design/","tags":["developer","pattern"],"text":"Domain-Driven-Design # Friendica uses class structures inspired by Domain-Driven-Design programming patterns. This page is meant to explain what it means in practical terms for Friendica development. Inspiration # https://designpatternsphp.readthedocs.io/en/latest/Structural/DependencyInjection/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html https://designpatternsphp.readthedocs.io/en/latest/More/Repository/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/FactoryMethod/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/Prototype/README.html Core concepts # Models and Collections # Instead of anonymous arrays of database field values, we have Models and collections to take full advantage of PHP type hints. Before: <?php function doSomething ( array $intros ) { foreach ( $intros as $intro ) { $introId = $intro [ 'id' ]; } } $intros = \\Friendica\\Database\\DBA :: selectToArray ( 'intros' , [], [ 'uid' => local_user ()]); doSomething ( $intros ); After: <?php function doSomething ( \\Friendica\\Contact\\Introductions\\Collection\\Introductions $intros ) { foreach ( $intros as $intro ) { /** @var $intro \\Friendica\\Contact\\Introductions\\Entity\\Introduction */ $introId = $intro -> id ; } } /** @var $intros \\Friendica\\Contact\\Introductions\\Collection\\Introductions */ $intros = \\Friendica\\DI :: intro () -> selecForUser ( local_user ()); doSomething ( $intros ); Dependency Injection # Under this concept, we want class objects to carry with them the dependencies they will use. Instead of calling global/static function/methods, objects use their own class members. Before: <?php class Model { public $id ; function save () { return \\Friendica\\Database\\DBA :: update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } After: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } The main advantage is testability. Another one is avoiding dependency circles and avoid implicit initializing. In the first example the method save() has to be tested with the DBA::update() method, which may or may not have dependencies itself. In the second example we can mock \\Friendica\\Database\\Database , e.g. overload the class by replacing its methods by placeholders, which allows us to test only Model::save() and nothing else implicitly. The main drawback is lengthy constructors for dependency-heavy classes. To alleviate this issue we are using DiCe to simplify the instantiation of the higher level objects Friendica uses. We also added a convenience factory named \\Friendica\\DI that creates some of the most common objects used in modules. Factories # Since we added a bunch of parameters to class constructors, instantiating objects has become cumbersome. To keep it simple, we are using Factories. Factories are classes used to generate other objects, centralizing the dependencies required in their constructor. Factories encapsulate more or less complex creation of objects and create them redundancy free. Before: <?php $model = new Model ( \\Friendica\\DI :: dba ()); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); Here, DI::factory() returns an instance of Factory that can then be used to create a Model object without having to care about its dependencies. Repositories # Last building block of our code architecture, repositories are meant as the interface between models and how they are stored. In Friendica they are stored in a relational database but repositories allow models not to have to care about it. Repositories also act as factories for the Model they are managing. Before: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Model { public $id ; } class Repository extends Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } public function save ( Model $model ) { return $this -> dba -> update ( 'table' , get_object_vars ( $model ), [ 'id' => $model -> id ]); } } $model = \\Friendica\\DI :: repository () -> create (); $model -> id = 1 ; $model -> key = 'value' ; \\Friendica\\DI :: repository () -> save ( $model );","title":"DDD"},{"location":"en/developer/domain-driven-design/#domain-driven-design","text":"Friendica uses class structures inspired by Domain-Driven-Design programming patterns. This page is meant to explain what it means in practical terms for Friendica development.","title":"Domain-Driven-Design"},{"location":"en/developer/domain-driven-design/#inspiration","text":"https://designpatternsphp.readthedocs.io/en/latest/Structural/DependencyInjection/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html https://designpatternsphp.readthedocs.io/en/latest/More/Repository/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/FactoryMethod/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/Prototype/README.html","title":"Inspiration"},{"location":"en/developer/domain-driven-design/#core-concepts","text":"","title":"Core concepts"},{"location":"en/developer/domain-driven-design/#models-and-collections","text":"Instead of anonymous arrays of database field values, we have Models and collections to take full advantage of PHP type hints. Before: <?php function doSomething ( array $intros ) { foreach ( $intros as $intro ) { $introId = $intro [ 'id' ]; } } $intros = \\Friendica\\Database\\DBA :: selectToArray ( 'intros' , [], [ 'uid' => local_user ()]); doSomething ( $intros ); After: <?php function doSomething ( \\Friendica\\Contact\\Introductions\\Collection\\Introductions $intros ) { foreach ( $intros as $intro ) { /** @var $intro \\Friendica\\Contact\\Introductions\\Entity\\Introduction */ $introId = $intro -> id ; } } /** @var $intros \\Friendica\\Contact\\Introductions\\Collection\\Introductions */ $intros = \\Friendica\\DI :: intro () -> selecForUser ( local_user ()); doSomething ( $intros );","title":"Models and Collections"},{"location":"en/developer/domain-driven-design/#dependency-injection","text":"Under this concept, we want class objects to carry with them the dependencies they will use. Instead of calling global/static function/methods, objects use their own class members. Before: <?php class Model { public $id ; function save () { return \\Friendica\\Database\\DBA :: update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } After: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } The main advantage is testability. Another one is avoiding dependency circles and avoid implicit initializing. In the first example the method save() has to be tested with the DBA::update() method, which may or may not have dependencies itself. In the second example we can mock \\Friendica\\Database\\Database , e.g. overload the class by replacing its methods by placeholders, which allows us to test only Model::save() and nothing else implicitly. The main drawback is lengthy constructors for dependency-heavy classes. To alleviate this issue we are using DiCe to simplify the instantiation of the higher level objects Friendica uses. We also added a convenience factory named \\Friendica\\DI that creates some of the most common objects used in modules.","title":"Dependency Injection"},{"location":"en/developer/domain-driven-design/#factories","text":"Since we added a bunch of parameters to class constructors, instantiating objects has become cumbersome. To keep it simple, we are using Factories. Factories are classes used to generate other objects, centralizing the dependencies required in their constructor. Factories encapsulate more or less complex creation of objects and create them redundancy free. Before: <?php $model = new Model ( \\Friendica\\DI :: dba ()); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); Here, DI::factory() returns an instance of Factory that can then be used to create a Model object without having to care about its dependencies.","title":"Factories"},{"location":"en/developer/domain-driven-design/#repositories","text":"Last building block of our code architecture, repositories are meant as the interface between models and how they are stored. In Friendica they are stored in a relational database but repositories allow models not to have to care about it. Repositories also act as factories for the Model they are managing. Before: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Model { public $id ; } class Repository extends Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } public function save ( Model $model ) { return $this -> dba -> update ( 'table' , get_object_vars ( $model ), [ 'id' => $model -> id ]); } } $model = \\Friendica\\DI :: repository () -> create (); $model -> id = 1 ; $model -> key = 'value' ; \\Friendica\\DI :: repository () -> save ( $model );","title":"Repositories"},{"location":"en/developer/github/","tags":["developer","upstream","git"],"text":"Friendica on GitHub # Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum. Introduction to the workflow with our GitHub repository # Install git on the system you will be developing on. Create your own GitHub account. Fork the Friendica repository from https://github.com/friendica/friendica.git . Clone your fork from your GitHub account to your machine. Follow the instructions provided here: http://help.github.com/fork-a-repo/ to create and use your own tracking fork on GitHub Run bin/composer.phar install in Friendica's folder. Commit your changes to your fork. Then go to your GitHub page and create a \"Pull request\" to notify us to merge your work. Our Git Branches # There are two relevant branches in the main repo on GitHub: stable: This branch contains stable releases only. develop: This branch contains the latest code. This is what you want to work with. Fast-forwarding # Fast forwarding is enabled by default in git. When you merge with fast-forwarding it does not add a new commit to mark when you've performed the merge and how. This means in your commit history you can't know exactly what happened in terms of merges. It's best to turn off fast-forwarding. This is done by running \"git merge --no-ff\". Here is an explanation on how to configure git to turn off fast-forwarding by default. You can find some more background reading here . Release branches # A release branch is created when the develop branch contains all features it should have. A release branch is used for a few things. It allows last-minute bug fixing before the release goes to stable branch. It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes. It makes sure the develop branch can receive new features that are not part of this release. That last point is important because... The moment a release branch is created, develop is now intended for the version after this release . So please don't ever merge develop into a release! An example: If a release branch \"release-3.4\" is created, \"develop\" becomes either 3.5 or 4.0. If you were to merge develop into release-3.4 at this point, features and bug-fixes intended for 3.5 or 4.0 might leak into this release branch. This might introduce new bugs, too. Which defeats the purpose of the release branch. Some important reminders # 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. Test your changes . Don't assume that a simple fix won't break anything else. If possible get an experienced Friendica developer to review the code. Don't hesitate to ask us in case of doubt. Check your code for typos. There is a console command called typo for this. $> php bin/console.php typo Check out how to work with our Vagrant to save a lot of setup time!","title":"GitHub"},{"location":"en/developer/github/#friendica-on-github","text":"Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum.","title":"Friendica on GitHub"},{"location":"en/developer/github/#introduction-to-the-workflow-with-our-github-repository","text":"Install git on the system you will be developing on. Create your own GitHub account. Fork the Friendica repository from https://github.com/friendica/friendica.git . Clone your fork from your GitHub account to your machine. Follow the instructions provided here: http://help.github.com/fork-a-repo/ to create and use your own tracking fork on GitHub Run bin/composer.phar install in Friendica's folder. Commit your changes to your fork. Then go to your GitHub page and create a \"Pull request\" to notify us to merge your work.","title":"Introduction to the workflow with our GitHub repository"},{"location":"en/developer/github/#our-git-branches","text":"There are two relevant branches in the main repo on GitHub: stable: This branch contains stable releases only. develop: This branch contains the latest code. This is what you want to work with.","title":"Our Git Branches"},{"location":"en/developer/github/#fast-forwarding","text":"Fast forwarding is enabled by default in git. When you merge with fast-forwarding it does not add a new commit to mark when you've performed the merge and how. This means in your commit history you can't know exactly what happened in terms of merges. It's best to turn off fast-forwarding. This is done by running \"git merge --no-ff\". Here is an explanation on how to configure git to turn off fast-forwarding by default. You can find some more background reading here .","title":"Fast-forwarding"},{"location":"en/developer/github/#release-branches","text":"A release branch is created when the develop branch contains all features it should have. A release branch is used for a few things. It allows last-minute bug fixing before the release goes to stable branch. It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes. It makes sure the develop branch can receive new features that are not part of this release. That last point is important because... The moment a release branch is created, develop is now intended for the version after this release . So please don't ever merge develop into a release! An example: If a release branch \"release-3.4\" is created, \"develop\" becomes either 3.5 or 4.0. If you were to merge develop into release-3.4 at this point, features and bug-fixes intended for 3.5 or 4.0 might leak into this release branch. This might introduce new bugs, too. Which defeats the purpose of the release branch.","title":"Release branches"},{"location":"en/developer/github/#some-important-reminders","text":"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. Test your changes . Don't assume that a simple fix won't break anything else. If possible get an experienced Friendica developer to review the code. Don't hesitate to ask us in case of doubt. Check your code for typos. There is a console command called typo for this. $> php bin/console.php typo Check out how to work with our Vagrant to save a lot of setup time!","title":"Some important reminders"},{"location":"en/developer/how-to-move-classes-to-src/","tags":["developer","refactoring"],"text":"How To Move Classes to src # Friendica uses Composer to manage autoloading. This means that all the PHP class files moved to the src folder will be automatically included when the class it defines is first used in the flow. This is an improvement over the current require usage since files will be included on an actual usage basis instead of the presence of a require call. However, there are a significant number of items to check when moving a class file from the include folder to the src folder, and this page is there to list them. Decide the namespace # This isn't the most technical decision of them all, but it has long-lasting consequences as it will be the name that will be used to refer to this class from now on. There is a shared Ethercalc sheet to suggest namespace/class names that lists all the already moved class files for inspiration. A few pointers though: * Friendica is the base namespace for all classes in the src folder * Namespaces match the directory structure, with Friendica namespace being the base src directory. The Config class set in the Friendica\\Core namespace is expected to be found at src/Core/Config.php . * Namespaces can help group classes with a similar purpose or relevant to a particular feature When you're done deciding the namespace, it's time to use it. Let's say we choose Friendica\\Core for the Config class. Use the namespace # To declare the namespace, the file src/Core/Config.php must start with the following statement: namespace Friendica\\Core; From now on, the Config class can be referred to as Friendica\\Core\\Config , however it isn't very practical, especially when the class was previously used as Config . Thankfully, PHP provides namespace shortcuts through use . This language construct just provides a different naming scheme for a namespace or a class, but doesn't trigger the autoload-mechanism on its own. Here are the different ways you can use use : // No use $config = new Friendica\\Core\\Config(); // Namespace shortcut use Friendica\\Core; $config = new Core\\Config(); // Class name shortcut use Friendica\\Core\\Config; $config = new Config(); // Aliasing use Friendica\\Core\\Config as Cfg; $config = new Cfg(); Whatever the style chosen, a repository-wide search has to be done to find all the class name usage and either use the fully-qualified class name (including the namespace) or add a use statement at the start of each relevant file. Escape non-namespace classes # The class file you just moved is now in the Friendica namespace, but it probably isn't the case for all the classes referenced in this file. Since we added a namespace Friendica\\Core; to the file, all the class names still declared in include will be implicitly understood as Friendica\\Core\\ClassName , which is rarely what we expect. To avoid Class Friendica\\Core\\ClassName not found errors, all the include -declared class names have to be prepended with a \\ , it tells the autoloader not to look for the class in the namespace but in the global space where non-namespaced classes are set. If there are only a handful of references to a single non-namespaced class, just prepending \\ is enough. However, if there are many instance, we can use use again. namespace Friendica\\Core; ... if (\\DBM::is_result($r)) { ... } namespace Friendica\\Core; use Friendica\\Database\\DBM; if (DBM::is_result($r)) { ... } Remove any useless require # Now that you successfully moved your class to the autoloaded src folder, there's no need to include this file anywhere in the app ever again. Please remove all the require_once mentions of the former file, as they will provoke a Fatal Error even if the class isn't used. Miscellaneous tips # When you are done with moving the class, please run php bin/console.php typo from the Friendica base directory to check for obvious mistakes. However, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one. Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica. Check the class file for any magic constant __FILE__ or __DIR__ , as their value changed since you moved the class in the file tree. Most of the time it's used for debugging purposes but there can be instances where it's used to create cache folders for example. Related # Class autoloading Using Composer","title":"src Migration"},{"location":"en/developer/how-to-move-classes-to-src/#how-to-move-classes-to-src","text":"Friendica uses Composer to manage autoloading. This means that all the PHP class files moved to the src folder will be automatically included when the class it defines is first used in the flow. This is an improvement over the current require usage since files will be included on an actual usage basis instead of the presence of a require call. However, there are a significant number of items to check when moving a class file from the include folder to the src folder, and this page is there to list them.","title":"How To Move Classes to src"},{"location":"en/developer/how-to-move-classes-to-src/#decide-the-namespace","text":"This isn't the most technical decision of them all, but it has long-lasting consequences as it will be the name that will be used to refer to this class from now on. There is a shared Ethercalc sheet to suggest namespace/class names that lists all the already moved class files for inspiration. A few pointers though: * Friendica is the base namespace for all classes in the src folder * Namespaces match the directory structure, with Friendica namespace being the base src directory. The Config class set in the Friendica\\Core namespace is expected to be found at src/Core/Config.php . * Namespaces can help group classes with a similar purpose or relevant to a particular feature When you're done deciding the namespace, it's time to use it. Let's say we choose Friendica\\Core for the Config class.","title":"Decide the namespace"},{"location":"en/developer/how-to-move-classes-to-src/#use-the-namespace","text":"To declare the namespace, the file src/Core/Config.php must start with the following statement: namespace Friendica\\Core; From now on, the Config class can be referred to as Friendica\\Core\\Config , however it isn't very practical, especially when the class was previously used as Config . Thankfully, PHP provides namespace shortcuts through use . This language construct just provides a different naming scheme for a namespace or a class, but doesn't trigger the autoload-mechanism on its own. Here are the different ways you can use use : // No use $config = new Friendica\\Core\\Config(); // Namespace shortcut use Friendica\\Core; $config = new Core\\Config(); // Class name shortcut use Friendica\\Core\\Config; $config = new Config(); // Aliasing use Friendica\\Core\\Config as Cfg; $config = new Cfg(); Whatever the style chosen, a repository-wide search has to be done to find all the class name usage and either use the fully-qualified class name (including the namespace) or add a use statement at the start of each relevant file.","title":"Use the namespace"},{"location":"en/developer/how-to-move-classes-to-src/#escape-non-namespace-classes","text":"The class file you just moved is now in the Friendica namespace, but it probably isn't the case for all the classes referenced in this file. Since we added a namespace Friendica\\Core; to the file, all the class names still declared in include will be implicitly understood as Friendica\\Core\\ClassName , which is rarely what we expect. To avoid Class Friendica\\Core\\ClassName not found errors, all the include -declared class names have to be prepended with a \\ , it tells the autoloader not to look for the class in the namespace but in the global space where non-namespaced classes are set. If there are only a handful of references to a single non-namespaced class, just prepending \\ is enough. However, if there are many instance, we can use use again. namespace Friendica\\Core; ... if (\\DBM::is_result($r)) { ... } namespace Friendica\\Core; use Friendica\\Database\\DBM; if (DBM::is_result($r)) { ... }","title":"Escape non-namespace classes"},{"location":"en/developer/how-to-move-classes-to-src/#remove-any-useless-require","text":"Now that you successfully moved your class to the autoloaded src folder, there's no need to include this file anywhere in the app ever again. Please remove all the require_once mentions of the former file, as they will provoke a Fatal Error even if the class isn't used.","title":"Remove any useless require"},{"location":"en/developer/how-to-move-classes-to-src/#miscellaneous-tips","text":"When you are done with moving the class, please run php bin/console.php typo from the Friendica base directory to check for obvious mistakes. However, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one. Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica. Check the class file for any magic constant __FILE__ or __DIR__ , as their value changed since you moved the class in the file tree. Most of the time it's used for debugging purposes but there can be instances where it's used to create cache folders for example.","title":"Miscellaneous tips"},{"location":"en/developer/how-to-move-classes-to-src/#related","text":"Class autoloading Using Composer","title":"Related"},{"location":"en/developer/smarty3-templates/","tags":["developer","templates","themes"],"text":"Friendica Templating Documentation # Friendica uses Smarty 3 as PHP templating engine. The main templates are found in /view/templates theme authors may overwrite the default templates by putting a files with the same name into the /view/themes/$themename/templates directory. Templates that are only used by addons shall be placed in the /addon/$addonname/templates directory. To render a template use the function getMarkupTemplate to load the template and replaceMacros to replace the macros/variables in the just loaded template file. $tpl = Renderer::getMarkupTemplate('install_settings.tpl'); $o .= Renderer::replaceMacros($tpl, array( ... )); the array consists of an association of an identifier and the value for that identifier, i.e. '$title' => $install_title, where the value may as well be an array by its own. Form Templates # To guarantee a consistent look and feel for input forms, i.e. in the settings sections, there are templates for the basic form fields. They are initialized with an array of data, depending on the style of the field. All of these take an array holding the values, e.g. for a one line text input field, which is required and should be used to type email addresses use something along the lines of: '$adminmail' => array('adminmail', DI::l10n()->t('Site administrator email address'), $adminmail, DI::l10n()->t('Your account email address must match this in order to use the web admin panel.'), 'required', '', 'email'), To evaluate the input value, you can then use the $_POST array, more precisely the $_POST['adminemail'] variable. Listed below are the template file names, the general purpose of the template and their field parameters. field_checkbox.tpl # A checkbox. If the checkbox is checked its value is 1 . Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Help text for the checkbox. field_combobox.tpl # A combobox, combining a pull down selection and a textual input field. Field parameter: Name of the combobox, Label for the combobox, Current value of the variable, Help text for the combobox, Array holding the possible values for the textual input, Array holding the possible values for the pull down selection. field_custom.tpl # A customizable template to include a custom element in the form with the usual surroundings, Field parameter: Name of the field, Label for the field, the field, Help text for the field. field_input.tpl # A single line input field for any type of input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor into this box once the page is loaded, if set, it will be used for the input type, default is text (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types). field_intcheckbox.tpl # A checkbox (see above) but you can define the value of it. Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Value of the checkbox, Help text for the checkbox. field_openid.tpl # An input box (see above) but prepared for special CSS styling for openID input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input field. field_password.tpl # A single line input field (see above) for textual input. The characters typed in will not be shown by the browser. Field parameter: Name of the field, Label for the field, Value for the field, e.g. the old password, Help text for the input field, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor automatically into this input field. field_radio.tpl # A radio button. Field parameter: Name of the radio button, Label for the radio button, Current value of the variable, Help text for the button, if set, the radio button will be checked. field_richtext.tpl # A multi-line input field for rich textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box. field_select.tpl # A drop-down selection box. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Array holding the possible values of the selection drop-down. field_select_raw.tpl # A drop-down selection box (see above) but you have to prepare the values yourself. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Possible values of the selection drop-down. field_textarea.tpl # A multi-line input field for (plain) textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required.","title":"Smarty3"},{"location":"en/developer/smarty3-templates/#friendica-templating-documentation","text":"Friendica uses Smarty 3 as PHP templating engine. The main templates are found in /view/templates theme authors may overwrite the default templates by putting a files with the same name into the /view/themes/$themename/templates directory. Templates that are only used by addons shall be placed in the /addon/$addonname/templates directory. To render a template use the function getMarkupTemplate to load the template and replaceMacros to replace the macros/variables in the just loaded template file. $tpl = Renderer::getMarkupTemplate('install_settings.tpl'); $o .= Renderer::replaceMacros($tpl, array( ... )); the array consists of an association of an identifier and the value for that identifier, i.e. '$title' => $install_title, where the value may as well be an array by its own.","title":"Friendica Templating Documentation"},{"location":"en/developer/smarty3-templates/#form-templates","text":"To guarantee a consistent look and feel for input forms, i.e. in the settings sections, there are templates for the basic form fields. They are initialized with an array of data, depending on the style of the field. All of these take an array holding the values, e.g. for a one line text input field, which is required and should be used to type email addresses use something along the lines of: '$adminmail' => array('adminmail', DI::l10n()->t('Site administrator email address'), $adminmail, DI::l10n()->t('Your account email address must match this in order to use the web admin panel.'), 'required', '', 'email'), To evaluate the input value, you can then use the $_POST array, more precisely the $_POST['adminemail'] variable. Listed below are the template file names, the general purpose of the template and their field parameters.","title":"Form Templates"},{"location":"en/developer/smarty3-templates/#field_checkboxtpl","text":"A checkbox. If the checkbox is checked its value is 1 . Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Help text for the checkbox.","title":"field_checkbox.tpl"},{"location":"en/developer/smarty3-templates/#field_comboboxtpl","text":"A combobox, combining a pull down selection and a textual input field. Field parameter: Name of the combobox, Label for the combobox, Current value of the variable, Help text for the combobox, Array holding the possible values for the textual input, Array holding the possible values for the pull down selection.","title":"field_combobox.tpl"},{"location":"en/developer/smarty3-templates/#field_customtpl","text":"A customizable template to include a custom element in the form with the usual surroundings, Field parameter: Name of the field, Label for the field, the field, Help text for the field.","title":"field_custom.tpl"},{"location":"en/developer/smarty3-templates/#field_inputtpl","text":"A single line input field for any type of input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor into this box once the page is loaded, if set, it will be used for the input type, default is text (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types).","title":"field_input.tpl"},{"location":"en/developer/smarty3-templates/#field_intcheckboxtpl","text":"A checkbox (see above) but you can define the value of it. Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Value of the checkbox, Help text for the checkbox.","title":"field_intcheckbox.tpl"},{"location":"en/developer/smarty3-templates/#field_openidtpl","text":"An input box (see above) but prepared for special CSS styling for openID input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input field.","title":"field_openid.tpl"},{"location":"en/developer/smarty3-templates/#field_passwordtpl","text":"A single line input field (see above) for textual input. The characters typed in will not be shown by the browser. Field parameter: Name of the field, Label for the field, Value for the field, e.g. the old password, Help text for the input field, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor automatically into this input field.","title":"field_password.tpl"},{"location":"en/developer/smarty3-templates/#field_radiotpl","text":"A radio button. Field parameter: Name of the radio button, Label for the radio button, Current value of the variable, Help text for the button, if set, the radio button will be checked.","title":"field_radio.tpl"},{"location":"en/developer/smarty3-templates/#field_richtexttpl","text":"A multi-line input field for rich textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box.","title":"field_richtext.tpl"},{"location":"en/developer/smarty3-templates/#field_selecttpl","text":"A drop-down selection box. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Array holding the possible values of the selection drop-down.","title":"field_select.tpl"},{"location":"en/developer/smarty3-templates/#field_select_rawtpl","text":"A drop-down selection box (see above) but you have to prepare the values yourself. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Possible values of the selection drop-down.","title":"field_select_raw.tpl"},{"location":"en/developer/smarty3-templates/#field_textareatpl","text":"A multi-line input field for (plain) textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required.","title":"field_textarea.tpl"},{"location":"en/developer/tests/","tags":["developer","testing"],"text":"Tests # You can run unit tests with PHPUnit : phpunit Some tests require access to a MySQL database. You can specify the database credentials in environment variables: USER = database_user PASS = database_password DB = database_name phpunit Warning : This will empty all the tables! Never use this on a production database.","title":"Tests"},{"location":"en/developer/tests/#tests","text":"You can run unit tests with PHPUnit : phpunit Some tests require access to a MySQL database. You can specify the database credentials in environment variables: USER = database_user PASS = database_password DB = database_name phpunit Warning : This will empty all the tables! Never use this on a production database.","title":"Tests"},{"location":"en/developer/themes/","tags":["developer","themes","templates"],"text":"Themes # To change the look of friendica you have to touch the themes. The current default theme is Vier but there are numerous others. Have a look at github.com/bkil/friendica-themes for an overview of the existing themes. In case none of them suits your needs, there are several ways to change a theme. So, how to work on the UI of friendica. You can either directly edit an existing theme. But you might lose your changes when the theme is updated by the friendica team. If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheritance most of the properties of the parent theme and change just minor stuff. The below for a more detailed description of theme heritage. Some themes also allow users to select variants of the theme. Those theme variants most often contain an additional CSS file to override some styling of the default theme values. From the themes in the main repository duepunto zero and vier are using these methods for variations. Quattro is using a slightly different approach. Third you can start your theme from scratch. Which is the most complex way to change friendicas look. But it leaves you the most freedom. So below for a detailed description and the meaning of some special files. Styling # If you want to change the styling of a theme, have a look at the themes CSS file. In most cases, you can find these in /view/theme/**your-theme-name**/style.css sometimes, there is also a file called style.php in the theme directory. This is only needed if the theme allows the user to change certain things of the theme dynamically. Say the font size or set a background image. Templates # If you want to change the structure of the theme, you need to change the templates used by the theme. Friendica themes are using SMARTY3 for templating. The default template can be found in /view/templates if you want to override any template within your theme create your version of the template in /view/theme/**your-theme-name**/templates any template that exists there will be used instead of the default one. Javascript # The same rule applies to the JavaScript files found in /js they will be overwritten by files in /view/theme/**your-theme-name**/js. Expand an existing Theme # Theme Variations # Many themes are more theme families than only one theme. duepunto zero and vier allow easily to add new theme variation. We will go through the process of creating a new variation for duepunto zero . The same (well almost, some names change) procedure applies to the vier theme. And similar steps are needed for quattro but this theme is using lesscss to maintain the CSS files. In /view/theme/duepuntozero/deriv you find a couple of CSS files that define color derivations from the duepunto theme. These resemble some now as unsupported marked themes, that were inherited by the duepunto theme. Darkzero and Easter Bunny for example. The selection of the colorset is done in a combination of a template for a new form in the settings and some functions in the theme.php file. The template (theme_settings.tpl) {{ '{{include file=\"field_select.tpl\" field=$colorset}}' }} < div class = \"settings-submit-wrapper\" > {{ ' < input type = \"submit\" value = \"{{$submit}}\" class = \"settings-submit\" name = \"duepuntozero-settings-submit\" /> ' }} </ div > defines a formular consisting of a select pull-down which contains all available variants and s submit button. See the documentation about SMARTY3 templates for a summary of friendica specific blocks other than the select element. But we don't really need to change anything at the template itself. The template alone won't work though. You make friendica aware of its existence and tell it how to use the template file, by defining a config.php file. It needs to define at least the following functions theme_content theme_post and may also define functions for the admin interface theme_admin theme_admin_post. theme_content and theme_admin are used to make the form available in the settings, respectively the admin panel. The _post functions handle the processing of the send-form, in this case they save to selected variant in friendicas database. To make your own variation appear in the menu, all you need to do is to create a new CSS file in the deriv-directory and include it in the array in the config.php: $colorset = array( 'default'=>DI::l10n()->t('default'), 'greenzero'=>DI::l10n()->t('greenzero'), 'purplezero'=>DI::l10n()->t('purplezero'), 'easterbunny'=>DI::l10n()->t('easterbunny'), 'darkzero'=>DI::l10n()->t('darkzero'), 'comix'=>DI::l10n()->t('comix'), 'slackr'=>DI::l10n()->t('slackr'), ); ``` the 1st part of the line is the name of the CSS file (without the .css) the 2nd part is the common name of the variant. Calling the DI::l10n()->t() function with the common name makes the string translatable. The selected 1st part will be saved in the database by the theme_post function. ```php <?php function theme_post ( App $a ){ // non-local users shall not pass if ( ! local_user ()) { return ; } // if the one specific submit button was pressed then proceed if ( isset ( $_POST [ 'duepuntozero-settings-submit' ])){ // and save the selection key into the personal config of the user DI :: pConfig () -> set ( local_user (), 'duepuntozero' , 'colorset' , $_POST [ 'duepuntozero_colorset' ]); } } Now that this information is set in the database, what should friendica do with it? For this, have a look at the theme.php file of the duepunto zero . There you'll find something alike <?php $colorset = DI :: pConfig () -> get ( local_user (), 'duepuntozero' , 'colorset' ); if ( ! $colorset ) $colorset = DI :: config () -> get ( 'duepuntozero' , 'colorset' ); if ( $colorset ) { if ( $colorset == 'greenzero' ) DI :: page ()[ 'htmlhead' ] .= '<link rel=\"stylesheet\" href=\"view/theme/duepuntozero/deriv/greenzero.css\" type=\"text/css\" media=\"screen\" />' . \" \\n \" ; /* some more variants */ } which tells friendica to get the personal config of a user. Check if it is set and if not look for the global config. And finally if a config for the colorset was found, apply it by adding a link to the CSS file into the HTML header of the page. So you'll just need to add an if selection, fitting your variant keyword and link to the CSS file of it. Done. Now you can use the variant on your system. But remember once the theme.php or the config.php you have to re-add your variant to them. If you think your color variation could be beneficial for other friendica users as well, feel free to generate a pull request at GitHub, so we can include your work into the repository. Inheritance # Say, you like the duepuntozero, but you want to have the content of the outer columns left and right exchanged. That would be not a color variation as shown above. Instead, we will create a new theme, duepuntozero_lr, inherit the properties of duepuntozero and make small changes to the underlying php files. So create a directory called duepunto_lr and create a file called theme.php with your favorite text editor. The content of this file should be something like <?php /* meta information for the theme, see below */ use Friendica\\App ; function duepuntozero_lr_init ( App $a ) { $a -> setThemeInfoValue ( 'extends' , 'duepuntozero' ); $a -> set_template_engine ( 'smarty3' ); /* and more stuff e.g. the JavaScript function for the header */ } Next take the default.php file found in the /view directory and exchange the aside and right_aside elements. So the central part of the file now looks like this: < body > <?php if(!empty($page['nav'])) echo $page['nav']; ?> < aside > <?php if(!empty($page['right_aside'])) echo $page['right_aside']; ?> </ aside > < section > <?php if(!empty($page['content'])) echo $page['content']; ?> < div id = \"page-footer\" ></ div > </ section > < right_aside > <?php if(!empty($page['aside'])) echo $page['aside']; ?> </ right_aside > < footer > <?php if(!empty($page['footer'])) echo $page['footer']; ?> </ footer > </ body > Finally, we need a style.css file, inheriting the definitions from the parent theme and containing out changes for the new theme. Note :You need to create the style.css and at lest import the base CSS file from the parent theme. @import url('../duepuntozero/style.css'); Done. But I agree it is not really useful at this state. Nevertheless, to use it, you just need to activate in the admin panel. That done, you can select it in the settings like any other activated theme. Creating a Theme from Scratch # Keep patient. Basically what you have to do is identify which template you have to change, so it looks more like what you want. Adopt the CSS of the theme accordingly. And iterate the process until you have the theme the way you want it. Use the source Luke. and don't hesitate to ask in @ developers or @ helpers . Special Files # unsupported # If a file with this name (which might be empty) exists in the theme directory, the theme is marked as unsupported . An unsupported theme may not be selected by a user in the settings. Users who are already using it won't notice anything. README(.md) # The contents of this file, with or without the .md which indicates Markdown syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica. This file should contain information you want to let others know about your theme. screenshot.[png|jpg] # If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name. Supported formats are PNG and JPEG. theme.php # This is the main definition file of the theme. In the header of that file, some meta information is stored. For example, have a look at the theme.php of the quattro theme: <?php /** * Name: Quattro * Version: 0.6 * Author: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Tobias <https://f.diekershoff.de/profile/tobias> */ ``` You see the definition of the theme's name, it's version and the initial author of the theme. These three pieces of information should be listed. If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well. The information from the theme header will be displayed in the admin panel. The first thing in file is to import the ` App ` class from ` \\Friendica\\ ` namespace. ``` php use Friendica\\App ; This will make our job a little easier, as we don't have to specify the full name every time we need to use the App class. The next crucial part of the theme.php file is a definition of an init function. The name of the function is _init. So in the case of quattro it is <?php function quattro_init ( App $a ) { $a -> theme_info = array (); $a -> set_template_engine ( 'smarty3' ); } Here we have set the basic theme information, in this case they are empty. But the array needs to be set. And we have set the template engine that should be used by friendica for this theme. At the moment you should use the smarty3 engine. There once was a friendica specific templating engine as well but that is not used anymore. If you like to use another templating engine, please implement it. When you want to inherit stuff from another theme you have to announce this in the theme_info: $a->setThemeInfoValue('extends', 'duepuntozero'); which declares duepuntozero as parent of the theme. If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file. To do so, add something alike DI::page()['htmlhead'] .= <<< EOT /* stuff you want to add to the header */ EOT; The $a variable holds the friendica application. So you can access the properties of this friendica session from the theme.php file as well. default.php # This file covers the structure of the underlying HTML layout. The default file is in /view/default.php if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory. As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.","title":"Themes"},{"location":"en/developer/themes/#themes","text":"To change the look of friendica you have to touch the themes. The current default theme is Vier but there are numerous others. Have a look at github.com/bkil/friendica-themes for an overview of the existing themes. In case none of them suits your needs, there are several ways to change a theme. So, how to work on the UI of friendica. You can either directly edit an existing theme. But you might lose your changes when the theme is updated by the friendica team. If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheritance most of the properties of the parent theme and change just minor stuff. The below for a more detailed description of theme heritage. Some themes also allow users to select variants of the theme. Those theme variants most often contain an additional CSS file to override some styling of the default theme values. From the themes in the main repository duepunto zero and vier are using these methods for variations. Quattro is using a slightly different approach. Third you can start your theme from scratch. Which is the most complex way to change friendicas look. But it leaves you the most freedom. So below for a detailed description and the meaning of some special files.","title":"Themes"},{"location":"en/developer/themes/#styling","text":"If you want to change the styling of a theme, have a look at the themes CSS file. In most cases, you can find these in /view/theme/**your-theme-name**/style.css sometimes, there is also a file called style.php in the theme directory. This is only needed if the theme allows the user to change certain things of the theme dynamically. Say the font size or set a background image.","title":"Styling"},{"location":"en/developer/themes/#templates","text":"If you want to change the structure of the theme, you need to change the templates used by the theme. Friendica themes are using SMARTY3 for templating. The default template can be found in /view/templates if you want to override any template within your theme create your version of the template in /view/theme/**your-theme-name**/templates any template that exists there will be used instead of the default one.","title":"Templates"},{"location":"en/developer/themes/#javascript","text":"The same rule applies to the JavaScript files found in /js they will be overwritten by files in /view/theme/**your-theme-name**/js.","title":"Javascript"},{"location":"en/developer/themes/#expand-an-existing-theme","text":"","title":"Expand an existing Theme"},{"location":"en/developer/themes/#theme-variations","text":"Many themes are more theme families than only one theme. duepunto zero and vier allow easily to add new theme variation. We will go through the process of creating a new variation for duepunto zero . The same (well almost, some names change) procedure applies to the vier theme. And similar steps are needed for quattro but this theme is using lesscss to maintain the CSS files. In /view/theme/duepuntozero/deriv you find a couple of CSS files that define color derivations from the duepunto theme. These resemble some now as unsupported marked themes, that were inherited by the duepunto theme. Darkzero and Easter Bunny for example. The selection of the colorset is done in a combination of a template for a new form in the settings and some functions in the theme.php file. The template (theme_settings.tpl) {{ '{{include file=\"field_select.tpl\" field=$colorset}}' }} < div class = \"settings-submit-wrapper\" > {{ ' < input type = \"submit\" value = \"{{$submit}}\" class = \"settings-submit\" name = \"duepuntozero-settings-submit\" /> ' }} </ div > defines a formular consisting of a select pull-down which contains all available variants and s submit button. See the documentation about SMARTY3 templates for a summary of friendica specific blocks other than the select element. But we don't really need to change anything at the template itself. The template alone won't work though. You make friendica aware of its existence and tell it how to use the template file, by defining a config.php file. It needs to define at least the following functions theme_content theme_post and may also define functions for the admin interface theme_admin theme_admin_post. theme_content and theme_admin are used to make the form available in the settings, respectively the admin panel. The _post functions handle the processing of the send-form, in this case they save to selected variant in friendicas database. To make your own variation appear in the menu, all you need to do is to create a new CSS file in the deriv-directory and include it in the array in the config.php: $colorset = array( 'default'=>DI::l10n()->t('default'), 'greenzero'=>DI::l10n()->t('greenzero'), 'purplezero'=>DI::l10n()->t('purplezero'), 'easterbunny'=>DI::l10n()->t('easterbunny'), 'darkzero'=>DI::l10n()->t('darkzero'), 'comix'=>DI::l10n()->t('comix'), 'slackr'=>DI::l10n()->t('slackr'), ); ``` the 1st part of the line is the name of the CSS file (without the .css) the 2nd part is the common name of the variant. Calling the DI::l10n()->t() function with the common name makes the string translatable. The selected 1st part will be saved in the database by the theme_post function. ```php <?php function theme_post ( App $a ){ // non-local users shall not pass if ( ! local_user ()) { return ; } // if the one specific submit button was pressed then proceed if ( isset ( $_POST [ 'duepuntozero-settings-submit' ])){ // and save the selection key into the personal config of the user DI :: pConfig () -> set ( local_user (), 'duepuntozero' , 'colorset' , $_POST [ 'duepuntozero_colorset' ]); } } Now that this information is set in the database, what should friendica do with it? For this, have a look at the theme.php file of the duepunto zero . There you'll find something alike <?php $colorset = DI :: pConfig () -> get ( local_user (), 'duepuntozero' , 'colorset' ); if ( ! $colorset ) $colorset = DI :: config () -> get ( 'duepuntozero' , 'colorset' ); if ( $colorset ) { if ( $colorset == 'greenzero' ) DI :: page ()[ 'htmlhead' ] .= '<link rel=\"stylesheet\" href=\"view/theme/duepuntozero/deriv/greenzero.css\" type=\"text/css\" media=\"screen\" />' . \" \\n \" ; /* some more variants */ } which tells friendica to get the personal config of a user. Check if it is set and if not look for the global config. And finally if a config for the colorset was found, apply it by adding a link to the CSS file into the HTML header of the page. So you'll just need to add an if selection, fitting your variant keyword and link to the CSS file of it. Done. Now you can use the variant on your system. But remember once the theme.php or the config.php you have to re-add your variant to them. If you think your color variation could be beneficial for other friendica users as well, feel free to generate a pull request at GitHub, so we can include your work into the repository.","title":"Theme Variations"},{"location":"en/developer/themes/#inheritance","text":"Say, you like the duepuntozero, but you want to have the content of the outer columns left and right exchanged. That would be not a color variation as shown above. Instead, we will create a new theme, duepuntozero_lr, inherit the properties of duepuntozero and make small changes to the underlying php files. So create a directory called duepunto_lr and create a file called theme.php with your favorite text editor. The content of this file should be something like <?php /* meta information for the theme, see below */ use Friendica\\App ; function duepuntozero_lr_init ( App $a ) { $a -> setThemeInfoValue ( 'extends' , 'duepuntozero' ); $a -> set_template_engine ( 'smarty3' ); /* and more stuff e.g. the JavaScript function for the header */ } Next take the default.php file found in the /view directory and exchange the aside and right_aside elements. So the central part of the file now looks like this: < body > <?php if(!empty($page['nav'])) echo $page['nav']; ?> < aside > <?php if(!empty($page['right_aside'])) echo $page['right_aside']; ?> </ aside > < section > <?php if(!empty($page['content'])) echo $page['content']; ?> < div id = \"page-footer\" ></ div > </ section > < right_aside > <?php if(!empty($page['aside'])) echo $page['aside']; ?> </ right_aside > < footer > <?php if(!empty($page['footer'])) echo $page['footer']; ?> </ footer > </ body > Finally, we need a style.css file, inheriting the definitions from the parent theme and containing out changes for the new theme. Note :You need to create the style.css and at lest import the base CSS file from the parent theme. @import url('../duepuntozero/style.css'); Done. But I agree it is not really useful at this state. Nevertheless, to use it, you just need to activate in the admin panel. That done, you can select it in the settings like any other activated theme.","title":"Inheritance"},{"location":"en/developer/themes/#creating-a-theme-from-scratch","text":"Keep patient. Basically what you have to do is identify which template you have to change, so it looks more like what you want. Adopt the CSS of the theme accordingly. And iterate the process until you have the theme the way you want it. Use the source Luke. and don't hesitate to ask in @ developers or @ helpers .","title":"Creating a Theme from Scratch"},{"location":"en/developer/themes/#special-files","text":"","title":"Special Files"},{"location":"en/developer/themes/#unsupported","text":"If a file with this name (which might be empty) exists in the theme directory, the theme is marked as unsupported . An unsupported theme may not be selected by a user in the settings. Users who are already using it won't notice anything.","title":"unsupported"},{"location":"en/developer/themes/#readmemd","text":"The contents of this file, with or without the .md which indicates Markdown syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica. This file should contain information you want to let others know about your theme.","title":"README(.md)"},{"location":"en/developer/themes/#screenshotpngjpg","text":"If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name. Supported formats are PNG and JPEG.","title":"screenshot.[png|jpg]"},{"location":"en/developer/themes/#themephp","text":"This is the main definition file of the theme. In the header of that file, some meta information is stored. For example, have a look at the theme.php of the quattro theme: <?php /** * Name: Quattro * Version: 0.6 * Author: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Tobias <https://f.diekershoff.de/profile/tobias> */ ``` You see the definition of the theme's name, it's version and the initial author of the theme. These three pieces of information should be listed. If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well. The information from the theme header will be displayed in the admin panel. The first thing in file is to import the ` App ` class from ` \\Friendica\\ ` namespace. ``` php use Friendica\\App ; This will make our job a little easier, as we don't have to specify the full name every time we need to use the App class. The next crucial part of the theme.php file is a definition of an init function. The name of the function is _init. So in the case of quattro it is <?php function quattro_init ( App $a ) { $a -> theme_info = array (); $a -> set_template_engine ( 'smarty3' ); } Here we have set the basic theme information, in this case they are empty. But the array needs to be set. And we have set the template engine that should be used by friendica for this theme. At the moment you should use the smarty3 engine. There once was a friendica specific templating engine as well but that is not used anymore. If you like to use another templating engine, please implement it. When you want to inherit stuff from another theme you have to announce this in the theme_info: $a->setThemeInfoValue('extends', 'duepuntozero'); which declares duepuntozero as parent of the theme. If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file. To do so, add something alike DI::page()['htmlhead'] .= <<< EOT /* stuff you want to add to the header */ EOT; The $a variable holds the friendica application. So you can access the properties of this friendica session from the theme.php file as well.","title":"theme.php"},{"location":"en/developer/themes/#defaultphp","text":"This file covers the structure of the underlying HTML layout. The default file is in /view/default.php if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory. As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.","title":"default.php"},{"location":"en/developer/translations/","tags":["developer","translations"],"text":"Friendica translations # Overview # The Friendica translation process is based on gettext PO files. Basic workflow: 1. xgettext is used to collect translation strings across the project in the authoritative PO file located in view/lang/C/messages.po . 2. This file makes translations strings available at the Transifex Friendica page . 3. The translation itself is done at Transifex by volunteers. 4. The resulting PO files by languages are manually updated in view/lang/<language>/messages.po . 5. PO files are converted to PHP arrays in view/lang/<language>/strings.php that are ultimately used by Friendica to display the translations. Translate Friendica in your favorite language # Thank you for your interest in improving Friendica's translation! Please register a free Transifex account and ask over at the Transifex Friendica page to join the translation team for your favorite language. As a rule of thumb, we add support for a language in Friendica when at least 50% of the strings have been translated to avoid a scattered experience. For addons, we add support for a language when if we already support the language in Friendica. Add new translation strings # Core # Once you have added new translation strings in your code changes, please run bin/run_xgettext.sh from the base Friendica directory and commit the updated view/lang/C/messages.po to your branch. Addon # If you have the friendica-addons repository in the addon directory of your Friendica cloned repository, just run bin/run_xgettext.sh -a <addon_name> from the base Friendica directory. Otherwise: cd /path/to/friendica-addons/<addon_name> /path/to/friendica/bin/run_xgettext.sh -s In either case, you need to commit the updated <addon_name>/lang/C/messages.po to your working branch. Update translations from Transifex # Please download the Transifex file \"for use\" in view/lang/<language>/messages.po . Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch. Using the Transifex client # Transifex has a client program which allows you to sync files between your cloned Friendica repository and Transifex. Help for the client can be found at the Transifex Help Center . Here we will only cover basic usage. After installation of the client, you should have a tx command available on your system. To use it, first create a configuration file with your credentials. On Linux this file should be placed into your home directory ~/.transifexrc . The content of the file should be something like the following: [https://www.transifex.com] username = user token = password = p@ssw0rd hostname = https://www.transifex.com Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository in .tx/config . To update the PO files after you have translated strings of e.g. Esperanto on the Transifex website you can use tx to download the updated PO-file in the right location. tx pull -l eo Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch. Translation functions usage # Basic usage # Friendica\\DI::l10n()->t('Label') => Label Friendica\\DI::l10n()->t('Label %s', 'test') => Label test Plural # Friendica\\DI::l10n()->tt('Label', 'Labels', 1) => Label Friendica\\DI::l10n()->tt('Label', 'Labels', 3) => Labels Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 1) => 1 Label Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 3) => 3 Labels Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 1, 'test', 'test2') => Label test test2 Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 3, 'test', 'test2') => Labels test test2","title":"Translations"},{"location":"en/developer/translations/#friendica-translations","text":"","title":"Friendica translations"},{"location":"en/developer/translations/#overview","text":"The Friendica translation process is based on gettext PO files. Basic workflow: 1. xgettext is used to collect translation strings across the project in the authoritative PO file located in view/lang/C/messages.po . 2. This file makes translations strings available at the Transifex Friendica page . 3. The translation itself is done at Transifex by volunteers. 4. The resulting PO files by languages are manually updated in view/lang/<language>/messages.po . 5. PO files are converted to PHP arrays in view/lang/<language>/strings.php that are ultimately used by Friendica to display the translations.","title":"Overview"},{"location":"en/developer/translations/#translate-friendica-in-your-favorite-language","text":"Thank you for your interest in improving Friendica's translation! Please register a free Transifex account and ask over at the Transifex Friendica page to join the translation team for your favorite language. As a rule of thumb, we add support for a language in Friendica when at least 50% of the strings have been translated to avoid a scattered experience. For addons, we add support for a language when if we already support the language in Friendica.","title":"Translate Friendica in your favorite language"},{"location":"en/developer/translations/#add-new-translation-strings","text":"","title":"Add new translation strings"},{"location":"en/developer/translations/#core","text":"Once you have added new translation strings in your code changes, please run bin/run_xgettext.sh from the base Friendica directory and commit the updated view/lang/C/messages.po to your branch.","title":"Core"},{"location":"en/developer/translations/#addon","text":"If you have the friendica-addons repository in the addon directory of your Friendica cloned repository, just run bin/run_xgettext.sh -a <addon_name> from the base Friendica directory. Otherwise: cd /path/to/friendica-addons/<addon_name> /path/to/friendica/bin/run_xgettext.sh -s In either case, you need to commit the updated <addon_name>/lang/C/messages.po to your working branch.","title":"Addon"},{"location":"en/developer/translations/#update-translations-from-transifex","text":"Please download the Transifex file \"for use\" in view/lang/<language>/messages.po . Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch.","title":"Update translations from Transifex"},{"location":"en/developer/translations/#using-the-transifex-client","text":"Transifex has a client program which allows you to sync files between your cloned Friendica repository and Transifex. Help for the client can be found at the Transifex Help Center . Here we will only cover basic usage. After installation of the client, you should have a tx command available on your system. To use it, first create a configuration file with your credentials. On Linux this file should be placed into your home directory ~/.transifexrc . The content of the file should be something like the following: [https://www.transifex.com] username = user token = password = p@ssw0rd hostname = https://www.transifex.com Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository in .tx/config . To update the PO files after you have translated strings of e.g. Esperanto on the Transifex website you can use tx to download the updated PO-file in the right location. tx pull -l eo Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch.","title":"Using the Transifex client"},{"location":"en/developer/translations/#translation-functions-usage","text":"","title":"Translation functions usage"},{"location":"en/developer/translations/#basic-usage","text":"Friendica\\DI::l10n()->t('Label') => Label Friendica\\DI::l10n()->t('Label %s', 'test') => Label test","title":"Basic usage"},{"location":"en/developer/translations/#plural","text":"Friendica\\DI::l10n()->tt('Label', 'Labels', 1) => Label Friendica\\DI::l10n()->tt('Label', 'Labels', 3) => Labels Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 1) => 1 Label Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 3) => 3 Labels Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 1, 'test', 'test2') => Label test test2 Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 3, 'test', 'test2') => Labels test test2","title":"Plural"},{"location":"en/developer/vagrant/","tags":["developer","testing"],"text":"Vagrant for Friendica Developers # Getting started # Vagrant is a virtualization solution for developers. No need to set up a webserver, database etc. before actually starting. Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica. It brings a Debian Bullseye with PHP 7.4 and MariaDB 10.5.11. What you need to do: Install VirtualBox and vagrant. Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. Git clone your Friendica repository. Inside, you'll find a Vagrantfile and some scripts in the bin/dev folder. Pull the PHP requirements with bin/composer install . Run vagrant up from inside the friendica clone. This will start the virtual machine. Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. Run vagrant ssh to log into the virtual machine to log in to the VM in case you need to debug something on the server. Open you test installation in a browser. Go to friendica.local (or 192.168.22.10). friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page. The mysql database is called \"friendica\", the mysql user and password both are \"friendica\". Work on Friendica's code in your git clone on your machine (not in the VM). Your local working directory is set up as a shared directory with the VM (/vagrant). Check the changes in your browser in the VM. Find the Friendica log file /vagrant/logfile.out on the VM or in the logfile.out in you local Friendica directory. Commit and push your changes directly back to GitHub. If you want to stop vagrant after finishing your work, run the following command vagrant halt in the development directory. This will not delete the virtual machine. 9. To ultimately delete the virtual machine run vagrant destroy rm /vagrant/config/local.config.php to make sure that you can start from scratch with another \"vagrant up\". Default User Accounts # By default, the provision script will set up two user accounts. admin, password admin friendica, password friendica Trouble Shooting # If you see a version mismatch for the VirtualBox Guest Additions between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. Stack Overflow ). Stop the Vagrant VM and run the following command: vagrant plugin install vagrant-vbguest On the next Vagrant up, the version problem should be fixed. If friendica.local is not resolved, you may need to add an entry to the /etc/hosts file (or similar configuration depending on the OS you are using). For further documentation of vagrant, please see the vagrant docs .","title":"Vagrant"},{"location":"en/developer/vagrant/#vagrant-for-friendica-developers","text":"","title":"Vagrant for Friendica Developers"},{"location":"en/developer/vagrant/#getting-started","text":"Vagrant is a virtualization solution for developers. No need to set up a webserver, database etc. before actually starting. Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica. It brings a Debian Bullseye with PHP 7.4 and MariaDB 10.5.11. What you need to do: Install VirtualBox and vagrant. Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. Git clone your Friendica repository. Inside, you'll find a Vagrantfile and some scripts in the bin/dev folder. Pull the PHP requirements with bin/composer install . Run vagrant up from inside the friendica clone. This will start the virtual machine. Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. Run vagrant ssh to log into the virtual machine to log in to the VM in case you need to debug something on the server. Open you test installation in a browser. Go to friendica.local (or 192.168.22.10). friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page. The mysql database is called \"friendica\", the mysql user and password both are \"friendica\". Work on Friendica's code in your git clone on your machine (not in the VM). Your local working directory is set up as a shared directory with the VM (/vagrant). Check the changes in your browser in the VM. Find the Friendica log file /vagrant/logfile.out on the VM or in the logfile.out in you local Friendica directory. Commit and push your changes directly back to GitHub. If you want to stop vagrant after finishing your work, run the following command vagrant halt in the development directory. This will not delete the virtual machine. 9. To ultimately delete the virtual machine run vagrant destroy rm /vagrant/config/local.config.php to make sure that you can start from scratch with another \"vagrant up\".","title":"Getting started"},{"location":"en/developer/vagrant/#default-user-accounts","text":"By default, the provision script will set up two user accounts. admin, password admin friendica, password friendica","title":"Default User Accounts"},{"location":"en/developer/vagrant/#trouble-shooting","text":"If you see a version mismatch for the VirtualBox Guest Additions between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. Stack Overflow ). Stop the Vagrant VM and run the following command: vagrant plugin install vagrant-vbguest On the next Vagrant up, the version problem should be fixed. If friendica.local is not resolved, you may need to add an entry to the /etc/hosts file (or similar configuration depending on the OS you are using). For further documentation of vagrant, please see the vagrant docs .","title":"Trouble Shooting"},{"location":"en/developer/","tags":["Developer","Intro"],"text":"Where to get started to help improve Friendica # Do you want to help us improve Friendica? Here we have compiled some hints on how to get started and some tasks to help you choose. A project like Friendica is the sum of many contributions. Very different skills are required to make good software, not all of them involve coding! We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons. Whether you feel like an expert or like a newbie - join us with your ideas! Contact us # The discussion of Friendica development takes place in the following Friendica forums: The main forum for Friendica development Help other users # Remember the questions you had when you first tried Friendica? A good place to start can be to help new people find their way around Friendica in the general support forum . Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can. Translation # The documentation contains help on how to translate Friendica at Transifex where the UI is translated. If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files? Design # Are you good at designing things? If you have seen Friendica you probably have ideas to improve it, haven't you? If you would like to work with us on enhancing the user interface, please join the forum for Friendica development . Make plans for a better Friendica interface design and share them with us. Tell us if you are able to realize your ideas or what kind of help you need. We can't promise we have the right skills in the group, but we'll try. Choose a thing to start with, e.g. work on the icon set of your favorite theme Programming # Friendica uses an implementation of Domain-Driven-Design , please make sure to check out the provided links for hints at the expected code architecture. Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . If you want to have git automatically update the dependencies with composer, you can use the post-merge git-hook with a script similar to this one: #!/usr/bin/env bash # MIT \u00a9 Sindre Sorhus - sindresorhus.com # forked by Gianluca Guarini # phponly by Ivo Bathke ;) # modified for Friendica by Tobias Diekershoff changed_files=\"$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)\" check_run() { echo \"$changed_files\" | grep --quiet \"$1\" && eval \"$2\" } # `composer install` if the `composer.lock` file gets changed # to update all the php dependencies check_run composer.lock \"bin/composer.phar install --no-dev\" just place it into .git/hooks/post-merge and make it executable. Class autoloading Using Composer How To Move Classes to src Coding standards # For the sake of consistency between contribution and general code readability, Friendica follows the widespread PSR-2 coding standards to the exception to a few rules. Here's a few primers if you are new to Friendica or to the PSR-2 coding standards: Indentation is tabs, period (not PSR-2). By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds). Operators are wrapped by spaces, e.g. $var === true , $var = 1 + 2 and 'string' . $concat . 'enation' Braces are mandatory in conditions Boolean operators are && and || for PHP conditions, AND and OR for SQL queries No closing PHP tag No trailing spaces Array declarations use the new square brackets syntax Quoting style is single quotes by default, except for needed string interpolation, SQL query strings by convention and comments that should stay in natural language. Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica. There are a few tools you can use to check or fix your files before you commit. For documentation, we use the standard of one sentence per line for the md files in the /doc and /doc/$lng subdirectories. Check with PHP Code Sniffer # This tool checks your files against a variety of coding standards, including PSR-2, and outputs a report of all the standard violations. You can simply install it through PEAR: pear install PHP_CodeSniffer Once it is installed and available in your PATH, here's the command to run before committing your work: $> phpcs --standard=ruleset.xml <file or directory> The output is a list of all the coding standards violations that you should fix before committing your work. Additionally, phpcs integrates with a few IDEs (Eclipse, Netbeans, PHPStorm...) so that you don't have to fiddle with the command line. Fix with PHP Code Beautifier and Fixer (phpbcf) included in PHP Code Sniffer # If you're getting a massive list of standards violations when running phpcs , it can be annoying to fix all the violations by hand. Thankfully, PHP Code Sniffer is shipped with an automatic code fixer that can take care of the tedious task for you. Here's the command to automatically fix the files you created/modified: $> phpcbf --standard=ruleset.xml <file or directory> If the command-line tools diff and patch are unavailable for you, phpcbf can use slightly slower PHP equivalents by using the --no-patch argument. Code documentation # If you are interested in having the documentation of the Friendica code outside the code files, you can use Doxygen to generate it. The configuration file for Doxygen is located in the base directory of the project sources. Run $> doxygen Doxyfile to generate the files which will be located in the doc/html subdirectory in the Friendica directory. You can browse these files with any browser. If you find missing documentation, don't hesitate to contact us and write it down to enhance the code documentation. Issues # Have a look at our issue tracker on GitHub! Try to reproduce a bug that needs more inquiries and write down what you find out. If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed. Fix a bug if you can. Please make the pull request against the develop branch of the repository. There is a Junior Job label for issues we think might be a good point to start with. But you don't have to limit yourself to those issues. Web interface # The thing many people want most is a better interface, preferably a responsive Friendica theme. This is a piece of work! If you want to get involved here: Look at the first steps that were made (e.g. the clean theme). Ask us to find out whom to talk to about their experiences. Talk to design people if you know any. Let us know about your plans in the dev forum Do not worry about cross-posting. Client software # As Friendica is using a Twitter/GNU Social compatible API any of the clients for those platforms should work with Friendica as well. Furthermore, there are several client projects, especially for use with Friendica. If you are interested in improving those clients, please contact the developers of the clients directly. Android / LinageOS: Friendiqa src / Google Play developed by Marco R iOS: currently no client SailfishOS: Friendiy src - developed by Fabio Windows: Friendica Mobile for Windows versions before 8.1 and Windows 10 - developed by Gerhard Seeber","title":"Get Started"},{"location":"en/developer/#where-to-get-started-to-help-improve-friendica","text":"Do you want to help us improve Friendica? Here we have compiled some hints on how to get started and some tasks to help you choose. A project like Friendica is the sum of many contributions. Very different skills are required to make good software, not all of them involve coding! We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons. Whether you feel like an expert or like a newbie - join us with your ideas!","title":"Where to get started to help improve Friendica"},{"location":"en/developer/#contact-us","text":"The discussion of Friendica development takes place in the following Friendica forums: The main forum for Friendica development","title":"Contact us"},{"location":"en/developer/#help-other-users","text":"Remember the questions you had when you first tried Friendica? A good place to start can be to help new people find their way around Friendica in the general support forum . Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can.","title":"Help other users"},{"location":"en/developer/#translation","text":"The documentation contains help on how to translate Friendica at Transifex where the UI is translated. If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files?","title":"Translation"},{"location":"en/developer/#design","text":"Are you good at designing things? If you have seen Friendica you probably have ideas to improve it, haven't you? If you would like to work with us on enhancing the user interface, please join the forum for Friendica development . Make plans for a better Friendica interface design and share them with us. Tell us if you are able to realize your ideas or what kind of help you need. We can't promise we have the right skills in the group, but we'll try. Choose a thing to start with, e.g. work on the icon set of your favorite theme","title":"Design"},{"location":"en/developer/#programming","text":"Friendica uses an implementation of Domain-Driven-Design , please make sure to check out the provided links for hints at the expected code architecture.","title":"Programming"},{"location":"en/developer/#composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . If you want to have git automatically update the dependencies with composer, you can use the post-merge git-hook with a script similar to this one: #!/usr/bin/env bash # MIT \u00a9 Sindre Sorhus - sindresorhus.com # forked by Gianluca Guarini # phponly by Ivo Bathke ;) # modified for Friendica by Tobias Diekershoff changed_files=\"$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)\" check_run() { echo \"$changed_files\" | grep --quiet \"$1\" && eval \"$2\" } # `composer install` if the `composer.lock` file gets changed # to update all the php dependencies check_run composer.lock \"bin/composer.phar install --no-dev\" just place it into .git/hooks/post-merge and make it executable. Class autoloading Using Composer How To Move Classes to src","title":"Composer"},{"location":"en/developer/#coding-standards","text":"For the sake of consistency between contribution and general code readability, Friendica follows the widespread PSR-2 coding standards to the exception to a few rules. Here's a few primers if you are new to Friendica or to the PSR-2 coding standards: Indentation is tabs, period (not PSR-2). By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds). Operators are wrapped by spaces, e.g. $var === true , $var = 1 + 2 and 'string' . $concat . 'enation' Braces are mandatory in conditions Boolean operators are && and || for PHP conditions, AND and OR for SQL queries No closing PHP tag No trailing spaces Array declarations use the new square brackets syntax Quoting style is single quotes by default, except for needed string interpolation, SQL query strings by convention and comments that should stay in natural language. Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica. There are a few tools you can use to check or fix your files before you commit. For documentation, we use the standard of one sentence per line for the md files in the /doc and /doc/$lng subdirectories.","title":"Coding standards"},{"location":"en/developer/#check-with-php-code-sniffer","text":"This tool checks your files against a variety of coding standards, including PSR-2, and outputs a report of all the standard violations. You can simply install it through PEAR: pear install PHP_CodeSniffer Once it is installed and available in your PATH, here's the command to run before committing your work: $> phpcs --standard=ruleset.xml <file or directory> The output is a list of all the coding standards violations that you should fix before committing your work. Additionally, phpcs integrates with a few IDEs (Eclipse, Netbeans, PHPStorm...) so that you don't have to fiddle with the command line.","title":"Check with PHP Code Sniffer"},{"location":"en/developer/#fix-with-php-code-beautifier-and-fixer-phpbcf-included-in-php-code-sniffer","text":"If you're getting a massive list of standards violations when running phpcs , it can be annoying to fix all the violations by hand. Thankfully, PHP Code Sniffer is shipped with an automatic code fixer that can take care of the tedious task for you. Here's the command to automatically fix the files you created/modified: $> phpcbf --standard=ruleset.xml <file or directory> If the command-line tools diff and patch are unavailable for you, phpcbf can use slightly slower PHP equivalents by using the --no-patch argument.","title":"Fix with PHP Code Beautifier and Fixer (phpbcf) included in PHP Code Sniffer"},{"location":"en/developer/#code-documentation","text":"If you are interested in having the documentation of the Friendica code outside the code files, you can use Doxygen to generate it. The configuration file for Doxygen is located in the base directory of the project sources. Run $> doxygen Doxyfile to generate the files which will be located in the doc/html subdirectory in the Friendica directory. You can browse these files with any browser. If you find missing documentation, don't hesitate to contact us and write it down to enhance the code documentation.","title":"Code documentation"},{"location":"en/developer/#issues","text":"Have a look at our issue tracker on GitHub! Try to reproduce a bug that needs more inquiries and write down what you find out. If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed. Fix a bug if you can. Please make the pull request against the develop branch of the repository. There is a Junior Job label for issues we think might be a good point to start with. But you don't have to limit yourself to those issues.","title":"Issues"},{"location":"en/developer/#web-interface","text":"The thing many people want most is a better interface, preferably a responsive Friendica theme. This is a piece of work! If you want to get involved here: Look at the first steps that were made (e.g. the clean theme). Ask us to find out whom to talk to about their experiences. Talk to design people if you know any. Let us know about your plans in the dev forum Do not worry about cross-posting.","title":"Web interface"},{"location":"en/developer/#client-software","text":"As Friendica is using a Twitter/GNU Social compatible API any of the clients for those platforms should work with Friendica as well. Furthermore, there are several client projects, especially for use with Friendica. If you are interested in improving those clients, please contact the developers of the clients directly. Android / LinageOS: Friendiqa src / Google Play developed by Marco R iOS: currently no client SailfishOS: Friendiy src - developed by Fabio Windows: Friendica Mobile for Windows versions before 8.1 and Windows 10 - developed by Gerhard Seeber","title":"Client software"},{"location":"en/developer/addons/","tags":["developer"],"text":"Friendica Addon development # Please see the sample addon 'randplace' for a working example of using some of these features. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path). Naming # Addon names are used in file paths and functions names, and as such: - Can't contain spaces or punctuation. - Can't start with a number. Metadata # You can provide human-readable information about your addon in the first multi-line comment of your addon file. Here's the structure: /** * Name: {Human-readable name} * Description: {Short description} * Version: 1.0 * Author: {Author1 Name} * Author: {Author2 Name} <{Author profile link}> * Maintainer: {Maintainer1 Name} * Maintainer: {Maintainer2 Name} <{Maintainer profile link}> * Status: {Unsupported|Arbitrary status} */ You can also provide a longer documentation in a README or README.md file. The latter will be converted from Markdown to HTML in the addon detail page. Install/Uninstall # If your addon uses hooks, they have to be registered in a <addon>_install() function. This function also allows to perform arbitrary actions your addon needs to function properly. Uninstalling an addon automatically unregisters any hook it registered, but if you need to provide specific uninstallation steps, you can add them in a <addon>_uninstall() function. The installation and uninstallation functions will be called (i.e. re-installed) if the addon changes after installation. Therefore, your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for \"setup\" amd \"remove\". PHP addon hooks # Register your addon hooks during installation. \\Friendica\\Core\\Hook::register($hookname, $file, $function); $hookname is a string and corresponds to a known Friendica PHP hook. $file is a pathname relative to the top-level Friendica directory. This should be 'addon/ addon_name / addon_name .php' in most cases and can be shortened to __FILE__ . $function is a string and is the name of the function which will be executed when the hook is called. Arguments # Your hook callback functions will be called with at least one and possibly two arguments function <addon>_<hookname>(App $a, &$b) { } If you wish to make changes to the calling data, you must declare them as reference variables (with & ) during function declaration. $a # $a is the Friendica App class. It contains a wealth of information about the current state of Friendica: which module has been called, configuration information, the page contents at the point the hook was invoked, profile and user information, etc. It is recommended you call this $a to match its usage elsewhere. $b # $b can be called anything you like. This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter. Remember to declare it with & if you wish to alter it. Admin settings # Your addon can provide user-specific settings via the addon_settings PHP hook, but it can also provide node-wide settings in the administration page of your addon. Simply declare a <addon>_addon_admin(App $a) function to display the form and a <addon>_addon_admin_post(App $a) function to process the data from the form. Global stylesheets # If your addon requires adding a stylesheet on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('head', __FILE__, '<addon>_head'); ... } function <addon>_head(App $a) { \\Friendica\\DI::page()->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css'); } __DIR__ is the folder path of your addon. JavaScript # Global scripts # If your addon requires adding a script on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('footer', __FILE__, '<addon>_footer'); ... } function <addon>_footer(App $a) { \\Friendica\\DI::page()->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js'); } __DIR__ is the folder path of your addon. JavaScript hooks # The main Friendica script provides hooks via events dispatched on the document property. In your Javascript file included as described above, add your event listener like this: document . addEventListener ( name , callback ); name is the name of the hook and corresponds to a known Friendica JavaScript hook. callback is a JavaScript anonymous function to execute. More info about Javascript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener Current JavaScript hooks # postprocess_liveupdate # Called at the end of the live update process (XmlHttpRequest) and on a post preview. No additional data is provided. Modules # Addons may also act as \"modules\" and intercept all page requests for a given URL path. In order for an addon to act as a module it needs to declare an empty function <addon>_module() . If this function exists, you will now receive all page requests for https://my.web.site/<addon> - with any number of URL components as additional arguments. These are parsed into the App\\Arguments object. So https://my.web.site/addon/arg1/arg2 would give this: DI::args()->getArgc(); // = 3 DI::args()->get(0); // = 'addon' DI::args()->get(1); // = 'arg1' DI::args()->get(2); // = 'arg2' To display a module page, you need to declare the function <addon>_content(App $a) , which defines and returns the page body content. They may also contain <addon>_post(App $a) which is called before the <addon>_content function and typically handles the results of POST forms. You may also have <addon>_init(App $a) which is called before <addon>_content and should include common logic to your module. Templates # If your addon needs some template, you can use the Friendica template system. Friendica uses smarty3 as a template engine. Put your tpl files in the templates/ sub-folder of your addon. In your code, like in the function addon_name_content(), load the template file and execute it passing needed values: use Friendica\\Core\\Renderer; # load template file. first argument is the template name, # second is the addon path relative to friendica top folder $tpl = Renderer::getMarkupTemplate('mytemplate.tpl', __DIR__); # apply template. first argument is the loaded template, # second an array of 'name' => 'values' to pass to template $output = Renderer::replaceMacros($tpl, array( 'title' => 'My beautiful addon', )); See also the wiki page Quick Template Guide . Current PHP hooks # authenticate # Called when a user attempts to login. $b is an array containing: username : the supplied username password : the supplied password authenticated : set this to non-zero to authenticate the user. user_record : successful authentication must also return a valid user record from the database logged_in # Called after a user has successfully logged in. $b contains the $a->user array. display_item # Called when formatting a post for display. $b is an array: item : The item (array) details pulled from the database output : the (string) HTML representation of this item prior to adding it to the page post_local # Called when a status post or comment is entered on the local system. $b is the item array of the information to be stored in the database. Please note: body contents are bbcode - not HTML. post_local_end # Called when a local status post or comment has been stored on the local system. $b is the item array of the information which has just been stored in the database. Please note: body contents are bbcode - not HTML post_remote # Called when receiving a post from another source. This may also be used to post local activity or system generated messages. $b is the item array of information to be stored in the database and the item body is bbcode. addon_settings # Called when generating the HTML for the addon settings page. $data is an array containing: addon (output): Required. The addon folder name. title (output): Required. The addon settings panel title. href (output): Optional. If set, will reduce the panel to a link pointing to this URL, can be relative. Incompatible with the following keys. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display. Examples # With link # $data = [ 'addon' => 'advancedcontentfilter', 'title' => DI::l10n()->t('Advanced Content Filter'), 'href' => 'advancedcontentfilter', ]; With default submit button # $data = [ 'addon' => 'fromapp', 'title' => DI::l10n()->t('FromApp Settings'), 'html' => $html, ]; With no HTML, just a submit button # $data = [ 'addon' => 'opmlexport', 'title' => DI::l10n()->t('OPML Export'), 'submit' => DI::l10n()->t('Export RSS/Atom contacts'), ]; With multiple submit buttons # $data = [ 'addon' => 'catavar', 'title' => DI::l10n()->t('Cat Avatar Settings'), 'html' => $html, 'submit' => [ 'catavatar-usecat' => DI::l10n()->t('Use Cat as Avatar'), 'catavatar-morecat' => DI::l10n()->t('Another random Cat!'), 'catavatar-emailcat' => DI::pConfig()->get(local_user(), 'catavatar', 'seed', false) ? DI::l10n()->t('Reset to email Cat') : null, ], ]; addon_settings_post # Called when the Addon Settings pages are submitted. $b is the $_POST array. connector_settings # Called when generating the HTML for a connector addon settings page. $data is an array containing: connector (output): Required. The addon folder name. title (output): Required. The addon settings panel title. image (output): Required. The relative path of the logo image of the platform/protocol this addon is connecting to, max size 48x48px. enabled (output): Optional. If set to a falsy value, the connector image will be dimmed. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display. Examples # With default submit button # $data = [ 'connector' => 'diaspora', 'title' => DI::l10n()->t('Diaspora Export'), 'image' => 'images/diaspora-logo.png', 'enabled' => $enabled, 'html' => $html, ]; With custom submit button label and no logo dim # $data = [ 'connector' => 'ifttt', 'title' => DI::l10n()->t('IFTTT Mirror'), 'image' => 'addon/ifttt/ifttt.png', 'html' => $html, 'submit' => DI::l10n()->t('Generate new key'), ]; With conditional submit buttons # $submit = ['pumpio-submit' => DI::l10n()->t('Save Settings')]; if ($oauth_token && $oauth_token_secret) { $submit['pumpio-delete'] = DI::l10n()->t('Delete this preset'); } $data = [ 'connector' => 'pumpio', 'title' => DI::l10n()->t('Pump.io Import/Export/Mirror'), 'image' => 'images/pumpio.png', 'enabled' => $enabled, 'html' => $html, 'submit' => $submit, ]; profile_post # Called when posting a profile page. $b is the $_POST array. profile_edit # Called prior to output of profile edit page. $b is an array containing: profile : profile (array) record from the database entry : the (string) HTML of the generated entry profile_advanced # Called when the HTML is generated for the Advanced profile, corresponding to the Profile tab within a person's profile page. $b is the HTML string representation of the generated profile. The profile array details are in $a->profile . directory_item # Called from the Directory page when formatting an item for display. $b is an array: contact : contact record array for the person from the database entry : the HTML string of the generated entry profile_sidebar_enter # Called prior to generating the sidebar \"short\" profile for a page. $b is the person's profile array profile_sidebar # Called when generating the sidebar \"short\" profile for a page. $b is an array: profile : profile record array for the person from the database entry : the HTML string of the generated entry contact_block_end # Called when formatting the block of contacts/friends on a profile sidebar has completed. $b is an array: contacts : array of contacts output : the generated HTML string of the contact block bbcode # Called after conversion of bbcode to HTML. $b is an HTML string converted text. html2bbcode # Called after tag conversion of HTML to bbcode (e.g. remote message posting) $b is a string converted text head # Called when building the <head> sections. Stylesheets should be registered using this hook. $b is an HTML string of the <head> tag. page_header # Called after building the page navigation section. $b is a string HTML of nav region. personal_xrd # Called prior to output of personal XRD file. $b is an array: user : the user record array for the person xml : the complete XML string to be output home_content # Called prior to output home page content, shown to unlogged users. $b is the HTML string of section region. contact_edit # Called when editing contact details on an individual from the Contacts page. $b is an array: contact : contact record (array) of target contact output : the (string) generated HTML of the contact edit page contact_edit_post # Called when posting the contact edit page. $b is the $_POST array init_1 # Called just after DB has been opened and before session start. No hook data. page_end # Called after HTML content functions have completed. $b is (string) HTML of content div. footer # Called after HTML content functions have completed. Deferred Javascript files should be registered using this hook. $b is (string) HTML of footer div/element. avatar_lookup # Called when looking up the avatar. $b is an array: size : the size of the avatar that will be looked up email : email to look up the avatar for url : the (string) generated URL of the avatar emailer_send_prepare # Called from Emailer::send() before building the mime message. $b is an array of params to Emailer::send() . fromName : name of the sender fromEmail : email fo the sender replyTo : replyTo address to direct responses toEmail : destination email address messageSubject : subject of the message htmlVersion : html version of the message textVersion : text only version of the message additionalMailHeader : additions to the smtp mail header sent : default false, if set to true in the hook, the default mailer will be skipped. emailer_send # Called before calling PHP's mail() . $b is an array of params to mail() . to subject body headers sent : default false, if set to true in the hook, the default mailer will be skipped. load_config # Called during App initialization to allow addons to load their own configuration file(s) with App::loadConfigFile() . nav_info # Called after the navigational menu is build in include/nav.php . $b is an array containing $nav from include/nav.php . template_vars # Called before vars are passed to the template engine to render the page. The registered function can add,change or remove variables passed to template. $b is an array with: template : filename of template vars : array of vars passed to the template acl_lookup_end # Called after the other queries have passed. The registered function can add, change or remove the acl_lookup() variables. results : array of the acl_lookup() vars prepare_body_init # Called at the start of prepare_body Hook data: item (input/output): item array prepare_body_content_filter # Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should just add the reason to the filter_reasons element of the hook data. Hook data: item : item array (input) filter_reasons (input/output): reasons array prepare_body # Called after the HTML conversion in prepare_body() . Hook data: item (input): item array html (input/output): converted item body is_preview (input): post preview flag filter_reasons (input): reasons array prepare_body_final # Called at the end of prepare_body() . Hook data: item : item array (input) html : converted item body (input/output) put_item_in_cache # Called after prepare_text() in put_item_in_cache() . Hook data: item (input): item array rendered-html (input/output): final item body HTML rendered-hash (input/output): original item body hash magic_auth_success # Called when a magic-auth was successful. Hook data: visitor => array with the contact record of the visitor url => the query string jot_networks # Called when displaying the post permission screen. Hook data is a list of form fields that need to be displayed along the ACL. Form field array structure is: type : checkbox or select . field : Standard field data structure to be used by field_checkbox.tpl and field_select.tpl . For checkbox , field is: - [0] (String): Form field name; Mandatory. - [1]: (String): Form field label; Optional, default is none. - [2]: (Boolean): Whether the checkbox should be checked by default; Optional, default is false. - [3]: (String): Additional help text; Optional, default is none. - [4]: (String): Additional HTML attributes; Optional, default is none. For select , field is: - [0] (String): Form field name; Mandatory. - [1] (String): Form field label; Optional, default is none. - [2] (Boolean): Default value to be selected by default; Optional, default is none. - [3] (String): Additional help text; Optional, default is none. - [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory. route_collection # Called just before dispatching the router. Hook data is a \\FastRoute\\RouterCollector object that should be used to add addon routes pointing to classes. Notice : The class whose name is provided in the route handler must be reachable via autoloader. probe_detect # Called before trying to detect the target network of a URL. If any registered hook function sets the result key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing result. Hook data: uri (input): the profile URI. network (input): the target network (can be empty for auto-detection). uid (input): the user to return the contact data for (can be empty for public contacts). result (output): Leave null if address isn't relevant to the connector, set to contact array if probe is successful, false otherwise. item_by_link # Called when trying to probe an item from a given URI. If any registered hook function sets the item_id key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing item_id . Hook data: - uri (input): the item URI. - uid (input): the user to return the item data for (can be empty for public contacts). - item_id (output): Leave null if URI isn't relevant to the connector, set to created item array if probe is successful, false otherwise. support_follow # Called to assert whether a connector addon provides follow capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow capabilities, left alone otherwise. support_revoke_follow # Called to assert whether a connector addon provides follow revocation capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow revocation capabilities, left alone otherwise. follow # Called before adding a new contact for a user to handle non-native network remote contact (like Twitter). Hook data: url (input): URL of the remote contact. contact (output): should be filled with the contact (with uid = user creating the contact) array if follow was successful. unfollow # Called when unfollowing a remote contact on a non-native network (like Twitter) Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): whether the unfollowing is successful or not. revoke_follow # Called when making a remote contact on a non-native network (like Twitter) unfollow you. Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): a boolean value indicating whether the operation was successful or not. block # Called when blocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to issue the block for. - result (output): a boolean value indicating whether the operation was successful or not. unblock # Called when unblocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to revoke the block for. - result (output): a boolean value indicating whether the operation was successful or not. storage_instance # Called when a custom storage is used (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage'] (output): the storage instance to use ( must implement \\Friendica\\Core\\Storage\\IWritableStorage ) storage_config # Called when the admin of the node wants to configure a custom storage (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage_config'] (output): the storage configuration instance to use ( must implement \\Friendica\\Core\\Storage\\Capability\\IConfigureStorage ) Complete list of hook callbacks # Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above. index.php # Hook::callAll('init_1'); Hook::callAll('app_menu', $arr); Hook::callAll('page_content_top', DI::page()['content']); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_post', $_POST); Hook::callAll($a->module.'_mod_content', $arr); Hook::callAll($a->module.'_mod_aftercontent', $arr); Hook::callAll('page_end', DI::page()['content']); include/api.php # Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); Hook::callAll('logged_in', $a->user); include/enotify.php # Hook::callAll('enotify', $h); Hook::callAll('enotify_store', $datarray); Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data); src/Content/Conversation.php # Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); Hook::callAll('display_item', $arr); Hook::callAll('item_photo_menu', $args); Hook::callAll('jot_tool', $jotplugins); mod/directory.php # Hook::callAll('directory_item', $arr); mod/xrd.php # Hook::callAll('personal_xrd', $arr); mod/parse_url.php # Hook::callAll(\"parse_link\", $arr); src/Module/Delegation.php # Hook::callAll('home_init', $ret); mod/acl.php # Hook::callAll('acl_lookup_end', $results); mod/network.php # Hook::callAll('network_content_init', $arr); Hook::callAll('network_tabs', $arr); mod/friendica.php # Hook::callAll('about_hook', $o); mod/profiles.php # Hook::callAll('profile_post', $_POST); Hook::callAll('profile_edit', $arr); mod/settings.php # Hook::callAll('addon_settings_post', $_POST); Hook::callAll('connector_settings_post', $_POST); Hook::callAll('display_settings_post', $_POST); Hook::callAll('addon_settings', $settings_addons); Hook::callAll('connector_settings', $settings_connectors); Hook::callAll('display_settings', $o); mod/photos.php # Hook::callAll('photo_post_init', $_POST); Hook::callAll('photo_post_file', $ret); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', intval($item_id)); Hook::callAll('photo_upload_form', $ret); mod/profile.php # Hook::callAll('profile_advanced', $o); mod/home.php # Hook::callAll('home_init', $ret); Hook::callAll(\"home_content\", $content); mod/poke.php # Hook::callAll('post_local_end', $arr); mod/contacts.php # Hook::callAll('contact_edit_post', $_POST); Hook::callAll('contact_edit', $arr); mod/tagger.php # Hook::callAll('post_local_end', $arr); mod/uexport.php # Hook::callAll('uexport_options', $options); mod/register.php # Hook::callAll('register_post', $arr); Hook::callAll('register_form', $arr); mod/item.php # Hook::callAll('post_local_start', $_REQUEST); Hook::callAll('post_local', $datarray); Hook::callAll('post_local_end', $datarray); mod/editpost.php # Hook::callAll('jot_tool', $jotplugins); src/Render/FriendicaSmartyEngine.php # Hook::callAll(\"template_vars\", $arr); src/App.php # Hook::callAll('load_config'); Hook::callAll('head'); Hook::callAll('footer'); Hook::callAll('route_collection'); src/Model/Item.php # Hook::callAll('post_local', $item); Hook::callAll('post_remote', $item); Hook::callAll('post_local_end', $posted_item); Hook::callAll('post_remote_end', $posted_item); Hook::callAll('tagged', $arr); Hook::callAll('post_local_end', $new_item); Hook::callAll('put_item_in_cache', $hook_data); Hook::callAll('prepare_body_init', $item); Hook::callAll('prepare_body_content_filter', $hook_data); Hook::callAll('prepare_body', $hook_data); Hook::callAll('prepare_body_final', $hook_data); src/Model/Contact.php # Hook::callAll('contact_photo_menu', $args); Hook::callAll('follow', $arr); src/Model/Profile.php # Hook::callAll('profile_sidebar_enter', $profile); Hook::callAll('profile_sidebar', $arr); Hook::callAll('profile_tabs', $arr); Hook::callAll('zrl_init', $arr); Hook::callAll('magic_auth_success', $arr); src/Model/Event.php # Hook::callAll('event_updated', $event['id']); Hook::callAll(\"event_created\", $event['id']); src/Model/Register.php # Hook::callAll('authenticate', $addon_auth); src/Model/User.php # Hook::callAll('authenticate', $addon_auth); Hook::callAll('register_account', $uid); Hook::callAll('remove_user', $user); src/Module/Notifications/Ping.php # Hook::callAll('network_ping', $arr); src/Module/PermissionTooltip.php # Hook::callAll('lockview_content', $item); src/Module/Settings/Delegation.php # Hook::callAll('authenticate', $addon_auth); src/Module/Settings/TwoFactor/Index.php # Hook::callAll('authenticate', $addon_auth); src/Security/Authenticate.php # Hook::callAll('authenticate', $addon_auth); src/Security/ExAuth.php # Hook::callAll('authenticate', $addon_auth); src/Content/ContactBlock.php # Hook::callAll('contact_block_end', $arr); src/Content/Text/BBCode.php # Hook::callAll('bbcode', $text); Hook::callAll('bb2diaspora', $text); src/Content/Text/HTML.php # Hook::callAll('html2bbcode', $message); src/Content/Smilies.php # Hook::callAll('smilie', $params); src/Content/Feature.php # Hook::callAll('isEnabled', $arr); Hook::callAll('get', $arr); src/Content/ContactSelector.php # Hook::callAll('network_to_name', $nets); src/Content/OEmbed.php # Hook::callAll('oembed_fetch_url', $embedurl, $j); src/Content/Nav.php # Hook::callAll('page_header', DI::page()['nav']); Hook::callAll('nav_info', $nav); src/Core/Authentication.php # Hook::callAll('logged_in', $a->user); src/Core/Protocol.php # Hook::callAll('support_follow', $hook_data); Hook::callAll('support_revoke_follow', $hook_data); Hook::callAll('unfollow', $hook_data); Hook::callAll('revoke_follow', $hook_data); Hook::callAll('block', $hook_data); Hook::callAll('unblock', $hook_data); src/Core/StorageManager # Hook::callAll('storage_instance', $data); Hook::callAll('storage_config', $data); src/Worker/Directory.php # Hook::callAll('globaldir_update', $arr); src/Worker/Notifier.php # Hook::callAll('notifier_end', $target_item); src/Module/Login.php # Hook::callAll('login_hook', $o); src/Module/Logout.php # Hook::callAll(\"logging_out\"); src/Object/Post.php # Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); src/Core/ACL.php # Hook::callAll('contact_select_options', $x); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll('jot_networks', $jotnets); src/Core/Authentication.php # Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); src/Core/Hook.php # self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata); src/Core/L10n/L10n.php # Hook::callAll('poke_verbs', $arr); src/Core/Worker.php # Hook::callAll(\"proc_run\", $arr); src/Util/Emailer.php # Hook::callAll('emailer_send_prepare', $params); Hook::callAll(\"emailer_send\", $hookdata); src/Util/Map.php # Hook::callAll('generate_map', $arr); Hook::callAll('generate_named_map', $arr); Hook::callAll('Map::getCoordinates', $arr); src/Util/Network.php # Hook::callAll('avatar_lookup', $avatar); src/Util/ParseUrl.php # Hook::callAll(\"getsiteinfo\", $siteinfo); src/Protocol/DFRN.php # Hook::callAll('atom_feed_end', $atom); Hook::callAll('atom_feed_end', $atom); src/Protocol/Email.php # Hook::callAll('email_getmessage', $message); Hook::callAll('email_getmessage_end', $ret); view/js/main.js # document.dispatchEvent(new Event('postprocess_liveupdate'));","title":"Addons"},{"location":"en/developer/addons/#friendica-addon-development","text":"Please see the sample addon 'randplace' for a working example of using some of these features. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path).","title":"Friendica Addon development"},{"location":"en/developer/addons/#naming","text":"Addon names are used in file paths and functions names, and as such: - Can't contain spaces or punctuation. - Can't start with a number.","title":"Naming"},{"location":"en/developer/addons/#metadata","text":"You can provide human-readable information about your addon in the first multi-line comment of your addon file. Here's the structure: /** * Name: {Human-readable name} * Description: {Short description} * Version: 1.0 * Author: {Author1 Name} * Author: {Author2 Name} <{Author profile link}> * Maintainer: {Maintainer1 Name} * Maintainer: {Maintainer2 Name} <{Maintainer profile link}> * Status: {Unsupported|Arbitrary status} */ You can also provide a longer documentation in a README or README.md file. The latter will be converted from Markdown to HTML in the addon detail page.","title":"Metadata"},{"location":"en/developer/addons/#installuninstall","text":"If your addon uses hooks, they have to be registered in a <addon>_install() function. This function also allows to perform arbitrary actions your addon needs to function properly. Uninstalling an addon automatically unregisters any hook it registered, but if you need to provide specific uninstallation steps, you can add them in a <addon>_uninstall() function. The installation and uninstallation functions will be called (i.e. re-installed) if the addon changes after installation. Therefore, your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for \"setup\" amd \"remove\".","title":"Install/Uninstall"},{"location":"en/developer/addons/#php-addon-hooks","text":"Register your addon hooks during installation. \\Friendica\\Core\\Hook::register($hookname, $file, $function); $hookname is a string and corresponds to a known Friendica PHP hook. $file is a pathname relative to the top-level Friendica directory. This should be 'addon/ addon_name / addon_name .php' in most cases and can be shortened to __FILE__ . $function is a string and is the name of the function which will be executed when the hook is called.","title":"PHP addon hooks"},{"location":"en/developer/addons/#arguments","text":"Your hook callback functions will be called with at least one and possibly two arguments function <addon>_<hookname>(App $a, &$b) { } If you wish to make changes to the calling data, you must declare them as reference variables (with & ) during function declaration.","title":"Arguments"},{"location":"en/developer/addons/#a","text":"$a is the Friendica App class. It contains a wealth of information about the current state of Friendica: which module has been called, configuration information, the page contents at the point the hook was invoked, profile and user information, etc. It is recommended you call this $a to match its usage elsewhere.","title":"$a"},{"location":"en/developer/addons/#b","text":"$b can be called anything you like. This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter. Remember to declare it with & if you wish to alter it.","title":"$b"},{"location":"en/developer/addons/#admin-settings","text":"Your addon can provide user-specific settings via the addon_settings PHP hook, but it can also provide node-wide settings in the administration page of your addon. Simply declare a <addon>_addon_admin(App $a) function to display the form and a <addon>_addon_admin_post(App $a) function to process the data from the form.","title":"Admin settings"},{"location":"en/developer/addons/#global-stylesheets","text":"If your addon requires adding a stylesheet on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('head', __FILE__, '<addon>_head'); ... } function <addon>_head(App $a) { \\Friendica\\DI::page()->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css'); } __DIR__ is the folder path of your addon.","title":"Global stylesheets"},{"location":"en/developer/addons/#javascript","text":"","title":"JavaScript"},{"location":"en/developer/addons/#global-scripts","text":"If your addon requires adding a script on all pages of Friendica, add the following hook: function <addon>_install() { \\Friendica\\Core\\Hook::register('footer', __FILE__, '<addon>_footer'); ... } function <addon>_footer(App $a) { \\Friendica\\DI::page()->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js'); } __DIR__ is the folder path of your addon.","title":"Global scripts"},{"location":"en/developer/addons/#javascript-hooks","text":"The main Friendica script provides hooks via events dispatched on the document property. In your Javascript file included as described above, add your event listener like this: document . addEventListener ( name , callback ); name is the name of the hook and corresponds to a known Friendica JavaScript hook. callback is a JavaScript anonymous function to execute. More info about Javascript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener","title":"JavaScript hooks"},{"location":"en/developer/addons/#current-javascript-hooks","text":"","title":"Current JavaScript hooks"},{"location":"en/developer/addons/#postprocess_liveupdate","text":"Called at the end of the live update process (XmlHttpRequest) and on a post preview. No additional data is provided.","title":"postprocess_liveupdate"},{"location":"en/developer/addons/#modules","text":"Addons may also act as \"modules\" and intercept all page requests for a given URL path. In order for an addon to act as a module it needs to declare an empty function <addon>_module() . If this function exists, you will now receive all page requests for https://my.web.site/<addon> - with any number of URL components as additional arguments. These are parsed into the App\\Arguments object. So https://my.web.site/addon/arg1/arg2 would give this: DI::args()->getArgc(); // = 3 DI::args()->get(0); // = 'addon' DI::args()->get(1); // = 'arg1' DI::args()->get(2); // = 'arg2' To display a module page, you need to declare the function <addon>_content(App $a) , which defines and returns the page body content. They may also contain <addon>_post(App $a) which is called before the <addon>_content function and typically handles the results of POST forms. You may also have <addon>_init(App $a) which is called before <addon>_content and should include common logic to your module.","title":"Modules"},{"location":"en/developer/addons/#templates","text":"If your addon needs some template, you can use the Friendica template system. Friendica uses smarty3 as a template engine. Put your tpl files in the templates/ sub-folder of your addon. In your code, like in the function addon_name_content(), load the template file and execute it passing needed values: use Friendica\\Core\\Renderer; # load template file. first argument is the template name, # second is the addon path relative to friendica top folder $tpl = Renderer::getMarkupTemplate('mytemplate.tpl', __DIR__); # apply template. first argument is the loaded template, # second an array of 'name' => 'values' to pass to template $output = Renderer::replaceMacros($tpl, array( 'title' => 'My beautiful addon', )); See also the wiki page Quick Template Guide .","title":"Templates"},{"location":"en/developer/addons/#current-php-hooks","text":"","title":"Current PHP hooks"},{"location":"en/developer/addons/#authenticate","text":"Called when a user attempts to login. $b is an array containing: username : the supplied username password : the supplied password authenticated : set this to non-zero to authenticate the user. user_record : successful authentication must also return a valid user record from the database","title":"authenticate"},{"location":"en/developer/addons/#logged_in","text":"Called after a user has successfully logged in. $b contains the $a->user array.","title":"logged_in"},{"location":"en/developer/addons/#display_item","text":"Called when formatting a post for display. $b is an array: item : The item (array) details pulled from the database output : the (string) HTML representation of this item prior to adding it to the page","title":"display_item"},{"location":"en/developer/addons/#post_local","text":"Called when a status post or comment is entered on the local system. $b is the item array of the information to be stored in the database. Please note: body contents are bbcode - not HTML.","title":"post_local"},{"location":"en/developer/addons/#post_local_end","text":"Called when a local status post or comment has been stored on the local system. $b is the item array of the information which has just been stored in the database. Please note: body contents are bbcode - not HTML","title":"post_local_end"},{"location":"en/developer/addons/#post_remote","text":"Called when receiving a post from another source. This may also be used to post local activity or system generated messages. $b is the item array of information to be stored in the database and the item body is bbcode.","title":"post_remote"},{"location":"en/developer/addons/#addon_settings","text":"Called when generating the HTML for the addon settings page. $data is an array containing: addon (output): Required. The addon folder name. title (output): Required. The addon settings panel title. href (output): Optional. If set, will reduce the panel to a link pointing to this URL, can be relative. Incompatible with the following keys. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display.","title":"addon_settings"},{"location":"en/developer/addons/#examples","text":"","title":"Examples"},{"location":"en/developer/addons/#with-link","text":"$data = [ 'addon' => 'advancedcontentfilter', 'title' => DI::l10n()->t('Advanced Content Filter'), 'href' => 'advancedcontentfilter', ];","title":"With link"},{"location":"en/developer/addons/#with-default-submit-button","text":"$data = [ 'addon' => 'fromapp', 'title' => DI::l10n()->t('FromApp Settings'), 'html' => $html, ];","title":"With default submit button"},{"location":"en/developer/addons/#with-no-html-just-a-submit-button","text":"$data = [ 'addon' => 'opmlexport', 'title' => DI::l10n()->t('OPML Export'), 'submit' => DI::l10n()->t('Export RSS/Atom contacts'), ];","title":"With no HTML, just a submit button"},{"location":"en/developer/addons/#with-multiple-submit-buttons","text":"$data = [ 'addon' => 'catavar', 'title' => DI::l10n()->t('Cat Avatar Settings'), 'html' => $html, 'submit' => [ 'catavatar-usecat' => DI::l10n()->t('Use Cat as Avatar'), 'catavatar-morecat' => DI::l10n()->t('Another random Cat!'), 'catavatar-emailcat' => DI::pConfig()->get(local_user(), 'catavatar', 'seed', false) ? DI::l10n()->t('Reset to email Cat') : null, ], ];","title":"With multiple submit buttons"},{"location":"en/developer/addons/#addon_settings_post","text":"Called when the Addon Settings pages are submitted. $b is the $_POST array.","title":"addon_settings_post"},{"location":"en/developer/addons/#connector_settings","text":"Called when generating the HTML for a connector addon settings page. $data is an array containing: connector (output): Required. The addon folder name. title (output): Required. The addon settings panel title. image (output): Required. The relative path of the logo image of the platform/protocol this addon is connecting to, max size 48x48px. enabled (output): Optional. If set to a falsy value, the connector image will be dimmed. html (output): Optional. Raw HTML of the addon form elements. Both the <form> tags and the submit buttons are taken care of elsewhere. submit (output): Optional. If unset, a default submit button with name=\"<addon name>-submit\" will be generated. Can take different value types: string : The label to replace the default one. associative array : A list of submit button, the key is the value of the name attribute, the value is the displayed label. The first submit button in this list is considered the main one and themes might emphasize its display.","title":"connector_settings"},{"location":"en/developer/addons/#examples_1","text":"","title":"Examples"},{"location":"en/developer/addons/#with-default-submit-button_1","text":"$data = [ 'connector' => 'diaspora', 'title' => DI::l10n()->t('Diaspora Export'), 'image' => 'images/diaspora-logo.png', 'enabled' => $enabled, 'html' => $html, ];","title":"With default submit button"},{"location":"en/developer/addons/#with-custom-submit-button-label-and-no-logo-dim","text":"$data = [ 'connector' => 'ifttt', 'title' => DI::l10n()->t('IFTTT Mirror'), 'image' => 'addon/ifttt/ifttt.png', 'html' => $html, 'submit' => DI::l10n()->t('Generate new key'), ];","title":"With custom submit button label and no logo dim"},{"location":"en/developer/addons/#with-conditional-submit-buttons","text":"$submit = ['pumpio-submit' => DI::l10n()->t('Save Settings')]; if ($oauth_token && $oauth_token_secret) { $submit['pumpio-delete'] = DI::l10n()->t('Delete this preset'); } $data = [ 'connector' => 'pumpio', 'title' => DI::l10n()->t('Pump.io Import/Export/Mirror'), 'image' => 'images/pumpio.png', 'enabled' => $enabled, 'html' => $html, 'submit' => $submit, ];","title":"With conditional submit buttons"},{"location":"en/developer/addons/#profile_post","text":"Called when posting a profile page. $b is the $_POST array.","title":"profile_post"},{"location":"en/developer/addons/#profile_edit","text":"Called prior to output of profile edit page. $b is an array containing: profile : profile (array) record from the database entry : the (string) HTML of the generated entry","title":"profile_edit"},{"location":"en/developer/addons/#profile_advanced","text":"Called when the HTML is generated for the Advanced profile, corresponding to the Profile tab within a person's profile page. $b is the HTML string representation of the generated profile. The profile array details are in $a->profile .","title":"profile_advanced"},{"location":"en/developer/addons/#directory_item","text":"Called from the Directory page when formatting an item for display. $b is an array: contact : contact record array for the person from the database entry : the HTML string of the generated entry","title":"directory_item"},{"location":"en/developer/addons/#profile_sidebar_enter","text":"Called prior to generating the sidebar \"short\" profile for a page. $b is the person's profile array","title":"profile_sidebar_enter"},{"location":"en/developer/addons/#profile_sidebar","text":"Called when generating the sidebar \"short\" profile for a page. $b is an array: profile : profile record array for the person from the database entry : the HTML string of the generated entry","title":"profile_sidebar"},{"location":"en/developer/addons/#contact_block_end","text":"Called when formatting the block of contacts/friends on a profile sidebar has completed. $b is an array: contacts : array of contacts output : the generated HTML string of the contact block","title":"contact_block_end"},{"location":"en/developer/addons/#bbcode","text":"Called after conversion of bbcode to HTML. $b is an HTML string converted text.","title":"bbcode"},{"location":"en/developer/addons/#html2bbcode","text":"Called after tag conversion of HTML to bbcode (e.g. remote message posting) $b is a string converted text","title":"html2bbcode"},{"location":"en/developer/addons/#head","text":"Called when building the <head> sections. Stylesheets should be registered using this hook. $b is an HTML string of the <head> tag.","title":"head"},{"location":"en/developer/addons/#page_header","text":"Called after building the page navigation section. $b is a string HTML of nav region.","title":"page_header"},{"location":"en/developer/addons/#personal_xrd","text":"Called prior to output of personal XRD file. $b is an array: user : the user record array for the person xml : the complete XML string to be output","title":"personal_xrd"},{"location":"en/developer/addons/#home_content","text":"Called prior to output home page content, shown to unlogged users. $b is the HTML string of section region.","title":"home_content"},{"location":"en/developer/addons/#contact_edit","text":"Called when editing contact details on an individual from the Contacts page. $b is an array: contact : contact record (array) of target contact output : the (string) generated HTML of the contact edit page","title":"contact_edit"},{"location":"en/developer/addons/#contact_edit_post","text":"Called when posting the contact edit page. $b is the $_POST array","title":"contact_edit_post"},{"location":"en/developer/addons/#init_1","text":"Called just after DB has been opened and before session start. No hook data.","title":"init_1"},{"location":"en/developer/addons/#page_end","text":"Called after HTML content functions have completed. $b is (string) HTML of content div.","title":"page_end"},{"location":"en/developer/addons/#footer","text":"Called after HTML content functions have completed. Deferred Javascript files should be registered using this hook. $b is (string) HTML of footer div/element.","title":"footer"},{"location":"en/developer/addons/#avatar_lookup","text":"Called when looking up the avatar. $b is an array: size : the size of the avatar that will be looked up email : email to look up the avatar for url : the (string) generated URL of the avatar","title":"avatar_lookup"},{"location":"en/developer/addons/#emailer_send_prepare","text":"Called from Emailer::send() before building the mime message. $b is an array of params to Emailer::send() . fromName : name of the sender fromEmail : email fo the sender replyTo : replyTo address to direct responses toEmail : destination email address messageSubject : subject of the message htmlVersion : html version of the message textVersion : text only version of the message additionalMailHeader : additions to the smtp mail header sent : default false, if set to true in the hook, the default mailer will be skipped.","title":"emailer_send_prepare"},{"location":"en/developer/addons/#emailer_send","text":"Called before calling PHP's mail() . $b is an array of params to mail() . to subject body headers sent : default false, if set to true in the hook, the default mailer will be skipped.","title":"emailer_send"},{"location":"en/developer/addons/#load_config","text":"Called during App initialization to allow addons to load their own configuration file(s) with App::loadConfigFile() .","title":"load_config"},{"location":"en/developer/addons/#nav_info","text":"Called after the navigational menu is build in include/nav.php . $b is an array containing $nav from include/nav.php .","title":"nav_info"},{"location":"en/developer/addons/#template_vars","text":"Called before vars are passed to the template engine to render the page. The registered function can add,change or remove variables passed to template. $b is an array with: template : filename of template vars : array of vars passed to the template","title":"template_vars"},{"location":"en/developer/addons/#acl_lookup_end","text":"Called after the other queries have passed. The registered function can add, change or remove the acl_lookup() variables. results : array of the acl_lookup() vars","title":"acl_lookup_end"},{"location":"en/developer/addons/#prepare_body_init","text":"Called at the start of prepare_body Hook data: item (input/output): item array","title":"prepare_body_init"},{"location":"en/developer/addons/#prepare_body_content_filter","text":"Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should just add the reason to the filter_reasons element of the hook data. Hook data: item : item array (input) filter_reasons (input/output): reasons array","title":"prepare_body_content_filter"},{"location":"en/developer/addons/#prepare_body","text":"Called after the HTML conversion in prepare_body() . Hook data: item (input): item array html (input/output): converted item body is_preview (input): post preview flag filter_reasons (input): reasons array","title":"prepare_body"},{"location":"en/developer/addons/#prepare_body_final","text":"Called at the end of prepare_body() . Hook data: item : item array (input) html : converted item body (input/output)","title":"prepare_body_final"},{"location":"en/developer/addons/#put_item_in_cache","text":"Called after prepare_text() in put_item_in_cache() . Hook data: item (input): item array rendered-html (input/output): final item body HTML rendered-hash (input/output): original item body hash","title":"put_item_in_cache"},{"location":"en/developer/addons/#magic_auth_success","text":"Called when a magic-auth was successful. Hook data: visitor => array with the contact record of the visitor url => the query string","title":"magic_auth_success"},{"location":"en/developer/addons/#jot_networks","text":"Called when displaying the post permission screen. Hook data is a list of form fields that need to be displayed along the ACL. Form field array structure is: type : checkbox or select . field : Standard field data structure to be used by field_checkbox.tpl and field_select.tpl . For checkbox , field is: - [0] (String): Form field name; Mandatory. - [1]: (String): Form field label; Optional, default is none. - [2]: (Boolean): Whether the checkbox should be checked by default; Optional, default is false. - [3]: (String): Additional help text; Optional, default is none. - [4]: (String): Additional HTML attributes; Optional, default is none. For select , field is: - [0] (String): Form field name; Mandatory. - [1] (String): Form field label; Optional, default is none. - [2] (Boolean): Default value to be selected by default; Optional, default is none. - [3] (String): Additional help text; Optional, default is none. - [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory.","title":"jot_networks"},{"location":"en/developer/addons/#route_collection","text":"Called just before dispatching the router. Hook data is a \\FastRoute\\RouterCollector object that should be used to add addon routes pointing to classes. Notice : The class whose name is provided in the route handler must be reachable via autoloader.","title":"route_collection"},{"location":"en/developer/addons/#probe_detect","text":"Called before trying to detect the target network of a URL. If any registered hook function sets the result key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing result. Hook data: uri (input): the profile URI. network (input): the target network (can be empty for auto-detection). uid (input): the user to return the contact data for (can be empty for public contacts). result (output): Leave null if address isn't relevant to the connector, set to contact array if probe is successful, false otherwise.","title":"probe_detect"},{"location":"en/developer/addons/#item_by_link","text":"Called when trying to probe an item from a given URI. If any registered hook function sets the item_id key of the hook data array, it will be returned immediately. Hook functions should also return immediately if the hook data contains an existing item_id . Hook data: - uri (input): the item URI. - uid (input): the user to return the item data for (can be empty for public contacts). - item_id (output): Leave null if URI isn't relevant to the connector, set to created item array if probe is successful, false otherwise.","title":"item_by_link"},{"location":"en/developer/addons/#support_follow","text":"Called to assert whether a connector addon provides follow capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow capabilities, left alone otherwise.","title":"support_follow"},{"location":"en/developer/addons/#support_revoke_follow","text":"Called to assert whether a connector addon provides follow revocation capabilities. Hook data: - protocol (input): shorthand for the protocol. List of values is available in src/Core/Protocol.php . - result (output): should be true if the connector provides follow revocation capabilities, left alone otherwise.","title":"support_revoke_follow"},{"location":"en/developer/addons/#follow","text":"Called before adding a new contact for a user to handle non-native network remote contact (like Twitter). Hook data: url (input): URL of the remote contact. contact (output): should be filled with the contact (with uid = user creating the contact) array if follow was successful.","title":"follow"},{"location":"en/developer/addons/#unfollow","text":"Called when unfollowing a remote contact on a non-native network (like Twitter) Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): whether the unfollowing is successful or not.","title":"unfollow"},{"location":"en/developer/addons/#revoke_follow","text":"Called when making a remote contact on a non-native network (like Twitter) unfollow you. Hook data: - contact (input): the target public contact (uid = 0) array. - uid (input): the id of the source local user. - result (output): a boolean value indicating whether the operation was successful or not.","title":"revoke_follow"},{"location":"en/developer/addons/#block","text":"Called when blocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to issue the block for. - result (output): a boolean value indicating whether the operation was successful or not.","title":"block"},{"location":"en/developer/addons/#unblock","text":"Called when unblocking a remote contact on a non-native network (like Twitter). Hook data: - contact (input): the remote contact (uid = 0) array. - uid (input): the user id to revoke the block for. - result (output): a boolean value indicating whether the operation was successful or not.","title":"unblock"},{"location":"en/developer/addons/#storage_instance","text":"Called when a custom storage is used (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage'] (output): the storage instance to use ( must implement \\Friendica\\Core\\Storage\\IWritableStorage )","title":"storage_instance"},{"location":"en/developer/addons/#storage_config","text":"Called when the admin of the node wants to configure a custom storage (e.g. webdav_storage) Hook data: - name (input): the name of the used storage backend - data['storage_config'] (output): the storage configuration instance to use ( must implement \\Friendica\\Core\\Storage\\Capability\\IConfigureStorage )","title":"storage_config"},{"location":"en/developer/addons/#complete-list-of-hook-callbacks","text":"Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above.","title":"Complete list of hook callbacks"},{"location":"en/developer/addons/#indexphp","text":"Hook::callAll('init_1'); Hook::callAll('app_menu', $arr); Hook::callAll('page_content_top', DI::page()['content']); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_post', $_POST); Hook::callAll($a->module.'_mod_content', $arr); Hook::callAll($a->module.'_mod_aftercontent', $arr); Hook::callAll('page_end', DI::page()['content']);","title":"index.php"},{"location":"en/developer/addons/#includeapiphp","text":"Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); Hook::callAll('logged_in', $a->user);","title":"include/api.php"},{"location":"en/developer/addons/#includeenotifyphp","text":"Hook::callAll('enotify', $h); Hook::callAll('enotify_store', $datarray); Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data);","title":"include/enotify.php"},{"location":"en/developer/addons/#srccontentconversationphp","text":"Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); Hook::callAll('display_item', $arr); Hook::callAll('item_photo_menu', $args); Hook::callAll('jot_tool', $jotplugins);","title":"src/Content/Conversation.php"},{"location":"en/developer/addons/#moddirectoryphp","text":"Hook::callAll('directory_item', $arr);","title":"mod/directory.php"},{"location":"en/developer/addons/#modxrdphp","text":"Hook::callAll('personal_xrd', $arr);","title":"mod/xrd.php"},{"location":"en/developer/addons/#modparse_urlphp","text":"Hook::callAll(\"parse_link\", $arr);","title":"mod/parse_url.php"},{"location":"en/developer/addons/#srcmoduledelegationphp","text":"Hook::callAll('home_init', $ret);","title":"src/Module/Delegation.php"},{"location":"en/developer/addons/#modaclphp","text":"Hook::callAll('acl_lookup_end', $results);","title":"mod/acl.php"},{"location":"en/developer/addons/#modnetworkphp","text":"Hook::callAll('network_content_init', $arr); Hook::callAll('network_tabs', $arr);","title":"mod/network.php"},{"location":"en/developer/addons/#modfriendicaphp","text":"Hook::callAll('about_hook', $o);","title":"mod/friendica.php"},{"location":"en/developer/addons/#modprofilesphp","text":"Hook::callAll('profile_post', $_POST); Hook::callAll('profile_edit', $arr);","title":"mod/profiles.php"},{"location":"en/developer/addons/#modsettingsphp","text":"Hook::callAll('addon_settings_post', $_POST); Hook::callAll('connector_settings_post', $_POST); Hook::callAll('display_settings_post', $_POST); Hook::callAll('addon_settings', $settings_addons); Hook::callAll('connector_settings', $settings_connectors); Hook::callAll('display_settings', $o);","title":"mod/settings.php"},{"location":"en/developer/addons/#modphotosphp","text":"Hook::callAll('photo_post_init', $_POST); Hook::callAll('photo_post_file', $ret); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', intval($item_id)); Hook::callAll('photo_upload_form', $ret);","title":"mod/photos.php"},{"location":"en/developer/addons/#modprofilephp","text":"Hook::callAll('profile_advanced', $o);","title":"mod/profile.php"},{"location":"en/developer/addons/#modhomephp","text":"Hook::callAll('home_init', $ret); Hook::callAll(\"home_content\", $content);","title":"mod/home.php"},{"location":"en/developer/addons/#modpokephp","text":"Hook::callAll('post_local_end', $arr);","title":"mod/poke.php"},{"location":"en/developer/addons/#modcontactsphp","text":"Hook::callAll('contact_edit_post', $_POST); Hook::callAll('contact_edit', $arr);","title":"mod/contacts.php"},{"location":"en/developer/addons/#modtaggerphp","text":"Hook::callAll('post_local_end', $arr);","title":"mod/tagger.php"},{"location":"en/developer/addons/#moduexportphp","text":"Hook::callAll('uexport_options', $options);","title":"mod/uexport.php"},{"location":"en/developer/addons/#modregisterphp","text":"Hook::callAll('register_post', $arr); Hook::callAll('register_form', $arr);","title":"mod/register.php"},{"location":"en/developer/addons/#moditemphp","text":"Hook::callAll('post_local_start', $_REQUEST); Hook::callAll('post_local', $datarray); Hook::callAll('post_local_end', $datarray);","title":"mod/item.php"},{"location":"en/developer/addons/#modeditpostphp","text":"Hook::callAll('jot_tool', $jotplugins);","title":"mod/editpost.php"},{"location":"en/developer/addons/#srcrenderfriendicasmartyenginephp","text":"Hook::callAll(\"template_vars\", $arr);","title":"src/Render/FriendicaSmartyEngine.php"},{"location":"en/developer/addons/#srcappphp","text":"Hook::callAll('load_config'); Hook::callAll('head'); Hook::callAll('footer'); Hook::callAll('route_collection');","title":"src/App.php"},{"location":"en/developer/addons/#srcmodelitemphp","text":"Hook::callAll('post_local', $item); Hook::callAll('post_remote', $item); Hook::callAll('post_local_end', $posted_item); Hook::callAll('post_remote_end', $posted_item); Hook::callAll('tagged', $arr); Hook::callAll('post_local_end', $new_item); Hook::callAll('put_item_in_cache', $hook_data); Hook::callAll('prepare_body_init', $item); Hook::callAll('prepare_body_content_filter', $hook_data); Hook::callAll('prepare_body', $hook_data); Hook::callAll('prepare_body_final', $hook_data);","title":"src/Model/Item.php"},{"location":"en/developer/addons/#srcmodelcontactphp","text":"Hook::callAll('contact_photo_menu', $args); Hook::callAll('follow', $arr);","title":"src/Model/Contact.php"},{"location":"en/developer/addons/#srcmodelprofilephp","text":"Hook::callAll('profile_sidebar_enter', $profile); Hook::callAll('profile_sidebar', $arr); Hook::callAll('profile_tabs', $arr); Hook::callAll('zrl_init', $arr); Hook::callAll('magic_auth_success', $arr);","title":"src/Model/Profile.php"},{"location":"en/developer/addons/#srcmodeleventphp","text":"Hook::callAll('event_updated', $event['id']); Hook::callAll(\"event_created\", $event['id']);","title":"src/Model/Event.php"},{"location":"en/developer/addons/#srcmodelregisterphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Model/Register.php"},{"location":"en/developer/addons/#srcmodeluserphp","text":"Hook::callAll('authenticate', $addon_auth); Hook::callAll('register_account', $uid); Hook::callAll('remove_user', $user);","title":"src/Model/User.php"},{"location":"en/developer/addons/#srcmodulenotificationspingphp","text":"Hook::callAll('network_ping', $arr);","title":"src/Module/Notifications/Ping.php"},{"location":"en/developer/addons/#srcmodulepermissiontooltipphp","text":"Hook::callAll('lockview_content', $item);","title":"src/Module/PermissionTooltip.php"},{"location":"en/developer/addons/#srcmodulesettingsdelegationphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Module/Settings/Delegation.php"},{"location":"en/developer/addons/#srcmodulesettingstwofactorindexphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Module/Settings/TwoFactor/Index.php"},{"location":"en/developer/addons/#srcsecurityauthenticatephp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Security/Authenticate.php"},{"location":"en/developer/addons/#srcsecurityexauthphp","text":"Hook::callAll('authenticate', $addon_auth);","title":"src/Security/ExAuth.php"},{"location":"en/developer/addons/#srccontentcontactblockphp","text":"Hook::callAll('contact_block_end', $arr);","title":"src/Content/ContactBlock.php"},{"location":"en/developer/addons/#srccontenttextbbcodephp","text":"Hook::callAll('bbcode', $text); Hook::callAll('bb2diaspora', $text);","title":"src/Content/Text/BBCode.php"},{"location":"en/developer/addons/#srccontenttexthtmlphp","text":"Hook::callAll('html2bbcode', $message);","title":"src/Content/Text/HTML.php"},{"location":"en/developer/addons/#srccontentsmiliesphp","text":"Hook::callAll('smilie', $params);","title":"src/Content/Smilies.php"},{"location":"en/developer/addons/#srccontentfeaturephp","text":"Hook::callAll('isEnabled', $arr); Hook::callAll('get', $arr);","title":"src/Content/Feature.php"},{"location":"en/developer/addons/#srccontentcontactselectorphp","text":"Hook::callAll('network_to_name', $nets);","title":"src/Content/ContactSelector.php"},{"location":"en/developer/addons/#srccontentoembedphp","text":"Hook::callAll('oembed_fetch_url', $embedurl, $j);","title":"src/Content/OEmbed.php"},{"location":"en/developer/addons/#srccontentnavphp","text":"Hook::callAll('page_header', DI::page()['nav']); Hook::callAll('nav_info', $nav);","title":"src/Content/Nav.php"},{"location":"en/developer/addons/#srccoreauthenticationphp","text":"Hook::callAll('logged_in', $a->user);","title":"src/Core/Authentication.php"},{"location":"en/developer/addons/#srccoreprotocolphp","text":"Hook::callAll('support_follow', $hook_data); Hook::callAll('support_revoke_follow', $hook_data); Hook::callAll('unfollow', $hook_data); Hook::callAll('revoke_follow', $hook_data); Hook::callAll('block', $hook_data); Hook::callAll('unblock', $hook_data);","title":"src/Core/Protocol.php"},{"location":"en/developer/addons/#srccorestoragemanager","text":"Hook::callAll('storage_instance', $data); Hook::callAll('storage_config', $data);","title":"src/Core/StorageManager"},{"location":"en/developer/addons/#srcworkerdirectoryphp","text":"Hook::callAll('globaldir_update', $arr);","title":"src/Worker/Directory.php"},{"location":"en/developer/addons/#srcworkernotifierphp","text":"Hook::callAll('notifier_end', $target_item);","title":"src/Worker/Notifier.php"},{"location":"en/developer/addons/#srcmoduleloginphp","text":"Hook::callAll('login_hook', $o);","title":"src/Module/Login.php"},{"location":"en/developer/addons/#srcmodulelogoutphp","text":"Hook::callAll(\"logging_out\");","title":"src/Module/Logout.php"},{"location":"en/developer/addons/#srcobjectpostphp","text":"Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr);","title":"src/Object/Post.php"},{"location":"en/developer/addons/#srccoreaclphp","text":"Hook::callAll('contact_select_options', $x); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll('jot_networks', $jotnets);","title":"src/Core/ACL.php"},{"location":"en/developer/addons/#srccoreauthenticationphp_1","text":"Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth);","title":"src/Core/Authentication.php"},{"location":"en/developer/addons/#srccorehookphp","text":"self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata);","title":"src/Core/Hook.php"},{"location":"en/developer/addons/#srccorel10nl10nphp","text":"Hook::callAll('poke_verbs', $arr);","title":"src/Core/L10n/L10n.php"},{"location":"en/developer/addons/#srccoreworkerphp","text":"Hook::callAll(\"proc_run\", $arr);","title":"src/Core/Worker.php"},{"location":"en/developer/addons/#srcutilemailerphp","text":"Hook::callAll('emailer_send_prepare', $params); Hook::callAll(\"emailer_send\", $hookdata);","title":"src/Util/Emailer.php"},{"location":"en/developer/addons/#srcutilmapphp","text":"Hook::callAll('generate_map', $arr); Hook::callAll('generate_named_map', $arr); Hook::callAll('Map::getCoordinates', $arr);","title":"src/Util/Map.php"},{"location":"en/developer/addons/#srcutilnetworkphp","text":"Hook::callAll('avatar_lookup', $avatar);","title":"src/Util/Network.php"},{"location":"en/developer/addons/#srcutilparseurlphp","text":"Hook::callAll(\"getsiteinfo\", $siteinfo);","title":"src/Util/ParseUrl.php"},{"location":"en/developer/addons/#srcprotocoldfrnphp","text":"Hook::callAll('atom_feed_end', $atom); Hook::callAll('atom_feed_end', $atom);","title":"src/Protocol/DFRN.php"},{"location":"en/developer/addons/#srcprotocolemailphp","text":"Hook::callAll('email_getmessage', $message); Hook::callAll('email_getmessage_end', $ret);","title":"src/Protocol/Email.php"},{"location":"en/developer/addons/#viewjsmainjs","text":"document.dispatchEvent(new Event('postprocess_liveupdate'));","title":"view/js/main.js"},{"location":"de/admin/config/","tags":["admin","configuration"],"text":"Config values that can only be set in config/local.config.php # Friendica's configuration is done in two places: in PHP array configuration files and in the config database table. Database config values overwrite the same file config values. File configuration # The configuration format for file configuration is an array returned from a PHP file. This prevents your webserver from displaying your private configuration. It interprets the configuration files and displays nothing. A typical configuration file looks like this: <?php /* * Comment block */ return [ 'section1' => [ // Comment line 'key' => 'value' , ], 'section2' => [ 'array' => [ 'value0' , 'value1' , 'value2' ], ], ]; Configuration location # The config directory holds key configuration files and can have different config files. All of them have to end with .config.php and must not include -sample in their name. Some examples of common known configuration files: - local.config.php holds the current node custom configuration. - addon.config.php is optional and holds the custom configuration for specific addons. Addons can define their own default configuration values in addon/[addon]/config/[addon].config.php which is loaded when the addon is activated. If needed, an alternative config path can be used by using the FRIENDICA_CONFIG_DIR environment variable (full path required!). This is useful in case of hardening the system by separating configuration from program binaries. Static Configuration location # The static directory holds the codebase default configurations files. They must not be changed by users, because they can get changed from release to release. Currently, the following configurations are included: - defaults.config.php holds the default values for all the configuration keys that can only be set in local.config.php . - settings.config.php holds the default values for some configuration keys that are set through the admin settings page. Migrating from .htconfig.php to config/local.config.php # The legacy .htconfig.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your .htconfig.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your .htconfig.php to check your node is working as expected before deleting it. table.config { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.config > tr > th, table.config > tr > td, table.config > * > tr > th, table.config > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.config > tr > th, table.config > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } .htconfig.php config/local.config.php $db_host = 'localhost'; $db_user = 'mysqlusername'; $db_pass = 'mysqlpassword'; $db_data = 'mysqldatabasename'; $a->config[\"system\"][\"db_charset\"] = 'utf8mb4'; 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], $a->config[\"section\"][\"key\"] = \"value\"; 'section' => [ 'key' => 'value', ], $a->config[\"section\"][\"key\"] = array( \"value1\", \"value2\", \"value3\" ); 'section' => [ 'key' => ['value1', 'value2', 'value3'], ], $a->config[\"key\"] = \"value\"; 'config' => [ 'key' => 'value', ], $a->config['register_policy'] = REGISTER_CLOSED; 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], $a->path = \"value\"; 'system' => [ 'urlpath' => 'value', ], $default_timezone = \"value\"; 'system' => [ 'default_timezone' => 'value', ], $pidfile = \"value\"; 'system' => [ 'pidfile' => 'value', ], $lang = \"value\"; 'system' => [ 'language' => 'value', ], Migrating from config/local.ini.php to config/local.config.php # The legacy config/local.ini.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your config/addon.ini.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your config/local.ini.php file to check your node is working as expected before deleting it. config/local.ini.php config/local.config.php [database] hostname = localhost username = mysqlusername password = mysqlpassword database = mysqldatabasename charset = utf8mb4 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], [section] key = value 'section' => [ 'key' => 'value', ], [config] register_policty = REGISTER_CLOSED 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], [section] key[] = value1 key[] = value2 key[] = value3 'section' => [ 'key' => ['value1', 'value2', 'value3'], ], Database Settings # The configuration variables database.hostname , database.username , database.password , database.database and database.charset are holding your credentials for the database connection. If you need to specify a port to access the database, you can do so by appending :portnumber to the database.hostname variable. 'database' => [ 'hostname' => 'your.mysqlhost.com:123456', ] If all the following environment variables are set, Friendica will use them instead of the previously configured variables for the db: MYSQL_HOST MYSQL_PORT MYSQL_USERNAME MYSQL_PASSWORD MYSQL_DATABASE Config values that can only be set in config/local.config.php # There are some config values that haven't found their way into the administration page. This has several reasons. Maybe they are part of a current development that isn't considered stable and will be added later in the administration page when it is considered safe. Or it triggers something that isn't expected to be of public interest. Or it is for testing purposes only. Attention: Please be warned that you shouldn't use one of these values without the knowledge what it could trigger. Especially don't do that with undocumented values. These configurations keys and their default value are listed in static/defaults.config.php and should be overwritten in config/local.config.php . Administrator Options # Enabling the admin panel for an account, and thus making the account holder admin of the node, is done by setting the variable 'config' => [ 'admin_email' => 'someone@example.com', ] Where you have to match the email address used for the account with the one you enter to the config/local.config.php file. If more than one account should be able to access the admin panel, separate the email addresses with a comma. 'config' => [ 'admin_email' => 'someone@example.com,someoneelse@example.com', ] If you want to have a more personalized closing line for the notification emails you can set a variable for the admin_name . 'config' => [ 'admin_name' => 'Marvin', ]","title":"Config Values"},{"location":"de/admin/config/#config-values-that-can-only-be-set-in-configlocalconfigphp","text":"Friendica's configuration is done in two places: in PHP array configuration files and in the config database table. Database config values overwrite the same file config values.","title":"Config values that can only be set in config/local.config.php"},{"location":"de/admin/config/#file-configuration","text":"The configuration format for file configuration is an array returned from a PHP file. This prevents your webserver from displaying your private configuration. It interprets the configuration files and displays nothing. A typical configuration file looks like this: <?php /* * Comment block */ return [ 'section1' => [ // Comment line 'key' => 'value' , ], 'section2' => [ 'array' => [ 'value0' , 'value1' , 'value2' ], ], ];","title":"File configuration"},{"location":"de/admin/config/#configuration-location","text":"The config directory holds key configuration files and can have different config files. All of them have to end with .config.php and must not include -sample in their name. Some examples of common known configuration files: - local.config.php holds the current node custom configuration. - addon.config.php is optional and holds the custom configuration for specific addons. Addons can define their own default configuration values in addon/[addon]/config/[addon].config.php which is loaded when the addon is activated. If needed, an alternative config path can be used by using the FRIENDICA_CONFIG_DIR environment variable (full path required!). This is useful in case of hardening the system by separating configuration from program binaries.","title":"Configuration location"},{"location":"de/admin/config/#static-configuration-location","text":"The static directory holds the codebase default configurations files. They must not be changed by users, because they can get changed from release to release. Currently, the following configurations are included: - defaults.config.php holds the default values for all the configuration keys that can only be set in local.config.php . - settings.config.php holds the default values for some configuration keys that are set through the admin settings page.","title":"Static Configuration location"},{"location":"de/admin/config/#migrating-from-htconfigphp-to-configlocalconfigphp","text":"The legacy .htconfig.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your .htconfig.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your .htconfig.php to check your node is working as expected before deleting it. table.config { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.config > tr > th, table.config > tr > td, table.config > * > tr > th, table.config > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.config > tr > th, table.config > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } .htconfig.php config/local.config.php $db_host = 'localhost'; $db_user = 'mysqlusername'; $db_pass = 'mysqlpassword'; $db_data = 'mysqldatabasename'; $a->config[\"system\"][\"db_charset\"] = 'utf8mb4'; 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], $a->config[\"section\"][\"key\"] = \"value\"; 'section' => [ 'key' => 'value', ], $a->config[\"section\"][\"key\"] = array( \"value1\", \"value2\", \"value3\" ); 'section' => [ 'key' => ['value1', 'value2', 'value3'], ], $a->config[\"key\"] = \"value\"; 'config' => [ 'key' => 'value', ], $a->config['register_policy'] = REGISTER_CLOSED; 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], $a->path = \"value\"; 'system' => [ 'urlpath' => 'value', ], $default_timezone = \"value\"; 'system' => [ 'default_timezone' => 'value', ], $pidfile = \"value\"; 'system' => [ 'pidfile' => 'value', ], $lang = \"value\"; 'system' => [ 'language' => 'value', ],","title":"Migrating from .htconfig.php to config/local.config.php"},{"location":"de/admin/config/#migrating-from-configlocaliniphp-to-configlocalconfigphp","text":"The legacy config/local.ini.php configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release. The migration is pretty straightforward: If you had any addon-specific configuration in your config/addon.ini.php , just copy config/addon-sample.config.php to config/addon.config.php and move your configuration values. Afterwards, copy config/local-sample.config.php to config/local.config.php , move the remaining configuration values to it according to the following conversion chart, then rename your config/local.ini.php file to check your node is working as expected before deleting it. config/local.ini.php config/local.config.php [database] hostname = localhost username = mysqlusername password = mysqlpassword database = mysqldatabasename charset = utf8mb4 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'database', 'charset' => 'utf8mb4', ], [section] key = value 'section' => [ 'key' => 'value', ], [config] register_policty = REGISTER_CLOSED 'config' => [ 'register_policy' => \\Friendica\\Module\\Register::CLOSED, ], [section] key[] = value1 key[] = value2 key[] = value3 'section' => [ 'key' => ['value1', 'value2', 'value3'], ],","title":"Migrating from config/local.ini.php to config/local.config.php"},{"location":"de/admin/config/#database-settings","text":"The configuration variables database.hostname , database.username , database.password , database.database and database.charset are holding your credentials for the database connection. If you need to specify a port to access the database, you can do so by appending :portnumber to the database.hostname variable. 'database' => [ 'hostname' => 'your.mysqlhost.com:123456', ] If all the following environment variables are set, Friendica will use them instead of the previously configured variables for the db: MYSQL_HOST MYSQL_PORT MYSQL_USERNAME MYSQL_PASSWORD MYSQL_DATABASE","title":"Database Settings"},{"location":"de/admin/config/#config-values-that-can-only-be-set-in-configlocalconfigphp_1","text":"There are some config values that haven't found their way into the administration page. This has several reasons. Maybe they are part of a current development that isn't considered stable and will be added later in the administration page when it is considered safe. Or it triggers something that isn't expected to be of public interest. Or it is for testing purposes only. Attention: Please be warned that you shouldn't use one of these values without the knowledge what it could trigger. Especially don't do that with undocumented values. These configurations keys and their default value are listed in static/defaults.config.php and should be overwritten in config/local.config.php .","title":"Config values that can only be set in config/local.config.php"},{"location":"de/admin/config/#administrator-options","text":"Enabling the admin panel for an account, and thus making the account holder admin of the node, is done by setting the variable 'config' => [ 'admin_email' => 'someone@example.com', ] Where you have to match the email address used for the account with the one you enter to the config/local.config.php file. If more than one account should be able to access the admin panel, separate the email addresses with a comma. 'config' => [ 'admin_email' => 'someone@example.com,someoneelse@example.com', ] If you want to have a more personalized closing line for the notification emails you can set a variable for the admin_name . 'config' => [ 'admin_name' => 'Marvin', ]","title":"Administrator Options"},{"location":"de/admin/install-ejabberd/","tags":["admin","ejabberd"],"text":"Install an ejabberd with synchronized credentials # Ejabberd is a chat server that uses XMPP as messaging protocol that you can use with a large amount of clients. In conjunction with the \"xmpp\" addon it can be used for a web based chat solution for your users. Installation # Change its owner to whichever user is running the server, i.e. ejabberd $ chown ejabberd:ejabberd /path/to/friendica/bin/auth_ejabberd.php Change the access mode, so it is readable only to the user ejabberd and has exec $ chmod 700 /path/to/friendica/bin/auth_ejabberd.php Edit your ejabberd.cfg file, comment out your auth_method and add: {auth_method, external}. {extauth_program, \"/path/to/friendica/bin/auth_ejabberd.php\"}. Disable the module \"mod_register\" and disable the registration: {access, register, [{deny, all}]}. Enable BOSH: Enable the module \"mod_http_bind\" Edit this line: {5280, ejabberd_http, [captcha, http_poll, http_bind]} In your apache configuration for your site add this line: ProxyPass /http-bind http://127.0.0.1:5280/http-bind retry=0 Restart your ejabberd service, you should be able to log in with your friendica credentials Other hints # if a user has a space or a @ in the nickname, the user has to replace these characters: \" \" (space) is replaced with \"%20\" \"@\" is replaced with \"(a)\"","title":"Install ejabberd"},{"location":"de/admin/install-ejabberd/#install-an-ejabberd-with-synchronized-credentials","text":"Ejabberd is a chat server that uses XMPP as messaging protocol that you can use with a large amount of clients. In conjunction with the \"xmpp\" addon it can be used for a web based chat solution for your users.","title":"Install an ejabberd with synchronized credentials"},{"location":"de/admin/install-ejabberd/#installation","text":"Change its owner to whichever user is running the server, i.e. ejabberd $ chown ejabberd:ejabberd /path/to/friendica/bin/auth_ejabberd.php Change the access mode, so it is readable only to the user ejabberd and has exec $ chmod 700 /path/to/friendica/bin/auth_ejabberd.php Edit your ejabberd.cfg file, comment out your auth_method and add: {auth_method, external}. {extauth_program, \"/path/to/friendica/bin/auth_ejabberd.php\"}. Disable the module \"mod_register\" and disable the registration: {access, register, [{deny, all}]}. Enable BOSH: Enable the module \"mod_http_bind\" Edit this line: {5280, ejabberd_http, [captcha, http_poll, http_bind]} In your apache configuration for your site add this line: ProxyPass /http-bind http://127.0.0.1:5280/http-bind retry=0 Restart your ejabberd service, you should be able to log in with your friendica credentials","title":"Installation"},{"location":"de/admin/install-ejabberd/#other-hints","text":"if a user has a space or a @ in the nickname, the user has to replace these characters: \" \" (space) is replaced with \"%20\" \"@\" is replaced with \"(a)\"","title":"Other hints"},{"location":"de/admin/installing-connectors/","tags":["admin","connectors","twitter","gnu social"],"text":"Installing Connectors (Twitter/GNU Social) # Friendica uses addons to provide connectivity to some networks, such as Twitter. There is also an addon to post through to an existing account on a GNU Social service. You only need this to post to an already existing GNU Social account, but not to communicate with GNU Social members in general. All three addons require an account on the target network. In addition, you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server. Site Configuration # Addons must be installed by the site administrator before they can be used. This is accomplished through the site administration panel. Each of the connectors also requires an \"API key\" from the service you wish to connect with. Some addons allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (config/local.config.php). The ways to obtain these keys vary between the services, but they all require an existing account on the target service. Once installed, these API keys can usually be shared by all site members. The details of configuring each service follow (much of this information comes directly from the addon source files): Twitter Addon for Friendica # Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license Configuration # To use this addon you need a OAuth Consumer key pair (key & secret). You can get it from Twitter . Register your Friendica site as \"Client\" application with \"Read & Write\" access. We do not need \"Twitter as login\". When you've registered the app you get a key pair with an OAuth Consumer key and a secret key for your application/site. Add this key pair to your config/local.config.php: [twitter] consumerkey = your consumer_key here consumersecret = your consumer_secret here After this, your users can configure their Twitter account settings from \"Settings -> Connector Settings\". More documentation # Find the author's documentation here: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin GNU Social Addon for Friendica # Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license Configuration # When the addon is activated the user has to acquire the following in order to connect to the GNU Social account of choice. The base URL for the GNU Social API, for quitter.se this is https://quitter.se/api/ OAuth Consumer key & secret To get the OAuth Consumer key pair the user has to 1 ask her Friendica admin if a pair already exists or 2 has to register the Friendica server as a client application on the GNU Social server. This can be done from the account settings under \"Settings -> Connections -> Register an OAuth client application -> Register a new application\" on the GNU Social server. During the registration of the OAuth client remember the following: Application names must be unique on the GNU Social site, so we recommend a Name of 'friendica-nnnn', replace 'nnnn' with a random number or your website name. there is no callback url register a desktop client with read & write access the Source URL should be the URL of your Friendica server After the required credentials for the application are stored in the configuration you have to actually connect your Friendica account with GNU Social. This is done from the Settings -> Connector Settings page. Follow the Sign in with GNU Social button, allow access and then copy the security code into the box provided. Friendica will then try to acquire the final OAuth credentials from the API. If successful, the addon settings will allow you to select to post your public messages to your GNU Social account (have a look behind the little lock symbol beneath the status \"editor\" on your Home or Network pages).","title":"Connectors"},{"location":"de/admin/installing-connectors/#installing-connectors-twittergnu-social","text":"Friendica uses addons to provide connectivity to some networks, such as Twitter. There is also an addon to post through to an existing account on a GNU Social service. You only need this to post to an already existing GNU Social account, but not to communicate with GNU Social members in general. All three addons require an account on the target network. In addition, you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server.","title":"Installing Connectors (Twitter/GNU Social)"},{"location":"de/admin/installing-connectors/#site-configuration","text":"Addons must be installed by the site administrator before they can be used. This is accomplished through the site administration panel. Each of the connectors also requires an \"API key\" from the service you wish to connect with. Some addons allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (config/local.config.php). The ways to obtain these keys vary between the services, but they all require an existing account on the target service. Once installed, these API keys can usually be shared by all site members. The details of configuring each service follow (much of this information comes directly from the addon source files):","title":"Site Configuration"},{"location":"de/admin/installing-connectors/#twitter-addon-for-friendica","text":"Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license","title":"Twitter Addon for Friendica"},{"location":"de/admin/installing-connectors/#configuration","text":"To use this addon you need a OAuth Consumer key pair (key & secret). You can get it from Twitter . Register your Friendica site as \"Client\" application with \"Read & Write\" access. We do not need \"Twitter as login\". When you've registered the app you get a key pair with an OAuth Consumer key and a secret key for your application/site. Add this key pair to your config/local.config.php: [twitter] consumerkey = your consumer_key here consumersecret = your consumer_secret here After this, your users can configure their Twitter account settings from \"Settings -> Connector Settings\".","title":"Configuration"},{"location":"de/admin/installing-connectors/#more-documentation","text":"Find the author's documentation here: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin","title":"More documentation"},{"location":"de/admin/installing-connectors/#gnu-social-addon-for-friendica","text":"Author: Tobias Diekershoff tobias.diekershoff@gmx.net License: 3-clause BSD license","title":"GNU Social Addon for Friendica"},{"location":"de/admin/installing-connectors/#configuration_1","text":"When the addon is activated the user has to acquire the following in order to connect to the GNU Social account of choice. The base URL for the GNU Social API, for quitter.se this is https://quitter.se/api/ OAuth Consumer key & secret To get the OAuth Consumer key pair the user has to 1 ask her Friendica admin if a pair already exists or 2 has to register the Friendica server as a client application on the GNU Social server. This can be done from the account settings under \"Settings -> Connections -> Register an OAuth client application -> Register a new application\" on the GNU Social server. During the registration of the OAuth client remember the following: Application names must be unique on the GNU Social site, so we recommend a Name of 'friendica-nnnn', replace 'nnnn' with a random number or your website name. there is no callback url register a desktop client with read & write access the Source URL should be the URL of your Friendica server After the required credentials for the application are stored in the configuration you have to actually connect your Friendica account with GNU Social. This is done from the Settings -> Connector Settings page. Follow the Sign in with GNU Social button, allow access and then copy the security code into the box provided. Friendica will then try to acquire the final OAuth credentials from the API. If successful, the addon settings will allow you to select to post your public messages to your GNU Social account (have a look behind the little lock symbol beneath the status \"editor\" on your Home or Network pages).","title":"Configuration"},{"location":"de/admin/migrate/","tags":["admin"],"text":"Migrating to a new server installation # Preparation # New server # Set up your new server as described here ; follow the installation procedure until you have created a database. Heads up to users # Inform your users of an upcoming interruption to your service. To ensure data consistency, your server needs to be offline during some steps of the migration processes. You may also find these addons useful for communicating with your users prior to the migration process: * blackout * notifyall Storage # Check your storage backend with bin/console storage list in the root folder. The output should look like this: Sel | Name ----------------------- | Filesystem * | Database If you are not using Database run the following commands: 1. bin/console storage set Database to activate the database backend. 2. bin/console storage move to initiate moving the stored image files. This process may take a long time depending on the size of your storage and your server's capacity. Prior to initiating this process, you may want to check the number of files in the storage with the following command: tree -if -I index.html /path/to/storage/ . Cleaning up # Before transferring your database, you may want to clean it up; ensure the expiration of database items is set to a reasonable value and activated via the administrator panel. Admin > Site > Performance > Enable \"Clean up database\" After adjusting these settings, the database cleaning up processes will be initiated according to your configured daily cron job. To review the size of your database, log into MySQL with mysql -p run the following query: SELECT table_schema AS \"Database\" , SUM ( data_length + index_length ) / 1024 / 1024 / 1024 AS \"Size (GB)\" FROM information_schema . TABLES GROUP BY table_schema ; You should see an output like this: +--------------------+----------------+ | Database | Size (GB) | +--------------------+----------------+ | friendica_db | 8.054092407227 | | [..........] | [...........] | +--------------------+----------------+ Finally, you may also want to optimise your database with the following command: mysqloptimize -p friendica-db Going offline # Stop background tasks and put your server in maintenance mode. 1. If you had set up a worker cron job like this */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php run crontab -e and comment out this line. Alternatively if you deploy a worker daemon, disable this instead. 2. Put your server into maintenance mode: bin/console maintenance 1 \"We are currently upgrading our system and will be back soon.\" Dumping DB # Export your database: mysqldump -p friendica_db > friendica_db-$(date +%Y%m%d).sql and possibly compress it. Transferring to new server # Transfer your database and a copy of your configuration file config/local.config.php.copy to your new server installation. Restoring your DB # Import your database on your new server: mysql -p friendica_db < your-friendica_db-file.sql Completing migration # Configuration file # Copy your old server's configuration file to config/local.config.php . Ensure the newly created database credentials are identical to the setting in the configuration file; otherwise update them accordingly. Cron job for worker # Set up the required daily cron job. Run crontab -e and add the following line according to your system specification */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php DNS settings # Adjust your DNS records by pointing them to your new server. Troubleshooting # If you are unable to log in to your newly migrated Friendica installation, check your web server's error and access logs and mysql logs for obvious issues. If still unable to resolve the problem, it's likely an issue with your installation . In this case, you may try to an entirely new Friendica installation on your new server, but use a different FQDN and DNS name. Once you have this up and running, take it offline and purge the database and configuration file and try migrating to this installation.","title":"Migrate"},{"location":"de/admin/migrate/#migrating-to-a-new-server-installation","text":"","title":"Migrating to a new server installation"},{"location":"de/admin/migrate/#preparation","text":"","title":"Preparation"},{"location":"de/admin/migrate/#new-server","text":"Set up your new server as described here ; follow the installation procedure until you have created a database.","title":"New server"},{"location":"de/admin/migrate/#heads-up-to-users","text":"Inform your users of an upcoming interruption to your service. To ensure data consistency, your server needs to be offline during some steps of the migration processes. You may also find these addons useful for communicating with your users prior to the migration process: * blackout * notifyall","title":"Heads up to users"},{"location":"de/admin/migrate/#storage","text":"Check your storage backend with bin/console storage list in the root folder. The output should look like this: Sel | Name ----------------------- | Filesystem * | Database If you are not using Database run the following commands: 1. bin/console storage set Database to activate the database backend. 2. bin/console storage move to initiate moving the stored image files. This process may take a long time depending on the size of your storage and your server's capacity. Prior to initiating this process, you may want to check the number of files in the storage with the following command: tree -if -I index.html /path/to/storage/ .","title":"Storage"},{"location":"de/admin/migrate/#cleaning-up","text":"Before transferring your database, you may want to clean it up; ensure the expiration of database items is set to a reasonable value and activated via the administrator panel. Admin > Site > Performance > Enable \"Clean up database\" After adjusting these settings, the database cleaning up processes will be initiated according to your configured daily cron job. To review the size of your database, log into MySQL with mysql -p run the following query: SELECT table_schema AS \"Database\" , SUM ( data_length + index_length ) / 1024 / 1024 / 1024 AS \"Size (GB)\" FROM information_schema . TABLES GROUP BY table_schema ; You should see an output like this: +--------------------+----------------+ | Database | Size (GB) | +--------------------+----------------+ | friendica_db | 8.054092407227 | | [..........] | [...........] | +--------------------+----------------+ Finally, you may also want to optimise your database with the following command: mysqloptimize -p friendica-db","title":"Cleaning up"},{"location":"de/admin/migrate/#going-offline","text":"Stop background tasks and put your server in maintenance mode. 1. If you had set up a worker cron job like this */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php run crontab -e and comment out this line. Alternatively if you deploy a worker daemon, disable this instead. 2. Put your server into maintenance mode: bin/console maintenance 1 \"We are currently upgrading our system and will be back soon.\"","title":"Going offline"},{"location":"de/admin/migrate/#dumping-db","text":"Export your database: mysqldump -p friendica_db > friendica_db-$(date +%Y%m%d).sql and possibly compress it.","title":"Dumping DB"},{"location":"de/admin/migrate/#transferring-to-new-server","text":"Transfer your database and a copy of your configuration file config/local.config.php.copy to your new server installation.","title":"Transferring to new server"},{"location":"de/admin/migrate/#restoring-your-db","text":"Import your database on your new server: mysql -p friendica_db < your-friendica_db-file.sql","title":"Restoring your DB"},{"location":"de/admin/migrate/#completing-migration","text":"","title":"Completing migration"},{"location":"de/admin/migrate/#configuration-file","text":"Copy your old server's configuration file to config/local.config.php . Ensure the newly created database credentials are identical to the setting in the configuration file; otherwise update them accordingly.","title":"Configuration file"},{"location":"de/admin/migrate/#cron-job-for-worker","text":"Set up the required daily cron job. Run crontab -e and add the following line according to your system specification */10 * * * * cd /var/www/friendica; /usr/bin/php bin/worker.php","title":"Cron job for worker"},{"location":"de/admin/migrate/#dns-settings","text":"Adjust your DNS records by pointing them to your new server.","title":"DNS settings"},{"location":"de/admin/migrate/#troubleshooting","text":"If you are unable to log in to your newly migrated Friendica installation, check your web server's error and access logs and mysql logs for obvious issues. If still unable to resolve the problem, it's likely an issue with your installation . In this case, you may try to an entirely new Friendica installation on your new server, but use a different FQDN and DNS name. Once you have this up and running, take it offline and purge the database and configuration file and try migrating to this installation.","title":"Troubleshooting"},{"location":"de/admin/tools/","tags":["admin","tools"],"text":"Admin Tools # Friendica Tools # Friendica has a build in command console you can find in the bin directory. The console provides the following commands: cache: Manage node cache config: Edit site config createdoxygen: Generate Doxygen headers dbstructure: Do database updates docbloxerrorchecker: Check the file tree for DocBlox errors extract: Generate translation string file for the Friendica project (deprecated) globalcommunityblock: Block remote profile from interacting with this node globalcommunitysilence: Silence remote profile from global community page archivecontact: Archive a contact when you know that it isn't existing anymore help: Show help about a command, e.g (bin/console help config) autoinstall: Starts automatic installation of friendica based on values from htconfig.php maintenance: Set maintenance mode for this node newpassword: Set a new password for a given user php2po: Generate a messages.po file from a strings.php file po2php: Generate a strings.php file from a messages.po file typo: Checks for parse errors in Friendica files postupdate: Execute pending post update scripts (can last days) storage: Manage storage backend relay: Manage ActivityPub relay servers Please consult bin/console help on the command line interface of your server for details about the commands. 3rd Party Tools # In addition to the tools Friendica includes, some 3rd party tools can make your admin days easier. Fail2ban # Fail2ban is an intrusion prevention framework ( see Wikipedia ) that you can use to forbid access to a server under certain conditions, e.g. 3 failed attempts to log in, for a certain amount of time. The following configuration was provided by Steffen K9 using Debian. You need to adjust the logpath in the jail.local file and the bantime (value is in seconds). In /etc/fail2ban/jail.local create a section for Friendica: [friendica] enabled = true findtime = 300 bantime = 900 filter = friendica port = http,https logpath = /var/log/friend.log logencoding = utf-8 And create a filter definition in /etc/fail2ban/filter.d/friendica.conf : [Definition] failregex = ^.*authenticate\\: failed login attempt.*\\\"ip\\\"\\:\\\"<HOST>\\\".*$ ignoreregex = Additionally, you have to define the number of failed logins before the ban should be activated. This is done either in the global configuration or for each jail separately. You should inform your users about the number of failed login attempts you grant them. Otherwise, you'll get many reports about the server not functioning if the number is too low. Log rotation # If you have activated the logs in Friendica, be aware that they can grow to a significant size. To keep them in control you should add them to the automatic log rotation , e.g. using the logrotate command. In /etc/logrotate.d/ add a file called friendica that contains the configuration. The following will compress /var/log/friendica (assuming this is the location of the log file) on a daily basis and keep 2 days of back-log. /var/log/friendica.log { compress daily rotate 2 }","title":"Tools"},{"location":"de/admin/tools/#admin-tools","text":"","title":"Admin Tools"},{"location":"de/admin/tools/#friendica-tools","text":"Friendica has a build in command console you can find in the bin directory. The console provides the following commands: cache: Manage node cache config: Edit site config createdoxygen: Generate Doxygen headers dbstructure: Do database updates docbloxerrorchecker: Check the file tree for DocBlox errors extract: Generate translation string file for the Friendica project (deprecated) globalcommunityblock: Block remote profile from interacting with this node globalcommunitysilence: Silence remote profile from global community page archivecontact: Archive a contact when you know that it isn't existing anymore help: Show help about a command, e.g (bin/console help config) autoinstall: Starts automatic installation of friendica based on values from htconfig.php maintenance: Set maintenance mode for this node newpassword: Set a new password for a given user php2po: Generate a messages.po file from a strings.php file po2php: Generate a strings.php file from a messages.po file typo: Checks for parse errors in Friendica files postupdate: Execute pending post update scripts (can last days) storage: Manage storage backend relay: Manage ActivityPub relay servers Please consult bin/console help on the command line interface of your server for details about the commands.","title":"Friendica Tools"},{"location":"de/admin/tools/#3rd-party-tools","text":"In addition to the tools Friendica includes, some 3rd party tools can make your admin days easier.","title":"3rd Party Tools"},{"location":"de/admin/tools/#fail2ban","text":"Fail2ban is an intrusion prevention framework ( see Wikipedia ) that you can use to forbid access to a server under certain conditions, e.g. 3 failed attempts to log in, for a certain amount of time. The following configuration was provided by Steffen K9 using Debian. You need to adjust the logpath in the jail.local file and the bantime (value is in seconds). In /etc/fail2ban/jail.local create a section for Friendica: [friendica] enabled = true findtime = 300 bantime = 900 filter = friendica port = http,https logpath = /var/log/friend.log logencoding = utf-8 And create a filter definition in /etc/fail2ban/filter.d/friendica.conf : [Definition] failregex = ^.*authenticate\\: failed login attempt.*\\\"ip\\\"\\:\\\"<HOST>\\\".*$ ignoreregex = Additionally, you have to define the number of failed logins before the ban should be activated. This is done either in the global configuration or for each jail separately. You should inform your users about the number of failed login attempts you grant them. Otherwise, you'll get many reports about the server not functioning if the number is too low.","title":"Fail2ban"},{"location":"de/admin/tools/#log-rotation","text":"If you have activated the logs in Friendica, be aware that they can grow to a significant size. To keep them in control you should add them to the automatic log rotation , e.g. using the logrotate command. In /etc/logrotate.d/ add a file called friendica that contains the configuration. The following will compress /var/log/friendica (assuming this is the location of the log file) on a daily basis and keep 2 days of back-log. /var/log/friendica.log { compress daily rotate 2 }","title":"Log rotation"},{"location":"de/admin/update/","tags":["admin"],"text":"Updating Friendica # Using a Friendica archive # If you installed Friendica in the path/to/friendica folder: Unpack the new Friendica archive in path/to/friendica_new . Copy the following items from path/to/friendica to path/to/friendica_new : config/local.config.php proxy/ The following items only need to be copied if they are located inside your friendica path: your storage folder as set in Admin -> Site -> File Upload -> Storage base path your item cache as set in Admin -> Site -> Performance -> Path to item cache your temp folder as set in Admin -> Site -> Advanced -> Temp path Rename the path/to/friendica folder to path/to/friendica_old . Rename the path/to/friendica_new folder to path/to/friendica . Check your site. Note: it may go into maintenance mode to update the database schema. If everything works, just delete the path/to/friendica_old folder. To update Addons from an archive, simply delete the path/to/friendica/addon and replace it with the provided archive. Using Git # You can get the latest changes at any time with cd path/to/friendica git pull bin/composer.phar install --no-dev The addon tree has to be updated separately like so: cd path/to/friendica/addon git pull For both repositories: The default branch to use is the stable branch, which is the stable version of Friendica. It is updated about four times a year on a fixed schedule. If you want to use and test bleeding edge code please check out the develop branch. The new features and fixes will be merged from develop into stable after a release candidate period before each release. Warning: The develop branch is unstable, and breaks on average once a month for at most 24 hours until a patch is submitted and merged. Be sure to pull frequently if you choose the develop branch. Considerations before upgrading Friendica # MySQL >= 5.7.4 # Starting from MySQL version 5.7.4, the IGNORE keyword in ALTER TABLE statements is ignored. This prevents automatic table deduplication if a UNIQUE index is added to a Friendica table's structure. If a DB update fails for you while creating a UNIQUE index, make sure to manually deduplicate the table before trying the update again. Manual deduplication # There are two main ways of doing it, either by manually removing the duplicates or by recreating the table. Manually removing the duplicates is usually faster if they're not too numerous. To manually remove the duplicates, you need to know the UNIQUE index columns available in database.sql . SELECT GROUP_CONCAT ( id ), < index columns > , count ( * ) as count FROM users GROUP BY < index columns > HAVING count >= 2 ; /* delete or merge duplicate from above query */ ; If there are too many rows to handle manually, you can create a new table with the same structure as the table with duplicates and insert the existing content with INSERT IGNORE. To recreate the table you need to know the table structure available in database.sql . CREATE TABLE < table_name > _new < rest of the CREATE TABLE > ; INSERT IGNORE INTO < table_name > _new SELECT * FROM < table_name > ; DROP TABLE < table_name > ; RENAME TABLE < table_name > _new TO < table_name > ; This method is slower overall, but it is better suited for large numbers of duplicates. Resolving Possible Database Issues Post Upgrading # Foreign Keys # Some updates include the use of foreign keys now that will bump into issues with previous versions, which would sometimes shove bad data into tables, preventing, causing errors such as below. Error 1452 occurred during database update: Cannot add or update a child row: a foreign key constraint fails (`friendica`.`#sql-10ea6_5a6d`, CONSTRAINT `#sql-10ea6_5a6d_ibfk_1` FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`)) ALTER TABLE `thread` ADD FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE; All current known fixes for possible items that can go wrong are as below. DELETE FROM ` item ` WHERE ` owner - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` item ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` notify ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); DELETE FROM ` photo ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` thread ` WHERE ` iid ` NOT IN ( SELECT ` id ` FROM ` item ` ); DELETE FROM ` item ` WHERE ` author - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` diaspora - interaction ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); This all has been compiled as of currently from issue #9746, #9753, and #9878.","title":"Update"},{"location":"de/admin/update/#updating-friendica","text":"","title":"Updating Friendica"},{"location":"de/admin/update/#using-a-friendica-archive","text":"If you installed Friendica in the path/to/friendica folder: Unpack the new Friendica archive in path/to/friendica_new . Copy the following items from path/to/friendica to path/to/friendica_new : config/local.config.php proxy/ The following items only need to be copied if they are located inside your friendica path: your storage folder as set in Admin -> Site -> File Upload -> Storage base path your item cache as set in Admin -> Site -> Performance -> Path to item cache your temp folder as set in Admin -> Site -> Advanced -> Temp path Rename the path/to/friendica folder to path/to/friendica_old . Rename the path/to/friendica_new folder to path/to/friendica . Check your site. Note: it may go into maintenance mode to update the database schema. If everything works, just delete the path/to/friendica_old folder. To update Addons from an archive, simply delete the path/to/friendica/addon and replace it with the provided archive.","title":"Using a Friendica archive"},{"location":"de/admin/update/#using-git","text":"You can get the latest changes at any time with cd path/to/friendica git pull bin/composer.phar install --no-dev The addon tree has to be updated separately like so: cd path/to/friendica/addon git pull For both repositories: The default branch to use is the stable branch, which is the stable version of Friendica. It is updated about four times a year on a fixed schedule. If you want to use and test bleeding edge code please check out the develop branch. The new features and fixes will be merged from develop into stable after a release candidate period before each release. Warning: The develop branch is unstable, and breaks on average once a month for at most 24 hours until a patch is submitted and merged. Be sure to pull frequently if you choose the develop branch.","title":"Using Git"},{"location":"de/admin/update/#considerations-before-upgrading-friendica","text":"","title":"Considerations before upgrading Friendica"},{"location":"de/admin/update/#mysql-574","text":"Starting from MySQL version 5.7.4, the IGNORE keyword in ALTER TABLE statements is ignored. This prevents automatic table deduplication if a UNIQUE index is added to a Friendica table's structure. If a DB update fails for you while creating a UNIQUE index, make sure to manually deduplicate the table before trying the update again.","title":"MySQL &gt;= 5.7.4"},{"location":"de/admin/update/#manual-deduplication","text":"There are two main ways of doing it, either by manually removing the duplicates or by recreating the table. Manually removing the duplicates is usually faster if they're not too numerous. To manually remove the duplicates, you need to know the UNIQUE index columns available in database.sql . SELECT GROUP_CONCAT ( id ), < index columns > , count ( * ) as count FROM users GROUP BY < index columns > HAVING count >= 2 ; /* delete or merge duplicate from above query */ ; If there are too many rows to handle manually, you can create a new table with the same structure as the table with duplicates and insert the existing content with INSERT IGNORE. To recreate the table you need to know the table structure available in database.sql . CREATE TABLE < table_name > _new < rest of the CREATE TABLE > ; INSERT IGNORE INTO < table_name > _new SELECT * FROM < table_name > ; DROP TABLE < table_name > ; RENAME TABLE < table_name > _new TO < table_name > ; This method is slower overall, but it is better suited for large numbers of duplicates.","title":"Manual deduplication"},{"location":"de/admin/update/#resolving-possible-database-issues-post-upgrading","text":"","title":"Resolving Possible Database Issues Post Upgrading"},{"location":"de/admin/update/#foreign-keys","text":"Some updates include the use of foreign keys now that will bump into issues with previous versions, which would sometimes shove bad data into tables, preventing, causing errors such as below. Error 1452 occurred during database update: Cannot add or update a child row: a foreign key constraint fails (`friendica`.`#sql-10ea6_5a6d`, CONSTRAINT `#sql-10ea6_5a6d_ibfk_1` FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`)) ALTER TABLE `thread` ADD FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE; All current known fixes for possible items that can go wrong are as below. DELETE FROM ` item ` WHERE ` owner - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` item ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` notify ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); DELETE FROM ` photo ` WHERE ` contact - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` thread ` WHERE ` iid ` NOT IN ( SELECT ` id ` FROM ` item ` ); DELETE FROM ` item ` WHERE ` author - id ` NOT IN ( SELECT ` id ` FROM ` contact ` ); DELETE FROM ` diaspora - interaction ` WHERE ` uri - id ` NOT IN ( SELECT ` id ` FROM ` item - uri ` ); This all has been compiled as of currently from issue #9746, #9753, and #9878.","title":"Foreign Keys"},{"location":"de/","text":"Friendica - Dokumentation und Ressourcen # Inhalte # Allgemeine Funktionen - Erste Schritte Account - Basics Schnellstart f\u00fcr neue Benutzer Beitr\u00e4ge erstellen Referenz der BBCode Elemente Beitr\u00e4ge kommentieren, einordnen und l\u00f6schen Referenz der Accesskeys Veranstaltungen Du und andere Nutzer Konnektoren (Connectors) Freunde finden Gruppen und Privatsph\u00e4re Tags und Erw\u00e4hnungen Community-Foren Chats Weiterf\u00fchrende Informationen Account umziehen Export / Import gefolgter Kontakte Account l\u00f6schen Bugs und Probleme H\u00e4ufig gestellte Fragen (FAQ) Dokumentation f\u00fcr Administratoren # Installation Update (EN) Konfigurationen & Admin-Panel Konnektoren (Connectors) installieren (Twitter/GNU Social) Installation eines ejabberd Servers (XMPP-Chat) mit synchronisierten Anmeldedaten (EN) Betreibe deine Seite mit einem SSL-Zertifikat Konfigurationswerte, die nur in der config/local.config.php gesetzt werden k\u00f6nnen (EN) Performance verbessern Administration Werkzeuge (EN) Admin FAQ Dokumentation f\u00fcr Entwickler # Addons Where to get started? Help on Github (EN) Help on Vagrant (EN) How to translate Friendica (EN) Bugs and Issues Theme Development (EN) Smarty 3 Templates (EN) Protokoll Dokumentation (EN) Datenbank-Schema (EN) Class Autoloading (EN) Using Composer (EN) Code-Referenz (mit doxygen generiert - setzt Cookies) API Dokumentation (EN) Translation of Friendica (EN) Run tests (EN) Externe Ressourcen # Haupt-Webseite Support Kan\u00e4le Friendica Support Forum: @helpers@forum.friendi.ca Mailing Listen Archiv zum Abonnieren der Liste eine E-Mail an support-request(at)friendi.ca?subject=subscribe senden Chats der Friendica Community (die IRC, Matrix und XMPP R\u00e4ume sind mit einer Br\u00fccke verbunden) Logs dieser \u00f6ffentlichen Chatr\u00e4ume k\u00f6nnen hier aus dem IRC und hier aus der Matrix gefunden werden. XMPP/Jabber MUC: support(at)forum.friendi.ca IRC: #friendica auf libera.chat Matrix: #friendi.ca oder #friendica-en auf matrix.org","title":"Start"},{"location":"de/#friendica-dokumentation-und-ressourcen","text":"","title":"Friendica - Dokumentation und Ressourcen"},{"location":"de/#inhalte","text":"Allgemeine Funktionen - Erste Schritte Account - Basics Schnellstart f\u00fcr neue Benutzer Beitr\u00e4ge erstellen Referenz der BBCode Elemente Beitr\u00e4ge kommentieren, einordnen und l\u00f6schen Referenz der Accesskeys Veranstaltungen Du und andere Nutzer Konnektoren (Connectors) Freunde finden Gruppen und Privatsph\u00e4re Tags und Erw\u00e4hnungen Community-Foren Chats Weiterf\u00fchrende Informationen Account umziehen Export / Import gefolgter Kontakte Account l\u00f6schen Bugs und Probleme H\u00e4ufig gestellte Fragen (FAQ)","title":"Inhalte"},{"location":"de/#dokumentation-fur-administratoren","text":"Installation Update (EN) Konfigurationen & Admin-Panel Konnektoren (Connectors) installieren (Twitter/GNU Social) Installation eines ejabberd Servers (XMPP-Chat) mit synchronisierten Anmeldedaten (EN) Betreibe deine Seite mit einem SSL-Zertifikat Konfigurationswerte, die nur in der config/local.config.php gesetzt werden k\u00f6nnen (EN) Performance verbessern Administration Werkzeuge (EN) Admin FAQ","title":"Dokumentation f\u00fcr Administratoren"},{"location":"de/#dokumentation-fur-entwickler","text":"Addons Where to get started? Help on Github (EN) Help on Vagrant (EN) How to translate Friendica (EN) Bugs and Issues Theme Development (EN) Smarty 3 Templates (EN) Protokoll Dokumentation (EN) Datenbank-Schema (EN) Class Autoloading (EN) Using Composer (EN) Code-Referenz (mit doxygen generiert - setzt Cookies) API Dokumentation (EN) Translation of Friendica (EN) Run tests (EN)","title":"Dokumentation f\u00fcr Entwickler"},{"location":"de/#externe-ressourcen","text":"Haupt-Webseite Support Kan\u00e4le Friendica Support Forum: @helpers@forum.friendi.ca Mailing Listen Archiv zum Abonnieren der Liste eine E-Mail an support-request(at)friendi.ca?subject=subscribe senden Chats der Friendica Community (die IRC, Matrix und XMPP R\u00e4ume sind mit einer Br\u00fccke verbunden) Logs dieser \u00f6ffentlichen Chatr\u00e4ume k\u00f6nnen hier aus dem IRC und hier aus der Matrix gefunden werden. XMPP/Jabber MUC: support(at)forum.friendi.ca IRC: #friendica auf libera.chat Matrix: #friendi.ca oder #friendica-en auf matrix.org","title":"Externe Ressourcen"},{"location":"de/bugs-and-issues/","tags":["bugs"],"text":"Bugs und Probleme # du solltest jeden Bug und jedes Problem, den/das du findest, zun\u00e4chst dem Administrator (oder gegebenenfalls der Support-Seite) deines Servers melden, statt auf der allgemeinen Bug-Seite. Das erleichtert den Entwicklern ihre Arbeit (z. B. neue Features zu entwickeln), da sie sich nicht mit Fehlern besch\u00e4ftigen m\u00fcssen, mit denen sie nichts zu tun haben. Wenn du technisch versiert bist oder dein Knoten keine Support-Seite hat, dann kannst du den Bug Tracker nutzen. Bitte durchsuche zun\u00e4chst die Seite, ob es bereits einen offenen Bug gibt, der deiner Anfrage entspricht. Liefere so viele Informationen wie m\u00f6glich zu dem Bug. Hierzu geh\u00f6rt auch die komplette Fehlermeldung oder Notiz und alle Schritte, die zu dem Fehler gef\u00fchrt haben. Es ist generell besser, zu viele Informationen zu liefern, als zu wenige. Lies dir diesen Artikel (mehrsprachig) durch, um mehr \u00fcber gute Bug-Reports zu erfahren.","title":"Bugs und Probleme"},{"location":"de/bugs-and-issues/#bugs-und-probleme","text":"du solltest jeden Bug und jedes Problem, den/das du findest, zun\u00e4chst dem Administrator (oder gegebenenfalls der Support-Seite) deines Servers melden, statt auf der allgemeinen Bug-Seite. Das erleichtert den Entwicklern ihre Arbeit (z. B. neue Features zu entwickeln), da sie sich nicht mit Fehlern besch\u00e4ftigen m\u00fcssen, mit denen sie nichts zu tun haben. Wenn du technisch versiert bist oder dein Knoten keine Support-Seite hat, dann kannst du den Bug Tracker nutzen. Bitte durchsuche zun\u00e4chst die Seite, ob es bereits einen offenen Bug gibt, der deiner Anfrage entspricht. Liefere so viele Informationen wie m\u00f6glich zu dem Bug. Hierzu geh\u00f6rt auch die komplette Fehlermeldung oder Notiz und alle Schritte, die zu dem Fehler gef\u00fchrt haben. Es ist generell besser, zu viele Informationen zu liefern, als zu wenige. Lies dir diesen Artikel (mehrsprachig) durch, um mehr \u00fcber gute Bug-Reports zu erfahren.","title":"Bugs und Probleme"},{"location":"de/admin/faq/","tags":["faq","admin"],"text":"H\u00e4ufig gestellte Fragen (Admin) # Kann ich mehrere Domains mit denselben Dateien aufsetzen? # Ja, das ist m\u00f6glich. Es ist allerdings nicht m\u00f6glich, eine Datenbank durch zwei Domains zu nutzen. Solange Du Deine config/local.config.php allerdings so einrichtest, dass das System nicht versucht, eine Installation durchzuf\u00fchren, kannst Du die richtige Config-Datei in include/$hostname/config/local.config.php hinterlegen. Alle Cache-Aspekte und der Zugriffsschutz k\u00f6nnen pro Instanz konfiguriert werden. Wo kann ich den Quellcode von Friendica, Add-ons und Themes finden? # Du kannst den Friendica-Quellcode hier finden. Dort findest Du immer die aktuellste stabile Version von Friendica. Der Quellcode von Friendica Red ist hier zu finden. Add-ons findest Du auf dieser Seite . Wenn Du neue Themen suchst, findest Du sie auf Friendica-Themes.com . Ich habe meine E-Mail-Adresse ge\u00e4ndert und jetzt ist das Adminpanel verschwunden? # Bitte aktualisiere deine E-Mail Adresse in der config/local.config.php Datei. Kann es mehr als einen Admin auf einer Friendica Instanz geben? # Ja. Du kannst in der config/local.config.php Datei mehrere E-Mail Adressen auflisten. Die aufgelisteten Adressen werden mit Kommata voneinander getrennt. Die Datenbank Struktur schein nicht aktuell zu sein. Was kann ich tun? # Rufe bitte im Admin Panel den Punkt DB Updates auf und folge dem Link Datenbank Struktur \u00fcberpr\u00fcfen . Damit wird ein Hintergrundprozess gestartet der die Struktur deiner Datenbank \u00fcberpr\u00fcft und gegebenenfalls aktualisiert. Du kannst das Strukturupdates auch manuell auf der Kommandoeingabe ausf\u00fchren. Starte dazu bitte vom Grundverzeichnis deiner Friendica Instanz folgendes Kommando: bin/console dbstructure update Sollte bei der Ausf\u00fchrung Fehler auftreten, kontaktiere bitte das Support-Forum .","title":"FAQ"},{"location":"de/admin/faq/#haufig-gestellte-fragen-admin","text":"","title":"H\u00e4ufig gestellte Fragen (Admin)"},{"location":"de/admin/faq/#kann-ich-mehrere-domains-mit-denselben-dateien-aufsetzen","text":"Ja, das ist m\u00f6glich. Es ist allerdings nicht m\u00f6glich, eine Datenbank durch zwei Domains zu nutzen. Solange Du Deine config/local.config.php allerdings so einrichtest, dass das System nicht versucht, eine Installation durchzuf\u00fchren, kannst Du die richtige Config-Datei in include/$hostname/config/local.config.php hinterlegen. Alle Cache-Aspekte und der Zugriffsschutz k\u00f6nnen pro Instanz konfiguriert werden.","title":"Kann ich mehrere Domains mit denselben Dateien aufsetzen?"},{"location":"de/admin/faq/#wo-kann-ich-den-quellcode-von-friendica-add-ons-und-themes-finden","text":"Du kannst den Friendica-Quellcode hier finden. Dort findest Du immer die aktuellste stabile Version von Friendica. Der Quellcode von Friendica Red ist hier zu finden. Add-ons findest Du auf dieser Seite . Wenn Du neue Themen suchst, findest Du sie auf Friendica-Themes.com .","title":"Wo kann ich den Quellcode von Friendica, Add-ons und Themes finden?"},{"location":"de/admin/faq/#ich-habe-meine-e-mail-adresse-geandert-und-jetzt-ist-das-adminpanel-verschwunden","text":"Bitte aktualisiere deine E-Mail Adresse in der config/local.config.php Datei.","title":"Ich habe meine E-Mail-Adresse ge\u00e4ndert und jetzt ist das Adminpanel verschwunden?"},{"location":"de/admin/faq/#kann-es-mehr-als-einen-admin-auf-einer-friendica-instanz-geben","text":"Ja. Du kannst in der config/local.config.php Datei mehrere E-Mail Adressen auflisten. Die aufgelisteten Adressen werden mit Kommata voneinander getrennt.","title":"Kann es mehr als einen Admin auf einer Friendica Instanz geben?"},{"location":"de/admin/faq/#die-datenbank-struktur-schein-nicht-aktuell-zu-sein-was-kann-ich-tun","text":"Rufe bitte im Admin Panel den Punkt DB Updates auf und folge dem Link Datenbank Struktur \u00fcberpr\u00fcfen . Damit wird ein Hintergrundprozess gestartet der die Struktur deiner Datenbank \u00fcberpr\u00fcft und gegebenenfalls aktualisiert. Du kannst das Strukturupdates auch manuell auf der Kommandoeingabe ausf\u00fchren. Starte dazu bitte vom Grundverzeichnis deiner Friendica Instanz folgendes Kommando: bin/console dbstructure update Sollte bei der Ausf\u00fchrung Fehler auftreten, kontaktiere bitte das Support-Forum .","title":"Die Datenbank Struktur schein nicht aktuell zu sein. Was kann ich tun?"},{"location":"de/admin/improve-performance/","tags":["admin","performance"],"text":"How-to: Performance verbessern # Eine kleine Anleitung, um die Performance einer Friendica-Seite zu verbessern. Vorab: Wenn du Fragen zu den folgenden Anweisungen oder zu anderen Themen hast, dann kannst du jederzeit beim Friendica-Support unter https://forum.friendi.ca/profile/helpers nachfragen. Systemeinstellungen # Geh auf /admin/site in deinem System und \u00e4ndere die folgenden Werte: setze \"Qualit\u00e4t des JPEG Bildes\" auf 50. Dieser Wert reduziert die Daten, die vom Server an den Client geschickt werden. 50 ist ein Wert, der die Bildqualit\u00e4t nicht zu stark beeinflusst. setze \"Intervall zum Vervollst\u00e4ndigen von OStatus Unterhaltungen\" auf \"niemals\" Wenn du viele OStatus-Kontakte hast, dann kann die Vervollst\u00e4ndigung von Unterhaltungen sehr zeitraubend sein. Der Nachteil: Du siehst nicht jede Antwort einer OStatus-Unterhaltung. Aus diesem Grund ist die Option \"Beim Empfang von Nachrichten\" in der Regel ein guter Kompromiss. setze \"Nutze MySQL full text engine\". Wenn du MyISAM (Standardeinstellung) oder InnoDB mit MariaDB 10 nutzt, dann beschleunigt dies die Suche. Addons # Aktiviere die folgenden Addons: rendertime rendertime # Beschreibung Dieses Add-on beschleunigt dein System nicht, aber es hilft dabei, die Flaschenh\u00e4lse zu ermitteln. Wenn es aktiviert ist, dann siehst du Werte wie die folgenden auf jeder deiner Seiten: Performance: Database: 0.244, Network: 0.002, Rendering: 0.044, Parser: 0.001, I/O: 0.021, Other: 0.237, Total: 0.548 Database: Dies ist die Zeit f\u00fcr alle Datenbankabfragen Network: Zeit, die ben\u00f6tigt wird, um Inhalte von externen Seiten vorzuladen Rendering: Zeit, die zum rendern des Themas ben\u00f6tigt wird Parser: Die Zeit, die der BBCode-Parser ben\u00f6tigt, um die Ausgabe der Seite zu erstellen I/O: Zeit, die der lokale Dateizugriff ben\u00f6tigt Others: alles andere :) Total: Die Summe aller genannten Werte Diese Werte zeigen deine Performance-Probleme. Webserver # Wenn du einen Apache-Webserver nutzt, aktiviere bitte die folgenden Module: Cache-Control # Dieses Modul weist den Client an, den Inhalt statischer Dateien zu speichern, um diese nicht immer wieder neu laden zu m\u00fcssen. Aktiviere das Modul mod_expires , indem du a2enmod expires als root eingibst. F\u00fcge die folgenden Zeilen in die Apache-Konfiguration deiner Seite im \"directory\"-Bereich ein. ExpiresActive on ExpiresDefault \"access plus 1 week\" Weitere Informationen findest du hier: http://httpd.apache.org/docs/2.2/mod/mod_expires.html. Compress content # Dieses Modul komprimiert den Datenverkehr (Traffic) zwischen dem Webserver und dem Client. Aktiviere das Modul mod_deflate durch die Eingabe a2enmod deflate als root. Weitere Informationen findest du hier: http://httpd.apache.org/docs/2.2/mod/mod_deflate.html PHP # FCGI # Wenn du Apache nutzt, dann denk dar\u00fcber nach, FCGI zu nutzen. Wenn du eine Debian-basierte Distribution nutzt, dann wirst du die Pakete php5-cgi und libapache2-mod-fcgid ben\u00f6tigen. Nutze externe Dokumente, um eine detailliertere Erkl\u00e4rung f\u00fcr die Einrichtung eines Systems auf FCGI-Basis zu erhalten. Database # Es gibt Skripte wie tuning-primer.sh und mysqltuner.pl , die den Datenbankserver analysieren und Hinweise darauf geben, welche Werte ver\u00e4ndert werden k\u00f6nnten. Aktivere hierf\u00fcr die \"Slow query\" Log-Datei, um Performanceprobleme zu erkennen.","title":"Performance verbessern"},{"location":"de/admin/improve-performance/#how-to-performance-verbessern","text":"Eine kleine Anleitung, um die Performance einer Friendica-Seite zu verbessern. Vorab: Wenn du Fragen zu den folgenden Anweisungen oder zu anderen Themen hast, dann kannst du jederzeit beim Friendica-Support unter https://forum.friendi.ca/profile/helpers nachfragen.","title":"How-to: Performance verbessern"},{"location":"de/admin/improve-performance/#systemeinstellungen","text":"Geh auf /admin/site in deinem System und \u00e4ndere die folgenden Werte: setze \"Qualit\u00e4t des JPEG Bildes\" auf 50. Dieser Wert reduziert die Daten, die vom Server an den Client geschickt werden. 50 ist ein Wert, der die Bildqualit\u00e4t nicht zu stark beeinflusst. setze \"Intervall zum Vervollst\u00e4ndigen von OStatus Unterhaltungen\" auf \"niemals\" Wenn du viele OStatus-Kontakte hast, dann kann die Vervollst\u00e4ndigung von Unterhaltungen sehr zeitraubend sein. Der Nachteil: Du siehst nicht jede Antwort einer OStatus-Unterhaltung. Aus diesem Grund ist die Option \"Beim Empfang von Nachrichten\" in der Regel ein guter Kompromiss. setze \"Nutze MySQL full text engine\". Wenn du MyISAM (Standardeinstellung) oder InnoDB mit MariaDB 10 nutzt, dann beschleunigt dies die Suche.","title":"Systemeinstellungen"},{"location":"de/admin/improve-performance/#addons","text":"Aktiviere die folgenden Addons: rendertime","title":"Addons"},{"location":"de/admin/improve-performance/#rendertime","text":"Beschreibung Dieses Add-on beschleunigt dein System nicht, aber es hilft dabei, die Flaschenh\u00e4lse zu ermitteln. Wenn es aktiviert ist, dann siehst du Werte wie die folgenden auf jeder deiner Seiten: Performance: Database: 0.244, Network: 0.002, Rendering: 0.044, Parser: 0.001, I/O: 0.021, Other: 0.237, Total: 0.548 Database: Dies ist die Zeit f\u00fcr alle Datenbankabfragen Network: Zeit, die ben\u00f6tigt wird, um Inhalte von externen Seiten vorzuladen Rendering: Zeit, die zum rendern des Themas ben\u00f6tigt wird Parser: Die Zeit, die der BBCode-Parser ben\u00f6tigt, um die Ausgabe der Seite zu erstellen I/O: Zeit, die der lokale Dateizugriff ben\u00f6tigt Others: alles andere :) Total: Die Summe aller genannten Werte Diese Werte zeigen deine Performance-Probleme.","title":"rendertime"},{"location":"de/admin/improve-performance/#webserver","text":"Wenn du einen Apache-Webserver nutzt, aktiviere bitte die folgenden Module:","title":"Webserver"},{"location":"de/admin/improve-performance/#cache-control","text":"Dieses Modul weist den Client an, den Inhalt statischer Dateien zu speichern, um diese nicht immer wieder neu laden zu m\u00fcssen. Aktiviere das Modul mod_expires , indem du a2enmod expires als root eingibst. F\u00fcge die folgenden Zeilen in die Apache-Konfiguration deiner Seite im \"directory\"-Bereich ein. ExpiresActive on ExpiresDefault \"access plus 1 week\" Weitere Informationen findest du hier: http://httpd.apache.org/docs/2.2/mod/mod_expires.html.","title":"Cache-Control"},{"location":"de/admin/improve-performance/#compress-content","text":"Dieses Modul komprimiert den Datenverkehr (Traffic) zwischen dem Webserver und dem Client. Aktiviere das Modul mod_deflate durch die Eingabe a2enmod deflate als root. Weitere Informationen findest du hier: http://httpd.apache.org/docs/2.2/mod/mod_deflate.html","title":"Compress content"},{"location":"de/admin/improve-performance/#php","text":"","title":"PHP"},{"location":"de/admin/improve-performance/#fcgi","text":"Wenn du Apache nutzt, dann denk dar\u00fcber nach, FCGI zu nutzen. Wenn du eine Debian-basierte Distribution nutzt, dann wirst du die Pakete php5-cgi und libapache2-mod-fcgid ben\u00f6tigen. Nutze externe Dokumente, um eine detailliertere Erkl\u00e4rung f\u00fcr die Einrichtung eines Systems auf FCGI-Basis zu erhalten.","title":"FCGI"},{"location":"de/admin/improve-performance/#database","text":"Es gibt Skripte wie tuning-primer.sh und mysqltuner.pl , die den Datenbankserver analysieren und Hinweise darauf geben, welche Werte ver\u00e4ndert werden k\u00f6nnten. Aktivere hierf\u00fcr die \"Slow query\" Log-Datei, um Performanceprobleme zu erkennen.","title":"Database"},{"location":"de/admin/install/","tags":["install","admin"],"text":"Friendica Installation # Wir haben hart daran gearbeitet, um Friendica auf vorgefertigten Hosting-Plattformen zum Laufen zu bringen - solche, auf denen auch Wordpress Blogs und Drupal-Installationen laufen. Wir bieten eine manuelle und eine automatische Installation an. Aber bedenke, dass Friendica mehr als eine einfache Webanwendung ist. Es handelt sich um ein komplexes Kommunikationssystem, das eher an einen E-Mail-Server erinnert als an einen Webserver. Um die Verf\u00fcgbarkeit und Performance zu gew\u00e4hrleisten, werden Nachrichten im Hintergrund verschickt und gespeichert, um sie sp\u00e4ter zu verschicken, wenn eine Webseite gerade nicht erreichbar ist. Diese Funktionalit\u00e4t ben\u00f6tigt ein wenig mehr als die normalen Blogs. Nicht jeder PHP/MySQL-Hosting-Anbieter kann Friendica unterst\u00fctzen. Viele hingegen k\u00f6nnen es. Aber bitte pr\u00fcfe die Voraussetzungen deines Servers vor der Installation. Wenn dir Fehler w\u00e4hrend der Installation auffallen, sag uns bitte \u00fcber Helper oder das Entwickler-Forum Bescheid oder erstelle ein Issue . Gib uns bitte so viele Informationen zu deinem System, wie du kannst, und beschreibe den Fehler mit allen Details und Fehlermeldungen, sodass wir den Fehler zuk\u00fcnftig verhindern k\u00f6nnen. Aufgrund der gro\u00dfen Anzahl an verschiedenen Betriebssystemen und PHP-Plattformen haben wir nur geringe Kapazit\u00e4ten, um deine PHP-Installation zu debuggen oder fehlende Module zu ersetzen, aber wir tun unser Bestes, um allgemeine Code-Fehler zu beheben. Bevor du anf\u00e4ngst: suche dir einen Domain- oder Subdomainnamen f\u00fcr deinen Server. Dinge ver\u00e4ndern sich und einige deiner Freunde haben m\u00f6glicherweise Probleme, mit dir zu kommunizieren. Wir planen, diese Einschr\u00e4nkung in einer zuk\u00fcnftigen Version zu beheben. Anforderungen # Apache mit einer aktiverten mod-rewrite-Funktion und dem Eintrag \"Options All\", so dass du die lokale .htaccess-Datei nutzen kannst PHP 7.3+ (PHP 8 wird noch nicht komplett unterst\u00fctzt) PHP Kommandozeilen -Zugang mit register_argc_argv auf \"true\" gesetzt in der php.ini-Datei Curl, GD, GMP, PDO, MySQLi, xml, zip und OpenSSL-Erweiterung Das POSIX Modul muss aktiviert sein ( CentOS, RHEL haben dies z.B. deaktiviert) Einen E-Mail Server, sodass PHP mail() funktioniert. Wenn kein eigener E-Mail-Server zur Verf\u00fcgung steht, kann alternativ das phpmailer Add-on mit einem externen SMTP Account verwendet werden. Mysql 5.6+ (oder eine \u00e4quivalente Alternative: MariaDB, Percona Server etc.) die M\u00f6glichkeit, wiederkehrende Aufgaben mit cron (Linux/Mac) oder \"Scheduled Tasks\" einzustellen (Windows) [Beachte: andere Optionen sind in Abschnitt 7 dieser Dokumentation zu finden] Installation in einer Top-Level-Domain oder Subdomain (ohne eine Verzeichnis/Pfad-Komponente in der URL) wird bevorzugt. Verzeichnispfade sind f\u00fcr diesen Zweck nicht so g\u00fcnstig und wurden auch nicht ausf\u00fchrlich getestet. Installation # Alternative Wege um Friendica zu Installieren # Diese Anleitung wird dir Schritt-f\u00fcr-Schritt zeigen wie du Friendica auf deinem Server installieren kannst. Falls du an automatischen M\u00f6glichkeiten interesse hast, wirf doch einen Blick auf das Docker image f\u00fcr Friendica oder die Installation von Friendica auf YunoHost . Friendica # Entpacke die Friendica-Daten in das Quellverzeichnis (root) des Dokumentenbereichs deines Webservers. Wenn du die M\u00f6glichkeit hierzu hast, empfehlen wir dir git zu nutzen, um die Daten direkt von der Quelle zu klonen, statt die gepackte .tar- oder .zip-Datei zu nutzen. Das macht die Aktualisierung wesentlich einfacher. Der Linux-Code, mit dem man die Dateien direkt in ein Verzeichnis wie \"meinewebseite\" kopiert, ist git clone https://github.com/friendica/friendica.git -b stable mywebsite cd mywebsite bin/composer.phar install Stelle sicher, dass der Ordner view/smarty3 existiert and von dem Webserver-Benutzer beschreibbar ist mkdir view/smarty3 chmod 775 view/smarty3 Falls Add-ons installiert werden sollen: Gehe in den Friendica-Ordner cd mywebsite Und die Addon Repository klonst: git clone https://github.com/friendica/friendica-addons.git -b stable addon Um das Addon-Verzeichnis aktuell zu halten, solltest du in diesem Pfad ein git pull -Befehl eintragen cd meinewebseite/addon git pull Wenn du den Verzeichnispfad auf deinen Webserver kopierst, dann stelle sicher, dass du auch die .htaccess kopierst, da \"Punkt\"-Dateien oft versteckt sind und normalerweise nicht direkt kopiert werden. Wenn du die Entwickler Version von Friendica verwenden m\u00f6chtest, kannst du auf den develop Branch im git Repository wechseln. Dies tust du mit den folgenden Befehlen git checkout develop bin/composer.phar install cd addon git checkout develop Die Entwickler Version kann nach einem fehlerhaften Commit vor\u00fcbergehend Probleme haben oder gar nicht mehr funktionieren. Sollte dir so etwas passieren, lass es uns bitte wissen, damit der Fehler behoben werden kann. Erstelle eine Datenbank # Erstelle eine leere Datenbank und notiere alle Zugangsdaten (Adresse der Datenbank, Nutzername, Passwort, Datenbankname). Friendica ben\u00f6tigt die Berechtigungen, um neue Felder in dieser Datenbank zu erstellen (create) und zu l\u00f6schen (delete). Mit neueren Versionen von MySQL (5.7.17+) musst du den sql_mode zu '' (blank) setzen. Benutze diese Einstellung, wenn der Installer nicht in der Lage ist, die Tabellen aufgrund eines Timestamp-Format-Problems zu erstellen. Falls dem so ist, finde den [mysqld] Bereich in deiner my.conf Datei und f\u00fcge diese Zeile hinzu: sql_mode = '' Starte MySQL dann neu und es sollte klappen. Option A: Der manuelle Installer # Besuche deine Webseite mit deinem Browser und befolge die Anleitung. Bevor du dies tust, kopiere die Datei .htaccess-dist nach .htaccess , wenn du den Apache Webserver verwendest. Bitte beachte jeden Fehler und korrigiere diese, bevor du fortf\u00e4hrst. Falls du einen Port f\u00fcr die Datenbankverbindung angeben musst, kannst du diesen in der Host-Eingabe Zeile angeben. Wenn die manuelle Installation aus irgendeinem Grund fehlschl\u00e4gt, dann pr\u00fcfe das Folgende: * config/local.config.php existiert ... wenn nicht, bearbeite die config/local-sample.config.php und \u00e4ndere die Systemeinstellungen. Benenne sie um in config/local.config.php . * die Datenbank beinhaltet Daten. ... wenn nicht, importiere den Inhalt der Datei database.sql mit phpmyadmin oder per mysql-Kommandozeile. Besuche deine Seite an diesem Punkt wieder und registriere deinen pers\u00f6nlichen Account. Alle Registrierungsprobleme sollten automatisch behebbar sein. Wenn du irgendwelche kritischen Fehler zu diesem Zeitpunkt erhalten solltest, deutet das darauf hin, dass die Datenbank nicht korrekt installiert wurde. Du kannst bei Bedarf die Datei config/local.config.php verschieben/umbenennen und die Datenbank leeren (als \u201eDropping\u201c bezeichnet), sodass du mit einem sauberen System neu starten kannst. Option B: Starte das automatische Installationsscript # Es existieren folgende Varianten zur automatischen Installation von Friendica: - Eine vorgefertigte Konfigurationsdatei erstellen (z.B. prepared.config.php ) - Verwendung von Umgebungsvariablen (z.B. MYSQL_HOST ) - Verwendung von Optionen (z.B. --dbhost <host> ) Umgebungsvariablen und Optionen k\u00f6nnen auch kombiniert werden. Dabei ist jedoch darauf zu achten, dass etwaige Optionen immer die zugeh\u00f6rigen Umgebungsvariablen \u00fcberschreiben. F\u00fcr mehr Informationen kannst du diese Option verwenden: bin/console autoinstall -v Falls du alle optionalen Checks ausf\u00fchren lassen m\u00f6chtest, benutze diese Option: bin/console autoinstall -a Wenn die automatisierte Installation aus irgendeinem Grund fehlschl\u00e4gt, dann pr\u00fcfe das Folgende: * Existiert die config/local.config.php ? Falls ja, wird die automatisierte Installation nicht gestartet. * Sind Einstellungen in der config/local.config.php korrekt? Falls nicht, bitte bearbeite diese Datei erneut. * Ist die leere MySQL-Datenbank erstellt? Falls nicht, erstelle diese. B.1: Konfigurationsdatei # F\u00fcr diese Variante muss ein Konfigurationsdatei bereits vor der Installation fertig definiert sein (z.B. local-sample.config.php . Gehe im Anschluss in den Friendica-Hauptordner und f\u00fchre den Kommandozeilen Befehl aus: bin/console autoinstall -f <prepared.config.php> B.2: Umgebungsvariablen # Es existieren Zwei Arten von Umgebungsvariablen in Friendica: - Jene, die auch im normalen Betrieb verwendet werden k\u00f6nnen (derzeit ausschlie\u00dflich Datenbank Einstellungen ) - Jene, die nur w\u00e4hrend der Installation verwendet werden k\u00f6nnen (im normalen Betrieb werden sie ignoriert) Umgebungsvariablen k\u00f6nnen auch durch ad\u00e4quate Optionen (z.B. --dbhost <hostname> )\u00fcbersteuert werden. Datenbank Einstellungen # Nur wenn die Option --savedb gesetzt ist, werden diese Umgebungsvariablen auch in config/local.config.php gespeichert! MYSQL_HOST Der Host der MySQL/MariaDB Datenbank MYSQL_PORT Der Port der MySQL/MariaDB Datenbank MYSQL_USERNAME Der Benutzername des MySQL Datenbanklogins (MySql - Variante) MYSQL_USER Der Benutzername des MariaDB Datenbanklogins (MariaDB-Variante) MYSQL_PASSWORD Das Passwort der MySQL/MariaDB Datenbanklogins MYSQL_DATABASE Der Name der MySQL/MariaDB Datenbank Friendica Einstellungen # Diese Umgebungsvariablen k\u00f6nnen nicht w\u00e4hrend des normalen Friendica Betriebs verwendet werden. Sie werden stattdessen direkt in config/local.config.php gespeichert. FRIENDICA_PHP_PATH Der Pfad zur PHP-Datei FRIENDICA_ADMIN_MAIL Die Admin E-Mail-Adresse dieses Friendica Knotens (wird auch f\u00fcr den Admin-Zugang ben\u00f6tigt) FRIENDICA_TZ Die Zeitzone von Friendica FRIENDICA_LANG Die Sprache von Friendica Gehe im Anschluss in den Friendica-Hauptordner und f\u00fchre den Kommandozeilen Befehl aus: bin/console autoinstall [ --savedb ] B.3: Optionen # Alle Optionen werden in config/local.config.php gespeichert und \u00fcberschreiben etwaige, zugeh\u00f6rige Umgebungsvariablen. -H|--dbhost <host> Der Host der MySQL/MariaDB Datenbank (env MYSQL_HOST ) -p|--dbport <port> Der Port der MySQL/MariaDB Datenbank (env MYSQL_PORT ) -U|--dbuser <username> Der Benutzername des MySQL/MariaDB Datenbanklogins (env MYSQL_USER or MYSQL_USERNAME ) -P|--dbpass <password> Das Passwort der MySQL/MariaDB Datenbanklogins (env MYSQL_PASSWORD ) -d|--dbdata <database> Der Name der MySQL/MariaDB Datenbank (env MYSQL_DATABASE ) -b|--phppath <path> Der Pfad zur PHP-Datei (env FRIENDICA_PHP_PATH ) -A|--admin <mail> Die Admin E-Mail Adresse dieses Friendica Knotens (env FRIENDICA_ADMIN_MAIL ) -T|--tz <timezone> Die Zeitzone von Friendica (env FRIENDICA_TZ ) -L|--lang <language> Die Sprache von Friendica (env FRIENDICA_LANG ) Gehe in den Friendica-Hauptordner und f\u00fchre den Kommandozeilen Befehl aus: bin/console autoinstall [ options ] Einen Worker einrichten # Erstelle einen Cron job oder einen regelm\u00e4\u00dfigen Task, um den Poller alle 5-10 Minuten im Hintergrund ablaufen zu lassen. Beispiel: cd /base/directory ; /path/to/php bin/worker.php \u00c4ndere /base/directory und /path/to/php auf deine Systemvorgaben. Wenn du einen Linux-Server nutzt, benutze den Befehl crontab -e und erg\u00e4nze eine Zeile wie die Folgende; angepasst an dein System */10 * * * * cd /home/myname/mywebsite; /usr/bin/php bin/worker.php Du kannst den PHP-Pfad finden, indem du den Befehl which php ausf\u00fchrst. Wenn du Schwierigkeiten mit diesem Schritt hast, kannst du deinen Hosting-Anbieter kontaktieren. Friendica wird nicht korrekt laufen, wenn dieser Schritt nicht erfolgreich abgeschlossen werden kann. Falls das Einrichten des cron nicht m\u00f6glich ist, kannst Du alternativ den \"frontend worker\" vom Administrationsinterface aus aktivieren. Erstelle einen Backup-Plan # Es werden schlimme Dinge geschehen. Sei es nun ein Hardwareversagen oder eine kaputte Datenbank. Deshalb solltest du dir, nachdem die Installation deines Friendica Knotens abgeschlossen ist, einen Backup-Plan erstellen. Die wichtigste Datei ist die config/local.config.php im Stammverzeichnis deiner Friendica Installation. Und da alle Daten in der Datenbank gespeichert werden, solltest du einen nicht allzu alten Dump der Friendica Datenbank zur Hand haben, solltest du deinen Knoten wieder herstellen m\u00fcssen.","title":"Installation"},{"location":"de/admin/install/#friendica-installation","text":"Wir haben hart daran gearbeitet, um Friendica auf vorgefertigten Hosting-Plattformen zum Laufen zu bringen - solche, auf denen auch Wordpress Blogs und Drupal-Installationen laufen. Wir bieten eine manuelle und eine automatische Installation an. Aber bedenke, dass Friendica mehr als eine einfache Webanwendung ist. Es handelt sich um ein komplexes Kommunikationssystem, das eher an einen E-Mail-Server erinnert als an einen Webserver. Um die Verf\u00fcgbarkeit und Performance zu gew\u00e4hrleisten, werden Nachrichten im Hintergrund verschickt und gespeichert, um sie sp\u00e4ter zu verschicken, wenn eine Webseite gerade nicht erreichbar ist. Diese Funktionalit\u00e4t ben\u00f6tigt ein wenig mehr als die normalen Blogs. Nicht jeder PHP/MySQL-Hosting-Anbieter kann Friendica unterst\u00fctzen. Viele hingegen k\u00f6nnen es. Aber bitte pr\u00fcfe die Voraussetzungen deines Servers vor der Installation. Wenn dir Fehler w\u00e4hrend der Installation auffallen, sag uns bitte \u00fcber Helper oder das Entwickler-Forum Bescheid oder erstelle ein Issue . Gib uns bitte so viele Informationen zu deinem System, wie du kannst, und beschreibe den Fehler mit allen Details und Fehlermeldungen, sodass wir den Fehler zuk\u00fcnftig verhindern k\u00f6nnen. Aufgrund der gro\u00dfen Anzahl an verschiedenen Betriebssystemen und PHP-Plattformen haben wir nur geringe Kapazit\u00e4ten, um deine PHP-Installation zu debuggen oder fehlende Module zu ersetzen, aber wir tun unser Bestes, um allgemeine Code-Fehler zu beheben. Bevor du anf\u00e4ngst: suche dir einen Domain- oder Subdomainnamen f\u00fcr deinen Server. Dinge ver\u00e4ndern sich und einige deiner Freunde haben m\u00f6glicherweise Probleme, mit dir zu kommunizieren. Wir planen, diese Einschr\u00e4nkung in einer zuk\u00fcnftigen Version zu beheben.","title":"Friendica Installation"},{"location":"de/admin/install/#anforderungen","text":"Apache mit einer aktiverten mod-rewrite-Funktion und dem Eintrag \"Options All\", so dass du die lokale .htaccess-Datei nutzen kannst PHP 7.3+ (PHP 8 wird noch nicht komplett unterst\u00fctzt) PHP Kommandozeilen -Zugang mit register_argc_argv auf \"true\" gesetzt in der php.ini-Datei Curl, GD, GMP, PDO, MySQLi, xml, zip und OpenSSL-Erweiterung Das POSIX Modul muss aktiviert sein ( CentOS, RHEL haben dies z.B. deaktiviert) Einen E-Mail Server, sodass PHP mail() funktioniert. Wenn kein eigener E-Mail-Server zur Verf\u00fcgung steht, kann alternativ das phpmailer Add-on mit einem externen SMTP Account verwendet werden. Mysql 5.6+ (oder eine \u00e4quivalente Alternative: MariaDB, Percona Server etc.) die M\u00f6glichkeit, wiederkehrende Aufgaben mit cron (Linux/Mac) oder \"Scheduled Tasks\" einzustellen (Windows) [Beachte: andere Optionen sind in Abschnitt 7 dieser Dokumentation zu finden] Installation in einer Top-Level-Domain oder Subdomain (ohne eine Verzeichnis/Pfad-Komponente in der URL) wird bevorzugt. Verzeichnispfade sind f\u00fcr diesen Zweck nicht so g\u00fcnstig und wurden auch nicht ausf\u00fchrlich getestet.","title":"Anforderungen"},{"location":"de/admin/install/#installation","text":"","title":"Installation"},{"location":"de/admin/install/#alternative-wege-um-friendica-zu-installieren","text":"Diese Anleitung wird dir Schritt-f\u00fcr-Schritt zeigen wie du Friendica auf deinem Server installieren kannst. Falls du an automatischen M\u00f6glichkeiten interesse hast, wirf doch einen Blick auf das Docker image f\u00fcr Friendica oder die Installation von Friendica auf YunoHost .","title":"Alternative Wege um Friendica zu Installieren"},{"location":"de/admin/install/#friendica","text":"Entpacke die Friendica-Daten in das Quellverzeichnis (root) des Dokumentenbereichs deines Webservers. Wenn du die M\u00f6glichkeit hierzu hast, empfehlen wir dir git zu nutzen, um die Daten direkt von der Quelle zu klonen, statt die gepackte .tar- oder .zip-Datei zu nutzen. Das macht die Aktualisierung wesentlich einfacher. Der Linux-Code, mit dem man die Dateien direkt in ein Verzeichnis wie \"meinewebseite\" kopiert, ist git clone https://github.com/friendica/friendica.git -b stable mywebsite cd mywebsite bin/composer.phar install Stelle sicher, dass der Ordner view/smarty3 existiert and von dem Webserver-Benutzer beschreibbar ist mkdir view/smarty3 chmod 775 view/smarty3 Falls Add-ons installiert werden sollen: Gehe in den Friendica-Ordner cd mywebsite Und die Addon Repository klonst: git clone https://github.com/friendica/friendica-addons.git -b stable addon Um das Addon-Verzeichnis aktuell zu halten, solltest du in diesem Pfad ein git pull -Befehl eintragen cd meinewebseite/addon git pull Wenn du den Verzeichnispfad auf deinen Webserver kopierst, dann stelle sicher, dass du auch die .htaccess kopierst, da \"Punkt\"-Dateien oft versteckt sind und normalerweise nicht direkt kopiert werden. Wenn du die Entwickler Version von Friendica verwenden m\u00f6chtest, kannst du auf den develop Branch im git Repository wechseln. Dies tust du mit den folgenden Befehlen git checkout develop bin/composer.phar install cd addon git checkout develop Die Entwickler Version kann nach einem fehlerhaften Commit vor\u00fcbergehend Probleme haben oder gar nicht mehr funktionieren. Sollte dir so etwas passieren, lass es uns bitte wissen, damit der Fehler behoben werden kann.","title":"Friendica"},{"location":"de/admin/install/#erstelle-eine-datenbank","text":"Erstelle eine leere Datenbank und notiere alle Zugangsdaten (Adresse der Datenbank, Nutzername, Passwort, Datenbankname). Friendica ben\u00f6tigt die Berechtigungen, um neue Felder in dieser Datenbank zu erstellen (create) und zu l\u00f6schen (delete). Mit neueren Versionen von MySQL (5.7.17+) musst du den sql_mode zu '' (blank) setzen. Benutze diese Einstellung, wenn der Installer nicht in der Lage ist, die Tabellen aufgrund eines Timestamp-Format-Problems zu erstellen. Falls dem so ist, finde den [mysqld] Bereich in deiner my.conf Datei und f\u00fcge diese Zeile hinzu: sql_mode = '' Starte MySQL dann neu und es sollte klappen.","title":"Erstelle eine Datenbank"},{"location":"de/admin/install/#option-a-der-manuelle-installer","text":"Besuche deine Webseite mit deinem Browser und befolge die Anleitung. Bevor du dies tust, kopiere die Datei .htaccess-dist nach .htaccess , wenn du den Apache Webserver verwendest. Bitte beachte jeden Fehler und korrigiere diese, bevor du fortf\u00e4hrst. Falls du einen Port f\u00fcr die Datenbankverbindung angeben musst, kannst du diesen in der Host-Eingabe Zeile angeben. Wenn die manuelle Installation aus irgendeinem Grund fehlschl\u00e4gt, dann pr\u00fcfe das Folgende: * config/local.config.php existiert ... wenn nicht, bearbeite die config/local-sample.config.php und \u00e4ndere die Systemeinstellungen. Benenne sie um in config/local.config.php . * die Datenbank beinhaltet Daten. ... wenn nicht, importiere den Inhalt der Datei database.sql mit phpmyadmin oder per mysql-Kommandozeile. Besuche deine Seite an diesem Punkt wieder und registriere deinen pers\u00f6nlichen Account. Alle Registrierungsprobleme sollten automatisch behebbar sein. Wenn du irgendwelche kritischen Fehler zu diesem Zeitpunkt erhalten solltest, deutet das darauf hin, dass die Datenbank nicht korrekt installiert wurde. Du kannst bei Bedarf die Datei config/local.config.php verschieben/umbenennen und die Datenbank leeren (als \u201eDropping\u201c bezeichnet), sodass du mit einem sauberen System neu starten kannst.","title":"Option A: Der manuelle Installer"},{"location":"de/admin/install/#option-b-starte-das-automatische-installationsscript","text":"Es existieren folgende Varianten zur automatischen Installation von Friendica: - Eine vorgefertigte Konfigurationsdatei erstellen (z.B. prepared.config.php ) - Verwendung von Umgebungsvariablen (z.B. MYSQL_HOST ) - Verwendung von Optionen (z.B. --dbhost <host> ) Umgebungsvariablen und Optionen k\u00f6nnen auch kombiniert werden. Dabei ist jedoch darauf zu achten, dass etwaige Optionen immer die zugeh\u00f6rigen Umgebungsvariablen \u00fcberschreiben. F\u00fcr mehr Informationen kannst du diese Option verwenden: bin/console autoinstall -v Falls du alle optionalen Checks ausf\u00fchren lassen m\u00f6chtest, benutze diese Option: bin/console autoinstall -a Wenn die automatisierte Installation aus irgendeinem Grund fehlschl\u00e4gt, dann pr\u00fcfe das Folgende: * Existiert die config/local.config.php ? Falls ja, wird die automatisierte Installation nicht gestartet. * Sind Einstellungen in der config/local.config.php korrekt? Falls nicht, bitte bearbeite diese Datei erneut. * Ist die leere MySQL-Datenbank erstellt? Falls nicht, erstelle diese.","title":"Option B: Starte das automatische Installationsscript"},{"location":"de/admin/install/#b1-konfigurationsdatei","text":"F\u00fcr diese Variante muss ein Konfigurationsdatei bereits vor der Installation fertig definiert sein (z.B. local-sample.config.php . Gehe im Anschluss in den Friendica-Hauptordner und f\u00fchre den Kommandozeilen Befehl aus: bin/console autoinstall -f <prepared.config.php>","title":"B.1: Konfigurationsdatei"},{"location":"de/admin/install/#b2-umgebungsvariablen","text":"Es existieren Zwei Arten von Umgebungsvariablen in Friendica: - Jene, die auch im normalen Betrieb verwendet werden k\u00f6nnen (derzeit ausschlie\u00dflich Datenbank Einstellungen ) - Jene, die nur w\u00e4hrend der Installation verwendet werden k\u00f6nnen (im normalen Betrieb werden sie ignoriert) Umgebungsvariablen k\u00f6nnen auch durch ad\u00e4quate Optionen (z.B. --dbhost <hostname> )\u00fcbersteuert werden.","title":"B.2: Umgebungsvariablen"},{"location":"de/admin/install/#datenbank-einstellungen","text":"Nur wenn die Option --savedb gesetzt ist, werden diese Umgebungsvariablen auch in config/local.config.php gespeichert! MYSQL_HOST Der Host der MySQL/MariaDB Datenbank MYSQL_PORT Der Port der MySQL/MariaDB Datenbank MYSQL_USERNAME Der Benutzername des MySQL Datenbanklogins (MySql - Variante) MYSQL_USER Der Benutzername des MariaDB Datenbanklogins (MariaDB-Variante) MYSQL_PASSWORD Das Passwort der MySQL/MariaDB Datenbanklogins MYSQL_DATABASE Der Name der MySQL/MariaDB Datenbank","title":"Datenbank Einstellungen"},{"location":"de/admin/install/#friendica-einstellungen","text":"Diese Umgebungsvariablen k\u00f6nnen nicht w\u00e4hrend des normalen Friendica Betriebs verwendet werden. Sie werden stattdessen direkt in config/local.config.php gespeichert. FRIENDICA_PHP_PATH Der Pfad zur PHP-Datei FRIENDICA_ADMIN_MAIL Die Admin E-Mail-Adresse dieses Friendica Knotens (wird auch f\u00fcr den Admin-Zugang ben\u00f6tigt) FRIENDICA_TZ Die Zeitzone von Friendica FRIENDICA_LANG Die Sprache von Friendica Gehe im Anschluss in den Friendica-Hauptordner und f\u00fchre den Kommandozeilen Befehl aus: bin/console autoinstall [ --savedb ]","title":"Friendica Einstellungen"},{"location":"de/admin/install/#b3-optionen","text":"Alle Optionen werden in config/local.config.php gespeichert und \u00fcberschreiben etwaige, zugeh\u00f6rige Umgebungsvariablen. -H|--dbhost <host> Der Host der MySQL/MariaDB Datenbank (env MYSQL_HOST ) -p|--dbport <port> Der Port der MySQL/MariaDB Datenbank (env MYSQL_PORT ) -U|--dbuser <username> Der Benutzername des MySQL/MariaDB Datenbanklogins (env MYSQL_USER or MYSQL_USERNAME ) -P|--dbpass <password> Das Passwort der MySQL/MariaDB Datenbanklogins (env MYSQL_PASSWORD ) -d|--dbdata <database> Der Name der MySQL/MariaDB Datenbank (env MYSQL_DATABASE ) -b|--phppath <path> Der Pfad zur PHP-Datei (env FRIENDICA_PHP_PATH ) -A|--admin <mail> Die Admin E-Mail Adresse dieses Friendica Knotens (env FRIENDICA_ADMIN_MAIL ) -T|--tz <timezone> Die Zeitzone von Friendica (env FRIENDICA_TZ ) -L|--lang <language> Die Sprache von Friendica (env FRIENDICA_LANG ) Gehe in den Friendica-Hauptordner und f\u00fchre den Kommandozeilen Befehl aus: bin/console autoinstall [ options ]","title":"B.3: Optionen"},{"location":"de/admin/install/#einen-worker-einrichten","text":"Erstelle einen Cron job oder einen regelm\u00e4\u00dfigen Task, um den Poller alle 5-10 Minuten im Hintergrund ablaufen zu lassen. Beispiel: cd /base/directory ; /path/to/php bin/worker.php \u00c4ndere /base/directory und /path/to/php auf deine Systemvorgaben. Wenn du einen Linux-Server nutzt, benutze den Befehl crontab -e und erg\u00e4nze eine Zeile wie die Folgende; angepasst an dein System */10 * * * * cd /home/myname/mywebsite; /usr/bin/php bin/worker.php Du kannst den PHP-Pfad finden, indem du den Befehl which php ausf\u00fchrst. Wenn du Schwierigkeiten mit diesem Schritt hast, kannst du deinen Hosting-Anbieter kontaktieren. Friendica wird nicht korrekt laufen, wenn dieser Schritt nicht erfolgreich abgeschlossen werden kann. Falls das Einrichten des cron nicht m\u00f6glich ist, kannst Du alternativ den \"frontend worker\" vom Administrationsinterface aus aktivieren.","title":"Einen Worker einrichten"},{"location":"de/admin/install/#erstelle-einen-backup-plan","text":"Es werden schlimme Dinge geschehen. Sei es nun ein Hardwareversagen oder eine kaputte Datenbank. Deshalb solltest du dir, nachdem die Installation deines Friendica Knotens abgeschlossen ist, einen Backup-Plan erstellen. Die wichtigste Datei ist die config/local.config.php im Stammverzeichnis deiner Friendica Installation. Und da alle Daten in der Datenbank gespeichert werden, solltest du einen nicht allzu alten Dump der Friendica Datenbank zur Hand haben, solltest du deinen Knoten wieder herstellen m\u00fcssen.","title":"Erstelle einen Backup-Plan"},{"location":"de/admin/settings/","tags":["admin","config"],"text":"Einstellungen # Wenn du der Administrator einer Friendica-Instanz bist, hast du Zugriff auf das sogenannte Adminpanel , in dem du die Friendica-Instanz konfigurieren kannst, Auf der Startseite des Adminpanels werden die Informationen zu der Instanz zusammengefasst. Die erste Zahl gibt die Anzahl von Nachrichten an, die nicht zugestellt werden konnten. Die Zustellung wird zu einem sp\u00e4teren Zeitpunkt noch einmal versucht. Unter dem Punkt \"Warteschlange Inspizieren\" kannst du einen schnellen Blick auf die zweite Warteschlange werfen. Die zweite Zahl steht f\u00fcr die Anzahl der Aufgaben, die die Worker noch vor sich haben. Die Worker arbeiten Hintergrundprozesse ab. Die Aufgaben der Worker sind priorisiert und werden anhand dieser Priorit\u00e4ten abgearbeitet. Des Weiteren findest du eine \u00dcbersicht \u00fcber die Accounts auf dem Friendica Knoten, die unter dem Punkt \"Nutzer\" moderiert werden k\u00f6nnen. Sowie eine Liste der derzeit aktivierten Add-ons. Diese Liste ist verlinkt, sodass du schnellen Zugriff auf die Informationsseiten der einzelnen Add-ons hast. Abschlie\u00dfend findest du auf der Startseite des Adminpanels die installierte Version von Friendica. Wenn du in Kontakt mit den Entwicklern trittst und Probleme oder Fehler zu schildern, gib diese Version bitte immer mit an. Die Unterabschnitte des Adminpanels kannst du in der Seitenleiste ausw\u00e4hlen. Seite # In diesem Bereich des Adminpanels findest du die Hauptkonfiguration deiner Friendica-Instanz. Er ist in mehrere Unterabschnitte aufgeteilt, wobei die Grundeinstellungen oben auf der Seite zu finden sind. Da die meisten Konfigurationsoptionen einen Hilfstext im Admin Panel haben, kann und will dieser Artikel nicht alle Einstellungen abdecken. Grundeinstellungen # Banner/Logo # Hiermit legst du das Banner der Seite fest. Standardm\u00e4\u00dfig ist das Friendica-Logo und der Name festgelegt. Du kannst hierf\u00fcr HTML/CSS nutzen, um den Inhalt zu gestalten und/oder die Position zu \u00e4ndern, wenn es nicht bereits voreingestellt ist. Systemsprache # Diese Einstellung legt die Standardsprache der Instanz fest. Sie wird verwendet, wenn es Friendica nicht gelingt die Spracheinstellungen des Besuchers zu erkennen oder diese nicht unterst\u00fctzt wird. Nutzer k\u00f6nnen diese Auswahl in den Einstellungen des Benutzerkontos \u00fcberschreiben. Die Friendica Gemeinschaft bietet einige \u00dcbersetzungen an, von denen einige mehr andere weniger komplett sind. Mehr Informationen zum \u00dcbersetzungsprozess von Friendica findest du auf dieser Seite der Dokumentation. Systemweites Theme # Hier kann das Theme bestimmt werden, welches standardm\u00e4\u00dfig zum Anzeigen der Seite verwendet werden soll. Nutzer k\u00f6nnen in ihren Einstellungen andere Themes w\u00e4hlen. Derzeit ist das \"vier\" Theme das vorausgew\u00e4hlte Theme. F\u00fcr mobile Ger\u00e4te kannst du ein spezielles Theme w\u00e4hlen, wenn das Standard-theme ungeeignet f\u00fcr mobile Ger\u00e4te sein sollte. Das vier Theme z.B. unterst\u00fctzt kleine Anzeigen und ben\u00f6tigt kein zus\u00e4tzliches mobiles Theme. Registrierung # Registrierungsmethode # Diese Einstellung regelt die Art der Registrierung. Dabei kannst du zwischen den folgenden Optionen w\u00e4hlen: Offen : Jeder kann ein neues Nutzerkonto anlegen und es sofort benutzen. Bedarf der Zustimmung : Jeder kann ein Nutzerkonto anlegen. Dieses muss allerdings durch den Admin freigeschaltet werden, bevor es verwendet werden kann. Geschlossen : Es k\u00f6nnen keine weiteren Nutzerkonten angelegt werden. Einladungen # Zus\u00e4tzlich zu den oben genannten M\u00f6glichkeiten kann die Registrierung eines neuen Nutzerkontos an eine Einladung durch einen bestehenden Nutzer gekoppelt werden. Hierzu muss in der config/local.config.php Datei die Option invitation_only aktiviert und als Registrierungsmethode entweder Offen oder Bedarf der Zustimmung gew\u00e4hlt werden. Namen auf Vollst\u00e4ndigkeit \u00fcberpr\u00fcfen # Es kann vorkommen, dass viele Spammer versuchen, sich auf deiner Seite zu registrieren. In Testphasen haben wir festgestellt, dass diese automatischen Registrierungen das Feld \"Vollst\u00e4ndiger Name\" oft nur mit Namen ausf\u00fcllen, die kein Leerzeichen beinhalten. Wenn du Leuten erlauben willst, sich nur mit einem Namen anzumelden, dann setze die Einstellung auf \"true\". Die Standardeinstellung ist auf \"false\" gesetzt. OpenID Unterst\u00fctzung # Standardm\u00e4\u00dfig wird OpenID f\u00fcr die Registrierung und f\u00fcr Logins genutzt. Wenn du nicht willst, dass OpenID-Strukturen f\u00fcr dein System \u00fcbernommen werden, dann setze \"no_openid\" auf \"true\". Standardm\u00e4\u00dfig ist hier \"false\" gesetzt. Unterbinde Mehrfachregistrierung # Um mehrfache Seiten zu erstellen, muss sich eine Person mehrfach registrieren k\u00f6nnen. Deine Seiteneinstellung kann Registrierungen komplett blockieren oder an Bedingungen kn\u00fcpfen. Standardm\u00e4\u00dfig k\u00f6nnen eingeloggte Nutzer weitere Accounts f\u00fcr die Seitenerstellung registrieren. Hier ist weiterhin eine Best\u00e4tigung notwendig, wenn \"REGISTER_APPROVE\" ausgew\u00e4hlt ist. Wenn du die Erstellung weiterer Accounts blockieren willst, dann setze die Einstellung \"block_extended_register\" auf \"true\". Standardm\u00e4\u00dfig ist hier \"false\" gesetzt. Datei hochladen # Datenspeicher Backend # Legt das Datenspeicher-Backend fest, mit dem Friendica hoch geladene Daten speichert. Zwei Speicher Backends sind standardm\u00e4\u00dfig bei Friendica verf\u00fcgbar: Database : Die Daten werden in einer speziellen Tabelle in der Datenbank ( storage ) gespeichert. Filesystem : Die Daten werden als Dateien im Dateisystem gespeichert. Weitere Speicher Backends k\u00f6nnen als Add-ons von Drittanbietern verf\u00fcgbar sein. Falls ein solches verwendet wird, sei an dieser Stelle nur auf deren Dokumentation f\u00fcr weitere Informationen verwiesen. Die Grundeinstellung ist 'Datenbank (legacy)': Dies ist die alte Methode von Friendica Daten direkt in der Datenbank abzulegen. Bestehende Daten k\u00f6nnen zum aktuell ausgew\u00e4hlten Backend verschoben werden. Hierf\u00fcr kann der 'storage move' Befehl der Friendica Konsole verwendet werden. Sollte das ausgew\u00e4hlte Speicher-Backand zus\u00e4tzliche Konfigurationsparameter besitzen, werden nach der Auswahl des Backends hier weitere Felder angezeigt. Dateipfad zum Speicher # Der Basispfad unter dem das Filesystem Datenspeicher Backend die Daten speichern soll. Um zu verhindern, dass Daten unter Umgehung der Privatsph\u00e4ren-Einstellungen heruntergeladen werden, sollte dieser Pfad au\u00dferhalb der Verzeichnisstruktur des Webservers liegen. Die Grundeinstellung ist storage , das ist das storage Unterverzeichnis innerhalb des Friendica Verzeichnisses. Maximale Bildgr\u00f6\u00dfe # Maximale Bild-Dateigr\u00f6\u00dfe in Byte. Standardm\u00e4\u00dfig ist 0 gesetzt, was bedeutet, dass kein Limit gesetzt ist. Regeln # URL des weltweiten Verzeichnisses # Mit diesem Befehl wird die URL eingestellt, die zum Update des globalen Verzeichnisses genutzt wird. Dieser Befehl ist in der Standardkonfiguration enthalten. Der nicht dokumentierte Teil dieser Einstellung ist, dass das globale Verzeichnis gar nicht verf\u00fcgbar ist, wenn diese Einstellung nicht gesetzt wird. Dies erlaubt eine private Kommunikation, die komplett vom globalen Verzeichnis isoliert ist. Erzwinge Ver\u00f6ffentlichung # Standardm\u00e4\u00dfig k\u00f6nnen Nutzer selbst ausw\u00e4hlen, ob ihr Profil im Seitenverzeichnis erscheint. Diese Einstellung zwingt alle Nutzer dazu, im Verzeichnis zu erscheinen. Diese Einstellung kann vom Nutzer nicht deaktiviert werden. Die Standardeinstellung steht auf \"false\". \u00d6ffentlichen Zugriff blockieren # Aktiviere diese Einstellung, um den \u00f6ffentlichen Zugriff auf alle Seiten zu sperren, solange man nicht eingeloggt ist. Das blockiert die Ansicht von Profilen, Freunden, Fotos, vom Verzeichnis und den Suchseiten. Ein Nebeneffekt ist, dass Eintr\u00e4ge dieser Seite nicht im globalen Verzeichnis erscheinen. Wir empfehlen, speziell diese Einstellung auszuschalten (die Einstellung ist an anderer Stelle auf dieser Seite erkl\u00e4rt). Beachte: Das ist speziell f\u00fcr Seiten, die beabsichtigen, von anderen Friendica-Netzwerken abgeschottet zu sein. Unautorisierte Personen haben ebenfalls nicht die M\u00f6glichkeit, Freundschaftsanfragen von Seitennutzern zu beantworten. Die Standardeinstellung ist deaktiviert. Verf\u00fcgbar in Version 2.2 und h\u00f6her. F\u00fcr Besucher verf\u00fcgbare Gemeinschaftsseiten # Die Gemeinschaftsseiten zeigen all \u00f6ffentlichen Beitr\u00e4ge. Es gibt zwei Gemeinschaftsseiten, eine lokale auf der die Beitr\u00e4ge der Nutzer des Knotens gesammelt werden und eine globale auf der alle bekannten Beitr\u00e4ge aus dem gesamten Netzwerk erscheinen. Mit dieser Einstellung kann geregelt werden, welche dieser beiden Seiten Besucher aufrufen k\u00f6nnen. Angemeldete Nutzer des Knotens k\u00f6nnen grunds\u00e4tzlich beide Seiten verwenden. Hinweis : Einige Einstellungen, wie z.B. das Verbergen von Kontakten auf der Profilseite, k\u00f6nnen die Sichtbarkeit der Beitr\u00e4ge auf der Gemeinschaftsseiten beeinflussen. Erlaubte Domains f\u00fcr Kontakte # Kommagetrennte Liste von Domains, welche eine Freundschaft mit dieser Seite eingehen d\u00fcrfen. Wildcards werden akzeptiert Standardm\u00e4\u00dfig sind alle g\u00fcltigen Domains erlaubt. Mit dieser Option kann man einfach geschlossene Netzwerke, z.B. im schulischen Bereich aufbauen, aus denen nicht mit dem Rest des Netzwerks kommuniziert werden soll. Erlaubte Domains f\u00fcr E-Mails # Kommagetrennte Liste von Domains, welche bei der Registrierung als Part der E-Mail-Adresse erlaubt sind. Das grenzt Leute aus, die nicht Teil der Gruppe oder Organisation sind. Wildcards werden akzeptiert Standardm\u00e4\u00dfig sind alle g\u00fcltigen E-Mail-Adressen erlaubt. Nutzern erlauben das remote_self Flag zu setzen # Webb du die Option Nutzern erlauben das remote_self Flag zu setzen aktivierst, k\u00f6nnen alle Nutzer Atom Feeds in den Kontakteinstellungen als \"Entferntes Konto\" markieren. Dadurch werden automatisch alle Beitr\u00e4ge dieser Feeds f\u00fcr diesen Nutzer gespiegelt und an die Kontakte bei Friendica verteilt. Dieses Feature kann z.B. daf\u00fcr genutzt werden Blogbeitr\u00e4ge zu spiegeln. In der Grundeinstellung ist es nicht aktiviert, da es zus\u00e4tzliche Last auf dem Server verursachen kann. Au\u00dferdem k\u00f6nnte es durch Nutzer als Spam Verteiler missbraucht werden. Als Administrator der Friendica-Instanz kannst du diese Einstellungen ansonsten nur direkt in der Datenbank vornehmen. Bevor du das machst, solltest du sicherstellen, dass du ein Backup der Datenbank hast und genau wei\u00dft was die \u00c4nderungen an der Datenbank bewirken, die du vornehmen willst. Explizite Inhalte # Wenn Sie einen Knoten mit explizitem, nicht jugendfreien Inhalt betreiben, k\u00f6nnen Sie dies mit dieser Option ank\u00fcndigen. Ist diese Option aktiviert, wird ein Informationsflag in den ver\u00f6ffentlichten Informationen zu Ihrem Knoten gesetzt. (Sollte Server Informationen ver\u00f6ffentlichen aktiviert sein.) Zus\u00e4tzlich wird auf der Registrierungsseite f\u00fcr neue Benutzer ein Hinweis angezeigt. Erweitert # Proxy Einstellungen # Wenn deine Seite eine Proxy-Einstellung nutzt, musst du diese Einstellungen vornehmen, um mit anderen Seiten im Internet zu kommunizieren. Netzwerk Wartezeit # Legt fest, wie lange das Netzwerk warten soll, bevor ein Timeout eintritt. Der Wert wird in Sekunden angegeben. Standardm\u00e4\u00dfig ist 60 eingestellt; 0 steht f\u00fcr \"unbegrenzt\" (nicht empfohlen). UTF-8 Regul\u00e4re Ausdr\u00fccke # W\u00e4hrend der Registrierung werden die Namen daraufhin gepr\u00fcft, ob sie regul\u00e4re UTF-8-Ausdr\u00fccke nutzen. Hierf\u00fcr wird PHP ben\u00f6tigt, um mit einer speziellen Einstellung kompiliert zu werden, die UTF-8-Ausdr\u00fccke benutzt. Wenn du absolut keine M\u00f6glichkeit hast, Accounts zu registrieren, setze diesen Wert auf ja. SSL \u00dcberpr\u00fcfen # Standardm\u00e4\u00dfig erlaubt Friendica SSL-Kommunikation von Seiten, die \"selbst unterzeichnete\" SSL-Zertifikate nutzen. Um eine weitreichende Kompatibilit\u00e4t mit anderen Netzwerken und Browsern zu gew\u00e4hrleisten, empfehlen wir, selbst unterzeichnete Zertifikate nicht zu nutzen. Aber wir halten dich nicht davon ab, solche zu nutzen. SSL verschl\u00fcsselt alle Daten zwischen den Webseiten (und f\u00fcr deinen Browser), was dir eine komplett verschl\u00fcsselte Kommunikation erlaubt. Auch sch\u00fctzt es deine Login-Daten vor Datendiebstahl. Selbst unterzeichnete Zertifikate k\u00f6nnen kostenlos erstellt werden. Diese Zertifikate k\u00f6nnen allerdings Opfer eines sogenannten \"man-in-the-middle\"-Angriffs werden, und sind daher weniger bevorzugt. Wenn du es w\u00fcnscht, kannst du eine strikte Zertifikatabfrage einstellen. Das f\u00fchrt dazu, dass du keinerlei Verbindung zu einer selbst unterzeichneten SSL-Seite erstellen kannst Automatisch ein Kontaktverzeichnis erstellen # Performance # Worker # In diesem Abschnitt kann der Hintergrund-Prozess konfiguriert werden. Bevor ein neuer Worker Prozess gestartet wird, \u00fcberpr\u00fcft das System, dass die vorhandenen Resource ausreichend sind. Aus diesem Grund kann es sein, dass die maximale Zahl der Hintergrundprozesse nicht erreicht wird. Die Aufgaben, die im Hintergrund erledigt werden, haben Priorit\u00e4ten zugeteilt. Um garantieren zu k\u00f6nnen, dass wichtige Prozesse schnellstm\u00f6glich abgearbeitet werden k\u00f6nnen, selbst wenn das System gerade stark belastet ist, sollte die fastlane aktiviert sein. Umsiedeln # Nutzer # In diesem Abschnitt des Adminpanels kannst du die Nutzer deiner Friendica-Instanz moderieren. Solltest du f\u00fcr Registrierungsmethode die Einstellung \"Bedarf Zustimmung\" gew\u00e4hlt haben, werden hier zu Beginn der Seite neue Registrationen aufgelistet. Als Administrator kannst du hier die Registration akzeptieren oder ablehnen. Unter dem Abschnitt mit den Registrationen werden die aktuell auf der Instanz registrierten Nutzer aufgelistet. Die Liste kann nach Namen, E-Mail-Adresse, Datum der Registration, der letzten Anmeldung oder dem letzten Beitrag und dem Account Typ sortiert werden. An dieser Stelle kannst du existierende Accounts vom Zugriff auf die Instanz blockieren, sie wieder freigeben oder Accounts endg\u00fcltig l\u00f6schen. Im letzten Bereich auf der Seite kannst du als Administrator neue Accounts anlegen. Das Passwort f\u00fcr so eingerichtete Accounts werden per E-Mail an die Nutzer geschickt. Addons # Dieser Bereich des Adminpanels dient der Auswahl und Konfiguration der Erweiterungen von Friendica. Sie m\u00fcssen in das /addon Verzeichnis kopiert werden. Auf der Seite wird eine Liste der verf\u00fcgbaren Erweiterungen angezeigt. Neben den Namen der Erweiterungen wird ein Indikator angezeigt, der anzeigt, ob das Add-on gerade aktiviert ist oder nicht. Wenn du die Erweiterungen aktualisiert, die du auf deiner Friendica-Instanz nutzt, k\u00f6nnte es sein, dass sie neu geladen werden m\u00fcssen, damit die \u00c4nderungen aktiviert werden. Um diesen Prozess zu vereinfachen, gibt es am Anfang der Seite einen Button um alle aktiven Add-ons neu zu laden. Themen # Der Bereich zur Kontrolle der auf der Friendica-Instanz verf\u00fcgbaren Themen funktioniert analog zum Add-ons Bereich. Jedes Theme hat eine extra Seite auf der aktuelle Status, ein Bildschirmfoto des Themes, zus\u00e4tzliche Informationen und eventuelle Einstellungen des Themes zu finden sind. Genau wie Erweiterungen k\u00f6nnen Themes in der \u00dcbersichtsliste oder der Theme-Seite aktiviert bzw. deaktiviert werden. Um ein Standard-theme f\u00fcr die Instanz zu w\u00e4hlen, benutze bitte die Seiten Bereich des Adminpanels. Zus\u00e4tzliche Features # Es gibt einige optionale Features in Friendica, die Nutzer benutzen k\u00f6nnen oder halt nicht. Zum Beispiel den dislike Button oder den Webeditor beim Erstellen von neuen Beitr\u00e4gen. In diesem Bereich des Adminpanels kannst du die Grundeinstellungen f\u00fcr diese Features festlegen und gegebenenfalls die Entscheidung treffen, dass Nutzer deiner Instanz diese auch nicht mehr \u00e4ndern k\u00f6nnen. DB Updates # Wenn sich die Datenbankstruktur Friendicas \u00e4ndert, werden die \u00c4nderungen automatisch angewandt. Solltest du den Verdacht haben, dass eine Aktualisierung fehlgeschlagen ist, kannst du in diesem Bereich des Adminpanels den Status der Aktualisierungen \u00fcberpr\u00fcfen. Warteschlange Inspizieren # Auf der Eingangsseite des Adminpanels werden zwei Zahlen fpr die Warteschlangen angegeben. Die zweite Zahl steht f\u00fcr die Beitr\u00e4ge, die initial nicht zugestellt werden konnten und sp\u00e4ter nochmal zugestellt werden sollen. Sollte diese Zahl durch die Decke brechen, solltest du nachsehen an welchen Kontakt die Zustellung der Beitr\u00e4ge nicht funktioniert. Unter dem Men\u00fcpunkt \"Warteschlange Inspizieren\" findest du eine Liste dieser nicht zustellbaren Beitr\u00e4ge. Diese Liste ist nach dem Empf\u00e4nger sortiert. Die Kommunikation zu dem Empf\u00e4nger kann aus unterschiedlichen Gr\u00fcnden gest\u00f6rt sein. Der andere Server k\u00f6nnte offline sein, oder gerade einfach nur eine hohe Systemlast aufweisen. Aber keine Panik! Friendica wird die Beitr\u00e4ge nicht f\u00fcr alle Zeiten in der Warteschlange behalten. Nach einiger Zeit werden Knoten als inaktiv identifiziert und Nachrichten an Nutzer dieser Knoten aus der Warteschlange gel\u00f6scht. Server Blockliste # Auf dieser Seite des Adminpanels k\u00f6nnen Administratoren einer Friendica-Instanz die komplette Kommunikation (eingehend und ausgehend) mit bestimmten Domains unterbinden. F\u00fcr jede dieser Blockierungen muss ein Grund angegeben werden, welcher auf der Informationsseite https://your-site.info/friendica angezeigt wird. Der Abgleich der Domainnamen ist exakt, Subdomains werden nicht automatisch ebenfalls blockiert. Federation Statistik # Deine Instanz ist ein Teil eines Netzwerks von Servern dezentraler sozialer Netzwerke, der sogenannten Federation . In diesem Bereich des Adminpanels findest du ein paar Zahlen zu dem Teil der Federation, die deine Instanz kennt. Eintrag l\u00f6schen # Hier kann man als Admin einer Friendica Instanz Beitr\u00e4ge und ggf. damit gekoppelte Unterhaltungen von der Instanz l\u00f6schen. Dazu muss man nur die GUID des Beitrags kennen. Diese kann u.a. in der Adresse der /display -Seite gefunden werden, wenn man dem Link zum Originalbeitrag folgt. Hier ist die GUID der letzte Teil der URL in der Adresszeile des Browsers. Addon Features # Einige der Erweiterungen von Friendica ben\u00f6tigen global g\u00fcltige Einstellungen, die der Administrator vornehmen muss. Diese Erweiterungen sind hier aufgelistet, damit du die Einstellungen schneller findest. Protokolle # Dieser Bereich des Adminpanels ist auf zwei Seiten verteilt. Die eine Seite dient der Konfiguration, die andere dem Anzeigen der Logs. Du solltest die Logdatei nicht in einem Verzeichnis anlegen, auf das man vom Internet aus zugreifen kann. Wenn du das dennoch tun musste und die Standardeinstellungen des Apache Servers verwendest, dann solltest du darauf achten, dass die Logdateien mit der Endung .log oder .out enden. Solltest du einen anderen Webserver verwenden, solltest du sicherstellen, dass der Zugriff zu Dateien mit diesen Endungen nicht m\u00f6glich ist. Es gibt f\u00fcnf Level der Ausf\u00fchrlichkeit, mit denen Friendica arbeitet: Normal, Trace, Debug, Data und All. Normalerweise solltest du f\u00fcr den Betrieb deiner Friendica-Instanz keine Logs ben\u00f6tigen. Wenn du versuchst einem Problem auf den Grund zu gehen, solltest du das \"DEBUG\" Level w\u00e4hlen. Mit dem \"All\" Level schreibt Friendica alles in die Logdatei. Die Datenmenge der geloggten Daten kann relativ schnell anwachsen, deshalb empfehlen wir das Anlegen von Protokollen nur zu aktivieren, wenn es unbedingt n\u00f6tig ist. Die Gr\u00f6\u00dfe der Logdateien kann schnell anwachsen . Du solltest deshalb einen Dienst zur log rotation einrichten. Bekannte Probleme : Der Dateiname friendica.log kann bei speziellen Server Konfigurationen zu Problemen f\u00fchren (siehe issue 2209 ). Normalerweise werden Fehler- und Warnmeldungen von PHP unterdr\u00fcckt. Wenn du sie aktivieren willst, musst du folgendes in der config/local.config.php Datei eintragen um die Meldungen in die Datei php.out zu speichern <?php error_reporting ( E_ERROR | E_WARNING | E_PARSE ); ini_set ( 'error_log' , 'php.out' ); ini_set ( 'log_errors' , '1' ); ini_set ( 'display_errors' , '0' ); Die Datei php.out muss vom Webserver schreibbar sein und sollte ebenfalls au\u00dferhalb der Webverzeichnisse liegen. Es kommt gelegentlich vor, dass nicht deklarierte Variablen referenziert werden, deshalb raten wir davon ab E_NOTICE oder E_ALL zu verwenden. Die \u00fcberwiegende Mehrzahl der auf diesen Stufen dokumentierten Fehler sind absolut harmlos. Solltest du mit den oben empfohlenen Einstellungen Fehler finden, teile sie bitte den Entwicklern mit. Im Allgemeinen sind dies Fehler, die behoben werden sollten. Solltest du eine leere (wei\u00dfe) Seite vorfinden, w\u00e4hrend du Friendica nutzt, werfe bitte einen Blick in die PHP Logs. Solche White Screens sind so gut wie immer ein Zeichen daf\u00fcr, dass ein Fehler aufgetreten ist. Diagnose # In diesem Bereich des Adminpanels findest du zwei Werkzeuge, mit der du untersuchen kannst, wie Friendica bestimmte Ressourcen einsch\u00e4tzt. Diese Werkzeuge sind insbesondere bei der Analyse von Kommunikationsproblemen hilfreich. \"Adresse untersuchen\" zeigt Informationen zu einer URL an, wie Friendica sie wahrnimmt. Mit dem zweiten Werkzeug \"Webfinger \u00fcberpr\u00fcfen\" kannst du Informationen zu einem Ding anfordern, das \u00fcber einen Webfinger (jemand@example.com) identifiziert wird. Die Ausnahmen der Regel # F\u00fcr die oben genannte Regel gibt es vier Ausnahmen, deren Konfiguration nicht \u00fcber das Adminpanel vorgenommen werden kann. Dies sind die Datenbank Einstellungen, die Administrator Accounts, der PHP Pfad und die Konfiguration einer eventuellen Installation in ein Unterverzeichnis unterhalb der Hauptdomain. Datenbank Einstellungen # Mit den folgenden Einstellungen kannst du die Zugriffsdaten f\u00fcr den Datenbankserver festlegen. 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'mysqldatabasename', 'charset' => 'utf8mb4', ], Sollten alle der folgenden Environment-Variablen gesetzt sein, wird Friendica diese anstatt der vorher konfigurierten Werte nutzen. MYSQL_HOST MYSQL_PORT MYSQL_USERNAME MYSQL_PASSWORD MYSQL_DATABASE Administratoren # Du kannst einen, oder mehrere Accounts, zu Administratoren machen. Normalerweise trifft dies auf den ersten Account zu, der nach der Installation angelegt wird. Die Liste der E-Mail-Adressen kann aber einfach erweitert werden. Mit keiner der angegebenen E-Mail-Adressen k\u00f6nnen weitere Accounts registriert werden. 'config' => [ 'admin_email' => 'you@example.com, buddy@example.com', ], PHP Pfad # Einige Prozesse von Friendica laufen im Hintergrund. F\u00fcr diese Prozesse muss der Pfad zu der PHP Version gesetzt sein, die verwendet werden soll. 'config' => [ 'php_path' => '/usr/bin/php', ], Unterverzeichnis Konfiguration # Man kann Friendica in ein Unterverzeichnis des Webservers installieren. Wir raten allerdings dringen davon ab, da es die Interoperabilit\u00e4t mit anderen Netzwerken (z.B. Diaspora, GNU Social, Hubzilla) verhindert. Mal angenommen, du hast ein Unterverzeichnis tests und willst Friendica in ein weiteres Unterverzeichnis installieren, dann lautet die Konfiguration hierf\u00fcr: 'system' => [ 'urlpath' => 'tests/friendica', ], Weitere Ausnahmen # Es gibt noch einige experimentelle Einstellungen, die nur in der config/local.config.php Datei konfiguriert werden k\u00f6nnen. Im Konfigurationswerte, die nur in der config/local.config.php gesetzt werden k\u00f6nnen (EN) Artikel kannst du mehr dar\u00fcber erfahren.","title":"Einstellungen"},{"location":"de/admin/settings/#einstellungen","text":"Wenn du der Administrator einer Friendica-Instanz bist, hast du Zugriff auf das sogenannte Adminpanel , in dem du die Friendica-Instanz konfigurieren kannst, Auf der Startseite des Adminpanels werden die Informationen zu der Instanz zusammengefasst. Die erste Zahl gibt die Anzahl von Nachrichten an, die nicht zugestellt werden konnten. Die Zustellung wird zu einem sp\u00e4teren Zeitpunkt noch einmal versucht. Unter dem Punkt \"Warteschlange Inspizieren\" kannst du einen schnellen Blick auf die zweite Warteschlange werfen. Die zweite Zahl steht f\u00fcr die Anzahl der Aufgaben, die die Worker noch vor sich haben. Die Worker arbeiten Hintergrundprozesse ab. Die Aufgaben der Worker sind priorisiert und werden anhand dieser Priorit\u00e4ten abgearbeitet. Des Weiteren findest du eine \u00dcbersicht \u00fcber die Accounts auf dem Friendica Knoten, die unter dem Punkt \"Nutzer\" moderiert werden k\u00f6nnen. Sowie eine Liste der derzeit aktivierten Add-ons. Diese Liste ist verlinkt, sodass du schnellen Zugriff auf die Informationsseiten der einzelnen Add-ons hast. Abschlie\u00dfend findest du auf der Startseite des Adminpanels die installierte Version von Friendica. Wenn du in Kontakt mit den Entwicklern trittst und Probleme oder Fehler zu schildern, gib diese Version bitte immer mit an. Die Unterabschnitte des Adminpanels kannst du in der Seitenleiste ausw\u00e4hlen.","title":"Einstellungen"},{"location":"de/admin/settings/#seite","text":"In diesem Bereich des Adminpanels findest du die Hauptkonfiguration deiner Friendica-Instanz. Er ist in mehrere Unterabschnitte aufgeteilt, wobei die Grundeinstellungen oben auf der Seite zu finden sind. Da die meisten Konfigurationsoptionen einen Hilfstext im Admin Panel haben, kann und will dieser Artikel nicht alle Einstellungen abdecken.","title":"Seite"},{"location":"de/admin/settings/#grundeinstellungen","text":"","title":"Grundeinstellungen"},{"location":"de/admin/settings/#bannerlogo","text":"Hiermit legst du das Banner der Seite fest. Standardm\u00e4\u00dfig ist das Friendica-Logo und der Name festgelegt. Du kannst hierf\u00fcr HTML/CSS nutzen, um den Inhalt zu gestalten und/oder die Position zu \u00e4ndern, wenn es nicht bereits voreingestellt ist.","title":"Banner/Logo"},{"location":"de/admin/settings/#systemsprache","text":"Diese Einstellung legt die Standardsprache der Instanz fest. Sie wird verwendet, wenn es Friendica nicht gelingt die Spracheinstellungen des Besuchers zu erkennen oder diese nicht unterst\u00fctzt wird. Nutzer k\u00f6nnen diese Auswahl in den Einstellungen des Benutzerkontos \u00fcberschreiben. Die Friendica Gemeinschaft bietet einige \u00dcbersetzungen an, von denen einige mehr andere weniger komplett sind. Mehr Informationen zum \u00dcbersetzungsprozess von Friendica findest du auf dieser Seite der Dokumentation.","title":"Systemsprache"},{"location":"de/admin/settings/#systemweites-theme","text":"Hier kann das Theme bestimmt werden, welches standardm\u00e4\u00dfig zum Anzeigen der Seite verwendet werden soll. Nutzer k\u00f6nnen in ihren Einstellungen andere Themes w\u00e4hlen. Derzeit ist das \"vier\" Theme das vorausgew\u00e4hlte Theme. F\u00fcr mobile Ger\u00e4te kannst du ein spezielles Theme w\u00e4hlen, wenn das Standard-theme ungeeignet f\u00fcr mobile Ger\u00e4te sein sollte. Das vier Theme z.B. unterst\u00fctzt kleine Anzeigen und ben\u00f6tigt kein zus\u00e4tzliches mobiles Theme.","title":"Systemweites Theme"},{"location":"de/admin/settings/#registrierung","text":"","title":"Registrierung"},{"location":"de/admin/settings/#registrierungsmethode","text":"Diese Einstellung regelt die Art der Registrierung. Dabei kannst du zwischen den folgenden Optionen w\u00e4hlen: Offen : Jeder kann ein neues Nutzerkonto anlegen und es sofort benutzen. Bedarf der Zustimmung : Jeder kann ein Nutzerkonto anlegen. Dieses muss allerdings durch den Admin freigeschaltet werden, bevor es verwendet werden kann. Geschlossen : Es k\u00f6nnen keine weiteren Nutzerkonten angelegt werden.","title":"Registrierungsmethode"},{"location":"de/admin/settings/#einladungen","text":"Zus\u00e4tzlich zu den oben genannten M\u00f6glichkeiten kann die Registrierung eines neuen Nutzerkontos an eine Einladung durch einen bestehenden Nutzer gekoppelt werden. Hierzu muss in der config/local.config.php Datei die Option invitation_only aktiviert und als Registrierungsmethode entweder Offen oder Bedarf der Zustimmung gew\u00e4hlt werden.","title":"Einladungen"},{"location":"de/admin/settings/#namen-auf-vollstandigkeit-uberprufen","text":"Es kann vorkommen, dass viele Spammer versuchen, sich auf deiner Seite zu registrieren. In Testphasen haben wir festgestellt, dass diese automatischen Registrierungen das Feld \"Vollst\u00e4ndiger Name\" oft nur mit Namen ausf\u00fcllen, die kein Leerzeichen beinhalten. Wenn du Leuten erlauben willst, sich nur mit einem Namen anzumelden, dann setze die Einstellung auf \"true\". Die Standardeinstellung ist auf \"false\" gesetzt.","title":"Namen auf Vollst\u00e4ndigkeit \u00fcberpr\u00fcfen"},{"location":"de/admin/settings/#openid-unterstutzung","text":"Standardm\u00e4\u00dfig wird OpenID f\u00fcr die Registrierung und f\u00fcr Logins genutzt. Wenn du nicht willst, dass OpenID-Strukturen f\u00fcr dein System \u00fcbernommen werden, dann setze \"no_openid\" auf \"true\". Standardm\u00e4\u00dfig ist hier \"false\" gesetzt.","title":"OpenID Unterst\u00fctzung"},{"location":"de/admin/settings/#unterbinde-mehrfachregistrierung","text":"Um mehrfache Seiten zu erstellen, muss sich eine Person mehrfach registrieren k\u00f6nnen. Deine Seiteneinstellung kann Registrierungen komplett blockieren oder an Bedingungen kn\u00fcpfen. Standardm\u00e4\u00dfig k\u00f6nnen eingeloggte Nutzer weitere Accounts f\u00fcr die Seitenerstellung registrieren. Hier ist weiterhin eine Best\u00e4tigung notwendig, wenn \"REGISTER_APPROVE\" ausgew\u00e4hlt ist. Wenn du die Erstellung weiterer Accounts blockieren willst, dann setze die Einstellung \"block_extended_register\" auf \"true\". Standardm\u00e4\u00dfig ist hier \"false\" gesetzt.","title":"Unterbinde Mehrfachregistrierung"},{"location":"de/admin/settings/#datei-hochladen","text":"","title":"Datei hochladen"},{"location":"de/admin/settings/#datenspeicher-backend","text":"Legt das Datenspeicher-Backend fest, mit dem Friendica hoch geladene Daten speichert. Zwei Speicher Backends sind standardm\u00e4\u00dfig bei Friendica verf\u00fcgbar: Database : Die Daten werden in einer speziellen Tabelle in der Datenbank ( storage ) gespeichert. Filesystem : Die Daten werden als Dateien im Dateisystem gespeichert. Weitere Speicher Backends k\u00f6nnen als Add-ons von Drittanbietern verf\u00fcgbar sein. Falls ein solches verwendet wird, sei an dieser Stelle nur auf deren Dokumentation f\u00fcr weitere Informationen verwiesen. Die Grundeinstellung ist 'Datenbank (legacy)': Dies ist die alte Methode von Friendica Daten direkt in der Datenbank abzulegen. Bestehende Daten k\u00f6nnen zum aktuell ausgew\u00e4hlten Backend verschoben werden. Hierf\u00fcr kann der 'storage move' Befehl der Friendica Konsole verwendet werden. Sollte das ausgew\u00e4hlte Speicher-Backand zus\u00e4tzliche Konfigurationsparameter besitzen, werden nach der Auswahl des Backends hier weitere Felder angezeigt.","title":"Datenspeicher Backend"},{"location":"de/admin/settings/#dateipfad-zum-speicher","text":"Der Basispfad unter dem das Filesystem Datenspeicher Backend die Daten speichern soll. Um zu verhindern, dass Daten unter Umgehung der Privatsph\u00e4ren-Einstellungen heruntergeladen werden, sollte dieser Pfad au\u00dferhalb der Verzeichnisstruktur des Webservers liegen. Die Grundeinstellung ist storage , das ist das storage Unterverzeichnis innerhalb des Friendica Verzeichnisses.","title":"Dateipfad zum Speicher"},{"location":"de/admin/settings/#maximale-bildgroe","text":"Maximale Bild-Dateigr\u00f6\u00dfe in Byte. Standardm\u00e4\u00dfig ist 0 gesetzt, was bedeutet, dass kein Limit gesetzt ist.","title":"Maximale Bildgr\u00f6\u00dfe"},{"location":"de/admin/settings/#regeln","text":"","title":"Regeln"},{"location":"de/admin/settings/#url-des-weltweiten-verzeichnisses","text":"Mit diesem Befehl wird die URL eingestellt, die zum Update des globalen Verzeichnisses genutzt wird. Dieser Befehl ist in der Standardkonfiguration enthalten. Der nicht dokumentierte Teil dieser Einstellung ist, dass das globale Verzeichnis gar nicht verf\u00fcgbar ist, wenn diese Einstellung nicht gesetzt wird. Dies erlaubt eine private Kommunikation, die komplett vom globalen Verzeichnis isoliert ist.","title":"URL des weltweiten Verzeichnisses"},{"location":"de/admin/settings/#erzwinge-veroffentlichung","text":"Standardm\u00e4\u00dfig k\u00f6nnen Nutzer selbst ausw\u00e4hlen, ob ihr Profil im Seitenverzeichnis erscheint. Diese Einstellung zwingt alle Nutzer dazu, im Verzeichnis zu erscheinen. Diese Einstellung kann vom Nutzer nicht deaktiviert werden. Die Standardeinstellung steht auf \"false\".","title":"Erzwinge Ver\u00f6ffentlichung"},{"location":"de/admin/settings/#offentlichen-zugriff-blockieren","text":"Aktiviere diese Einstellung, um den \u00f6ffentlichen Zugriff auf alle Seiten zu sperren, solange man nicht eingeloggt ist. Das blockiert die Ansicht von Profilen, Freunden, Fotos, vom Verzeichnis und den Suchseiten. Ein Nebeneffekt ist, dass Eintr\u00e4ge dieser Seite nicht im globalen Verzeichnis erscheinen. Wir empfehlen, speziell diese Einstellung auszuschalten (die Einstellung ist an anderer Stelle auf dieser Seite erkl\u00e4rt). Beachte: Das ist speziell f\u00fcr Seiten, die beabsichtigen, von anderen Friendica-Netzwerken abgeschottet zu sein. Unautorisierte Personen haben ebenfalls nicht die M\u00f6glichkeit, Freundschaftsanfragen von Seitennutzern zu beantworten. Die Standardeinstellung ist deaktiviert. Verf\u00fcgbar in Version 2.2 und h\u00f6her.","title":"\u00d6ffentlichen Zugriff blockieren"},{"location":"de/admin/settings/#fur-besucher-verfugbare-gemeinschaftsseiten","text":"Die Gemeinschaftsseiten zeigen all \u00f6ffentlichen Beitr\u00e4ge. Es gibt zwei Gemeinschaftsseiten, eine lokale auf der die Beitr\u00e4ge der Nutzer des Knotens gesammelt werden und eine globale auf der alle bekannten Beitr\u00e4ge aus dem gesamten Netzwerk erscheinen. Mit dieser Einstellung kann geregelt werden, welche dieser beiden Seiten Besucher aufrufen k\u00f6nnen. Angemeldete Nutzer des Knotens k\u00f6nnen grunds\u00e4tzlich beide Seiten verwenden. Hinweis : Einige Einstellungen, wie z.B. das Verbergen von Kontakten auf der Profilseite, k\u00f6nnen die Sichtbarkeit der Beitr\u00e4ge auf der Gemeinschaftsseiten beeinflussen.","title":"F\u00fcr Besucher verf\u00fcgbare Gemeinschaftsseiten"},{"location":"de/admin/settings/#erlaubte-domains-fur-kontakte","text":"Kommagetrennte Liste von Domains, welche eine Freundschaft mit dieser Seite eingehen d\u00fcrfen. Wildcards werden akzeptiert Standardm\u00e4\u00dfig sind alle g\u00fcltigen Domains erlaubt. Mit dieser Option kann man einfach geschlossene Netzwerke, z.B. im schulischen Bereich aufbauen, aus denen nicht mit dem Rest des Netzwerks kommuniziert werden soll.","title":"Erlaubte Domains f\u00fcr Kontakte"},{"location":"de/admin/settings/#erlaubte-domains-fur-e-mails","text":"Kommagetrennte Liste von Domains, welche bei der Registrierung als Part der E-Mail-Adresse erlaubt sind. Das grenzt Leute aus, die nicht Teil der Gruppe oder Organisation sind. Wildcards werden akzeptiert Standardm\u00e4\u00dfig sind alle g\u00fcltigen E-Mail-Adressen erlaubt.","title":"Erlaubte Domains f\u00fcr E-Mails"},{"location":"de/admin/settings/#nutzern-erlauben-das-remote_self-flag-zu-setzen","text":"Webb du die Option Nutzern erlauben das remote_self Flag zu setzen aktivierst, k\u00f6nnen alle Nutzer Atom Feeds in den Kontakteinstellungen als \"Entferntes Konto\" markieren. Dadurch werden automatisch alle Beitr\u00e4ge dieser Feeds f\u00fcr diesen Nutzer gespiegelt und an die Kontakte bei Friendica verteilt. Dieses Feature kann z.B. daf\u00fcr genutzt werden Blogbeitr\u00e4ge zu spiegeln. In der Grundeinstellung ist es nicht aktiviert, da es zus\u00e4tzliche Last auf dem Server verursachen kann. Au\u00dferdem k\u00f6nnte es durch Nutzer als Spam Verteiler missbraucht werden. Als Administrator der Friendica-Instanz kannst du diese Einstellungen ansonsten nur direkt in der Datenbank vornehmen. Bevor du das machst, solltest du sicherstellen, dass du ein Backup der Datenbank hast und genau wei\u00dft was die \u00c4nderungen an der Datenbank bewirken, die du vornehmen willst.","title":"Nutzern erlauben das remote_self Flag zu setzen"},{"location":"de/admin/settings/#explizite-inhalte","text":"Wenn Sie einen Knoten mit explizitem, nicht jugendfreien Inhalt betreiben, k\u00f6nnen Sie dies mit dieser Option ank\u00fcndigen. Ist diese Option aktiviert, wird ein Informationsflag in den ver\u00f6ffentlichten Informationen zu Ihrem Knoten gesetzt. (Sollte Server Informationen ver\u00f6ffentlichen aktiviert sein.) Zus\u00e4tzlich wird auf der Registrierungsseite f\u00fcr neue Benutzer ein Hinweis angezeigt.","title":"Explizite Inhalte"},{"location":"de/admin/settings/#erweitert","text":"","title":"Erweitert"},{"location":"de/admin/settings/#proxy-einstellungen","text":"Wenn deine Seite eine Proxy-Einstellung nutzt, musst du diese Einstellungen vornehmen, um mit anderen Seiten im Internet zu kommunizieren.","title":"Proxy Einstellungen"},{"location":"de/admin/settings/#netzwerk-wartezeit","text":"Legt fest, wie lange das Netzwerk warten soll, bevor ein Timeout eintritt. Der Wert wird in Sekunden angegeben. Standardm\u00e4\u00dfig ist 60 eingestellt; 0 steht f\u00fcr \"unbegrenzt\" (nicht empfohlen).","title":"Netzwerk Wartezeit"},{"location":"de/admin/settings/#utf-8-regulare-ausdrucke","text":"W\u00e4hrend der Registrierung werden die Namen daraufhin gepr\u00fcft, ob sie regul\u00e4re UTF-8-Ausdr\u00fccke nutzen. Hierf\u00fcr wird PHP ben\u00f6tigt, um mit einer speziellen Einstellung kompiliert zu werden, die UTF-8-Ausdr\u00fccke benutzt. Wenn du absolut keine M\u00f6glichkeit hast, Accounts zu registrieren, setze diesen Wert auf ja.","title":"UTF-8 Regul\u00e4re Ausdr\u00fccke"},{"location":"de/admin/settings/#ssl-uberprufen","text":"Standardm\u00e4\u00dfig erlaubt Friendica SSL-Kommunikation von Seiten, die \"selbst unterzeichnete\" SSL-Zertifikate nutzen. Um eine weitreichende Kompatibilit\u00e4t mit anderen Netzwerken und Browsern zu gew\u00e4hrleisten, empfehlen wir, selbst unterzeichnete Zertifikate nicht zu nutzen. Aber wir halten dich nicht davon ab, solche zu nutzen. SSL verschl\u00fcsselt alle Daten zwischen den Webseiten (und f\u00fcr deinen Browser), was dir eine komplett verschl\u00fcsselte Kommunikation erlaubt. Auch sch\u00fctzt es deine Login-Daten vor Datendiebstahl. Selbst unterzeichnete Zertifikate k\u00f6nnen kostenlos erstellt werden. Diese Zertifikate k\u00f6nnen allerdings Opfer eines sogenannten \"man-in-the-middle\"-Angriffs werden, und sind daher weniger bevorzugt. Wenn du es w\u00fcnscht, kannst du eine strikte Zertifikatabfrage einstellen. Das f\u00fchrt dazu, dass du keinerlei Verbindung zu einer selbst unterzeichneten SSL-Seite erstellen kannst","title":"SSL \u00dcberpr\u00fcfen"},{"location":"de/admin/settings/#automatisch-ein-kontaktverzeichnis-erstellen","text":"","title":"Automatisch ein Kontaktverzeichnis erstellen"},{"location":"de/admin/settings/#performance","text":"","title":"Performance"},{"location":"de/admin/settings/#worker","text":"In diesem Abschnitt kann der Hintergrund-Prozess konfiguriert werden. Bevor ein neuer Worker Prozess gestartet wird, \u00fcberpr\u00fcft das System, dass die vorhandenen Resource ausreichend sind. Aus diesem Grund kann es sein, dass die maximale Zahl der Hintergrundprozesse nicht erreicht wird. Die Aufgaben, die im Hintergrund erledigt werden, haben Priorit\u00e4ten zugeteilt. Um garantieren zu k\u00f6nnen, dass wichtige Prozesse schnellstm\u00f6glich abgearbeitet werden k\u00f6nnen, selbst wenn das System gerade stark belastet ist, sollte die fastlane aktiviert sein.","title":"Worker"},{"location":"de/admin/settings/#umsiedeln","text":"","title":"Umsiedeln"},{"location":"de/admin/settings/#nutzer","text":"In diesem Abschnitt des Adminpanels kannst du die Nutzer deiner Friendica-Instanz moderieren. Solltest du f\u00fcr Registrierungsmethode die Einstellung \"Bedarf Zustimmung\" gew\u00e4hlt haben, werden hier zu Beginn der Seite neue Registrationen aufgelistet. Als Administrator kannst du hier die Registration akzeptieren oder ablehnen. Unter dem Abschnitt mit den Registrationen werden die aktuell auf der Instanz registrierten Nutzer aufgelistet. Die Liste kann nach Namen, E-Mail-Adresse, Datum der Registration, der letzten Anmeldung oder dem letzten Beitrag und dem Account Typ sortiert werden. An dieser Stelle kannst du existierende Accounts vom Zugriff auf die Instanz blockieren, sie wieder freigeben oder Accounts endg\u00fcltig l\u00f6schen. Im letzten Bereich auf der Seite kannst du als Administrator neue Accounts anlegen. Das Passwort f\u00fcr so eingerichtete Accounts werden per E-Mail an die Nutzer geschickt.","title":"Nutzer"},{"location":"de/admin/settings/#addons","text":"Dieser Bereich des Adminpanels dient der Auswahl und Konfiguration der Erweiterungen von Friendica. Sie m\u00fcssen in das /addon Verzeichnis kopiert werden. Auf der Seite wird eine Liste der verf\u00fcgbaren Erweiterungen angezeigt. Neben den Namen der Erweiterungen wird ein Indikator angezeigt, der anzeigt, ob das Add-on gerade aktiviert ist oder nicht. Wenn du die Erweiterungen aktualisiert, die du auf deiner Friendica-Instanz nutzt, k\u00f6nnte es sein, dass sie neu geladen werden m\u00fcssen, damit die \u00c4nderungen aktiviert werden. Um diesen Prozess zu vereinfachen, gibt es am Anfang der Seite einen Button um alle aktiven Add-ons neu zu laden.","title":"Addons"},{"location":"de/admin/settings/#themen","text":"Der Bereich zur Kontrolle der auf der Friendica-Instanz verf\u00fcgbaren Themen funktioniert analog zum Add-ons Bereich. Jedes Theme hat eine extra Seite auf der aktuelle Status, ein Bildschirmfoto des Themes, zus\u00e4tzliche Informationen und eventuelle Einstellungen des Themes zu finden sind. Genau wie Erweiterungen k\u00f6nnen Themes in der \u00dcbersichtsliste oder der Theme-Seite aktiviert bzw. deaktiviert werden. Um ein Standard-theme f\u00fcr die Instanz zu w\u00e4hlen, benutze bitte die Seiten Bereich des Adminpanels.","title":"Themen"},{"location":"de/admin/settings/#zusatzliche-features","text":"Es gibt einige optionale Features in Friendica, die Nutzer benutzen k\u00f6nnen oder halt nicht. Zum Beispiel den dislike Button oder den Webeditor beim Erstellen von neuen Beitr\u00e4gen. In diesem Bereich des Adminpanels kannst du die Grundeinstellungen f\u00fcr diese Features festlegen und gegebenenfalls die Entscheidung treffen, dass Nutzer deiner Instanz diese auch nicht mehr \u00e4ndern k\u00f6nnen.","title":"Zus\u00e4tzliche Features"},{"location":"de/admin/settings/#db-updates","text":"Wenn sich die Datenbankstruktur Friendicas \u00e4ndert, werden die \u00c4nderungen automatisch angewandt. Solltest du den Verdacht haben, dass eine Aktualisierung fehlgeschlagen ist, kannst du in diesem Bereich des Adminpanels den Status der Aktualisierungen \u00fcberpr\u00fcfen.","title":"DB Updates"},{"location":"de/admin/settings/#warteschlange-inspizieren","text":"Auf der Eingangsseite des Adminpanels werden zwei Zahlen fpr die Warteschlangen angegeben. Die zweite Zahl steht f\u00fcr die Beitr\u00e4ge, die initial nicht zugestellt werden konnten und sp\u00e4ter nochmal zugestellt werden sollen. Sollte diese Zahl durch die Decke brechen, solltest du nachsehen an welchen Kontakt die Zustellung der Beitr\u00e4ge nicht funktioniert. Unter dem Men\u00fcpunkt \"Warteschlange Inspizieren\" findest du eine Liste dieser nicht zustellbaren Beitr\u00e4ge. Diese Liste ist nach dem Empf\u00e4nger sortiert. Die Kommunikation zu dem Empf\u00e4nger kann aus unterschiedlichen Gr\u00fcnden gest\u00f6rt sein. Der andere Server k\u00f6nnte offline sein, oder gerade einfach nur eine hohe Systemlast aufweisen. Aber keine Panik! Friendica wird die Beitr\u00e4ge nicht f\u00fcr alle Zeiten in der Warteschlange behalten. Nach einiger Zeit werden Knoten als inaktiv identifiziert und Nachrichten an Nutzer dieser Knoten aus der Warteschlange gel\u00f6scht.","title":"Warteschlange Inspizieren"},{"location":"de/admin/settings/#server-blockliste","text":"Auf dieser Seite des Adminpanels k\u00f6nnen Administratoren einer Friendica-Instanz die komplette Kommunikation (eingehend und ausgehend) mit bestimmten Domains unterbinden. F\u00fcr jede dieser Blockierungen muss ein Grund angegeben werden, welcher auf der Informationsseite https://your-site.info/friendica angezeigt wird. Der Abgleich der Domainnamen ist exakt, Subdomains werden nicht automatisch ebenfalls blockiert.","title":"Server Blockliste"},{"location":"de/admin/settings/#federation-statistik","text":"Deine Instanz ist ein Teil eines Netzwerks von Servern dezentraler sozialer Netzwerke, der sogenannten Federation . In diesem Bereich des Adminpanels findest du ein paar Zahlen zu dem Teil der Federation, die deine Instanz kennt.","title":"Federation Statistik"},{"location":"de/admin/settings/#eintrag-loschen","text":"Hier kann man als Admin einer Friendica Instanz Beitr\u00e4ge und ggf. damit gekoppelte Unterhaltungen von der Instanz l\u00f6schen. Dazu muss man nur die GUID des Beitrags kennen. Diese kann u.a. in der Adresse der /display -Seite gefunden werden, wenn man dem Link zum Originalbeitrag folgt. Hier ist die GUID der letzte Teil der URL in der Adresszeile des Browsers.","title":"Eintrag l\u00f6schen"},{"location":"de/admin/settings/#addon-features","text":"Einige der Erweiterungen von Friendica ben\u00f6tigen global g\u00fcltige Einstellungen, die der Administrator vornehmen muss. Diese Erweiterungen sind hier aufgelistet, damit du die Einstellungen schneller findest.","title":"Addon Features"},{"location":"de/admin/settings/#protokolle","text":"Dieser Bereich des Adminpanels ist auf zwei Seiten verteilt. Die eine Seite dient der Konfiguration, die andere dem Anzeigen der Logs. Du solltest die Logdatei nicht in einem Verzeichnis anlegen, auf das man vom Internet aus zugreifen kann. Wenn du das dennoch tun musste und die Standardeinstellungen des Apache Servers verwendest, dann solltest du darauf achten, dass die Logdateien mit der Endung .log oder .out enden. Solltest du einen anderen Webserver verwenden, solltest du sicherstellen, dass der Zugriff zu Dateien mit diesen Endungen nicht m\u00f6glich ist. Es gibt f\u00fcnf Level der Ausf\u00fchrlichkeit, mit denen Friendica arbeitet: Normal, Trace, Debug, Data und All. Normalerweise solltest du f\u00fcr den Betrieb deiner Friendica-Instanz keine Logs ben\u00f6tigen. Wenn du versuchst einem Problem auf den Grund zu gehen, solltest du das \"DEBUG\" Level w\u00e4hlen. Mit dem \"All\" Level schreibt Friendica alles in die Logdatei. Die Datenmenge der geloggten Daten kann relativ schnell anwachsen, deshalb empfehlen wir das Anlegen von Protokollen nur zu aktivieren, wenn es unbedingt n\u00f6tig ist. Die Gr\u00f6\u00dfe der Logdateien kann schnell anwachsen . Du solltest deshalb einen Dienst zur log rotation einrichten. Bekannte Probleme : Der Dateiname friendica.log kann bei speziellen Server Konfigurationen zu Problemen f\u00fchren (siehe issue 2209 ). Normalerweise werden Fehler- und Warnmeldungen von PHP unterdr\u00fcckt. Wenn du sie aktivieren willst, musst du folgendes in der config/local.config.php Datei eintragen um die Meldungen in die Datei php.out zu speichern <?php error_reporting ( E_ERROR | E_WARNING | E_PARSE ); ini_set ( 'error_log' , 'php.out' ); ini_set ( 'log_errors' , '1' ); ini_set ( 'display_errors' , '0' ); Die Datei php.out muss vom Webserver schreibbar sein und sollte ebenfalls au\u00dferhalb der Webverzeichnisse liegen. Es kommt gelegentlich vor, dass nicht deklarierte Variablen referenziert werden, deshalb raten wir davon ab E_NOTICE oder E_ALL zu verwenden. Die \u00fcberwiegende Mehrzahl der auf diesen Stufen dokumentierten Fehler sind absolut harmlos. Solltest du mit den oben empfohlenen Einstellungen Fehler finden, teile sie bitte den Entwicklern mit. Im Allgemeinen sind dies Fehler, die behoben werden sollten. Solltest du eine leere (wei\u00dfe) Seite vorfinden, w\u00e4hrend du Friendica nutzt, werfe bitte einen Blick in die PHP Logs. Solche White Screens sind so gut wie immer ein Zeichen daf\u00fcr, dass ein Fehler aufgetreten ist.","title":"Protokolle"},{"location":"de/admin/settings/#diagnose","text":"In diesem Bereich des Adminpanels findest du zwei Werkzeuge, mit der du untersuchen kannst, wie Friendica bestimmte Ressourcen einsch\u00e4tzt. Diese Werkzeuge sind insbesondere bei der Analyse von Kommunikationsproblemen hilfreich. \"Adresse untersuchen\" zeigt Informationen zu einer URL an, wie Friendica sie wahrnimmt. Mit dem zweiten Werkzeug \"Webfinger \u00fcberpr\u00fcfen\" kannst du Informationen zu einem Ding anfordern, das \u00fcber einen Webfinger (jemand@example.com) identifiziert wird.","title":"Diagnose"},{"location":"de/admin/settings/#die-ausnahmen-der-regel","text":"F\u00fcr die oben genannte Regel gibt es vier Ausnahmen, deren Konfiguration nicht \u00fcber das Adminpanel vorgenommen werden kann. Dies sind die Datenbank Einstellungen, die Administrator Accounts, der PHP Pfad und die Konfiguration einer eventuellen Installation in ein Unterverzeichnis unterhalb der Hauptdomain.","title":"Die Ausnahmen der Regel"},{"location":"de/admin/settings/#datenbank-einstellungen","text":"Mit den folgenden Einstellungen kannst du die Zugriffsdaten f\u00fcr den Datenbankserver festlegen. 'database' => [ 'hostname' => 'localhost', 'username' => 'mysqlusername', 'password' => 'mysqlpassword', 'database' => 'mysqldatabasename', 'charset' => 'utf8mb4', ], Sollten alle der folgenden Environment-Variablen gesetzt sein, wird Friendica diese anstatt der vorher konfigurierten Werte nutzen. MYSQL_HOST MYSQL_PORT MYSQL_USERNAME MYSQL_PASSWORD MYSQL_DATABASE","title":"Datenbank Einstellungen"},{"location":"de/admin/settings/#administratoren","text":"Du kannst einen, oder mehrere Accounts, zu Administratoren machen. Normalerweise trifft dies auf den ersten Account zu, der nach der Installation angelegt wird. Die Liste der E-Mail-Adressen kann aber einfach erweitert werden. Mit keiner der angegebenen E-Mail-Adressen k\u00f6nnen weitere Accounts registriert werden. 'config' => [ 'admin_email' => 'you@example.com, buddy@example.com', ],","title":"Administratoren"},{"location":"de/admin/settings/#php-pfad","text":"Einige Prozesse von Friendica laufen im Hintergrund. F\u00fcr diese Prozesse muss der Pfad zu der PHP Version gesetzt sein, die verwendet werden soll. 'config' => [ 'php_path' => '/usr/bin/php', ],","title":"PHP Pfad"},{"location":"de/admin/settings/#unterverzeichnis-konfiguration","text":"Man kann Friendica in ein Unterverzeichnis des Webservers installieren. Wir raten allerdings dringen davon ab, da es die Interoperabilit\u00e4t mit anderen Netzwerken (z.B. Diaspora, GNU Social, Hubzilla) verhindert. Mal angenommen, du hast ein Unterverzeichnis tests und willst Friendica in ein weiteres Unterverzeichnis installieren, dann lautet die Konfiguration hierf\u00fcr: 'system' => [ 'urlpath' => 'tests/friendica', ],","title":"Unterverzeichnis Konfiguration"},{"location":"de/admin/settings/#weitere-ausnahmen","text":"Es gibt noch einige experimentelle Einstellungen, die nur in der config/local.config.php Datei konfiguriert werden k\u00f6nnen. Im Konfigurationswerte, die nur in der config/local.config.php gesetzt werden k\u00f6nnen (EN) Artikel kannst du mehr dar\u00fcber erfahren.","title":"Weitere Ausnahmen"},{"location":"de/admin/ssl/","tags":["ssl","admin"],"text":"Friendica mit SSL nutzen # Disclaimer # Dieses Dokument wurde im November 2016 aktualisiert. SSL-Verschl\u00fcsselung ist sicherheitskritisch. Das bedeutet, dass sich die empfohlenen Einstellungen schnell ver\u00e4ndern. Halte deine Installation auf dem aktuellen Stand und verlasse dich nicht darauf, dass dieses Dokument genauso schnell aktualisiert wird, wie sich Technologien ver\u00e4ndern! Einleitung # Wenn du deine eigene Friendica-Seite betreibst, willst du vielleicht SSL (https) nutzen, um die Kommunikation zwischen den Servern und zwischen dir und deinem Server zu verschl\u00fcsseln. Daf\u00fcr gibt es grunds\u00e4tzlich zwei Arten von SSL-Zertifikaten: Selbst-signierte Zertifikate und Zertifikate, die von einer Zertifizierungsstelle (CA) unterschrieben sind. Technisch gesehen sorgen beide f\u00fcr valide Verschl\u00fcsselung. Mit selbst-signierten Zertifikaten gibt es jedoch ein Problem: Sie sind weder in Browsern noch auf anderen Servern installiert. Deshalb f\u00fchren sie zu Warnungen \u00fcber \"nicht vertrauensw\u00fcrdige Zertifikate\". Das ist verwirrend und st\u00f6rt sehr. Aus diesem Grund empfehlen wir, dass du dir ein von einer CA unterschriebenes Zertifikat besorgst. Normalerweise kosten sie Geld - und sind nur f\u00fcr eine begrenzte Zeit g\u00fcltig (z.B. ein Jahr oder zwei). Es gibt aber M\u00f6glichkeiten, ein vertrauensw\u00fcrdiges Zertifikat umsonst zu bekommen. W\u00e4hle deinen Domainnamen # Dein SSL-Zertifikat wird f\u00fcr eine bestimmte Domain g\u00fcltig sein oder sogar nur f\u00fcr eine Subdomain. Entscheide dich endg\u00fcltig f\u00fcr einen Domainnamen, bevor du ein Zertifikat bestellst. Wenn du das Zertifikat hast, brauchst du ein neues, wenn du den Domainnamen \u00e4ndern m\u00f6chtest. Gehosteter Webspace # Wenn deine Friendica-Instanz auf einem gehosteten Webspace l\u00e4uft, solltest du dich bei deinem Hosting-Provider informieren. Dort bekommst du Instruktionen, wie es dort l\u00e4uft. Du kannst bei deinem Provider immer ein kostenpflichtiges Zertifikat bestellen. Sie installieren es f\u00fcr dich oder haben in der Weboberfl\u00e4che eine einfache Upload-M\u00f6glichkeit f\u00fcr Zertifikat und Schl\u00fcssel. Um Geld zu sparen, kann es sich lohnen, dort auch nachzufragen, ob sie ein anderes Zertifikat, das du selbst beschaffst, f\u00fcr dich installieren w\u00fcrden. Wenn ja, dann lies weiter. Let's encrypt # Wenn du einen eigenen Server betreibst und den Nameserver kontrollierst, k\u00f6nnte auch die Initiative \"Let's encrypt\" interessant f\u00fcr dich werden. Sie bietet nicht nur freie SSL Zertifikate, sondern auch einen automatisierten Prozess zum Erneuern der Zertifikate. Um LetsEncrypt Zertifikate verwenden zu k\u00f6nnen, musst du dir einen Client auf deinem Server installieren. Eine Anleitung zum offiziellen Client findest du hier . Falls du dir andere Clients anschauen willst, kannst du einen Blick in diese Liste von alternativen LetsEncrypt Clients . Webserver-Einstellungen # Im Wiki von Mozilla gibt es Anleitungen f\u00fcr die Konfiguration sicherer Webserver. Dort findest du Empfehlungen, die auf verschiedene Webserver zugeschnitten sind. Teste deine SSL-Einstellungen # Wenn du fertig bist, kannst du auf der Testseite SSL-Labs pr\u00fcfen lassen, ob du alles richtig gemacht hast. Friendica Konfigurieren # Wenn du deine Friendica Instanz \u00fcber https erreichen kannst, solltest du ein paar Einstellungen vornehmen, um sicherzustellen, dass deine Nutzer ausschlie\u00dflich \u00fcber https zugreifen k\u00f6nnen. Webserver-Umleitungen # Dies ist der einfachste Weg den Zugriff f\u00fcr die ganze Webseite abzusichern. Jedes Mal, wenn ein Nutzer Friendica aufruft wird er permanent vom Webserver auf die abgesicherte Seite umgeleitet. Wenn du den Apache Webserver verwendest, aktiviere die Module rewrite und ssl (bei einem Shared-Hosting Prider sollte dies bereits der Fall sein): sudo a2enmod rewrite ssl und f\u00fcge die folgenden Zeilen zur .htaccess Datei im Wurzelverzeichnis deiner Friendica Instanz hinzu: RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://your.friendica.domain/$1 [R=301,L] (Dank an AlfredSK . Bei nginx solltest du deinen Server folgenderma\u00dfen konfigurieren ( documentation ): server { listen 80; server_name your.friendica.domain; return 301 https://$server_name$request_uri; } SSL Einstellungen # Im Admin-Panel gibt es drei Einstellungen, die SSL betreffen: Regeln f\u00fcr SSL Links : Diese Einstellung betrifft wie Friendica interne Links erzeugt. Wenn deine SSL Installation erfolgreich war, empfehlen wir die Einstellung \"SSL f\u00fcr alle Links erzwingen\". Erzwinge SSL : Mit dieser Einstellung werden alle externen Links auf HTTPS gesetzt. Dies kann bei Mixed-Content Problemen helfen, allerdings unterst\u00fctzen noch nicht alle Webseiten HTTPS. Benutzung auf eigene Gefahr. SSL \u00fcberpr\u00fcfen : Wenn diese Einstellung aktiv ist, wird Friendica nicht mehr mit Instanzen interagieren, die \u00fcber ein selbst signiertes Zertifikat verf\u00fcgen. Da selbst signierte Zertifikate ein Hinweis auf Man-in-the. Middle Angriffe sein k\u00f6nnen, empfehlen wir dies zu tun.","title":"SSL Einstellungen"},{"location":"de/admin/ssl/#friendica-mit-ssl-nutzen","text":"","title":"Friendica mit SSL nutzen"},{"location":"de/admin/ssl/#disclaimer","text":"Dieses Dokument wurde im November 2016 aktualisiert. SSL-Verschl\u00fcsselung ist sicherheitskritisch. Das bedeutet, dass sich die empfohlenen Einstellungen schnell ver\u00e4ndern. Halte deine Installation auf dem aktuellen Stand und verlasse dich nicht darauf, dass dieses Dokument genauso schnell aktualisiert wird, wie sich Technologien ver\u00e4ndern!","title":"Disclaimer"},{"location":"de/admin/ssl/#einleitung","text":"Wenn du deine eigene Friendica-Seite betreibst, willst du vielleicht SSL (https) nutzen, um die Kommunikation zwischen den Servern und zwischen dir und deinem Server zu verschl\u00fcsseln. Daf\u00fcr gibt es grunds\u00e4tzlich zwei Arten von SSL-Zertifikaten: Selbst-signierte Zertifikate und Zertifikate, die von einer Zertifizierungsstelle (CA) unterschrieben sind. Technisch gesehen sorgen beide f\u00fcr valide Verschl\u00fcsselung. Mit selbst-signierten Zertifikaten gibt es jedoch ein Problem: Sie sind weder in Browsern noch auf anderen Servern installiert. Deshalb f\u00fchren sie zu Warnungen \u00fcber \"nicht vertrauensw\u00fcrdige Zertifikate\". Das ist verwirrend und st\u00f6rt sehr. Aus diesem Grund empfehlen wir, dass du dir ein von einer CA unterschriebenes Zertifikat besorgst. Normalerweise kosten sie Geld - und sind nur f\u00fcr eine begrenzte Zeit g\u00fcltig (z.B. ein Jahr oder zwei). Es gibt aber M\u00f6glichkeiten, ein vertrauensw\u00fcrdiges Zertifikat umsonst zu bekommen.","title":"Einleitung"},{"location":"de/admin/ssl/#wahle-deinen-domainnamen","text":"Dein SSL-Zertifikat wird f\u00fcr eine bestimmte Domain g\u00fcltig sein oder sogar nur f\u00fcr eine Subdomain. Entscheide dich endg\u00fcltig f\u00fcr einen Domainnamen, bevor du ein Zertifikat bestellst. Wenn du das Zertifikat hast, brauchst du ein neues, wenn du den Domainnamen \u00e4ndern m\u00f6chtest.","title":"W\u00e4hle deinen Domainnamen"},{"location":"de/admin/ssl/#gehosteter-webspace","text":"Wenn deine Friendica-Instanz auf einem gehosteten Webspace l\u00e4uft, solltest du dich bei deinem Hosting-Provider informieren. Dort bekommst du Instruktionen, wie es dort l\u00e4uft. Du kannst bei deinem Provider immer ein kostenpflichtiges Zertifikat bestellen. Sie installieren es f\u00fcr dich oder haben in der Weboberfl\u00e4che eine einfache Upload-M\u00f6glichkeit f\u00fcr Zertifikat und Schl\u00fcssel. Um Geld zu sparen, kann es sich lohnen, dort auch nachzufragen, ob sie ein anderes Zertifikat, das du selbst beschaffst, f\u00fcr dich installieren w\u00fcrden. Wenn ja, dann lies weiter.","title":"Gehosteter Webspace"},{"location":"de/admin/ssl/#lets-encrypt","text":"Wenn du einen eigenen Server betreibst und den Nameserver kontrollierst, k\u00f6nnte auch die Initiative \"Let's encrypt\" interessant f\u00fcr dich werden. Sie bietet nicht nur freie SSL Zertifikate, sondern auch einen automatisierten Prozess zum Erneuern der Zertifikate. Um LetsEncrypt Zertifikate verwenden zu k\u00f6nnen, musst du dir einen Client auf deinem Server installieren. Eine Anleitung zum offiziellen Client findest du hier . Falls du dir andere Clients anschauen willst, kannst du einen Blick in diese Liste von alternativen LetsEncrypt Clients .","title":"Let's encrypt"},{"location":"de/admin/ssl/#webserver-einstellungen","text":"Im Wiki von Mozilla gibt es Anleitungen f\u00fcr die Konfiguration sicherer Webserver. Dort findest du Empfehlungen, die auf verschiedene Webserver zugeschnitten sind.","title":"Webserver-Einstellungen"},{"location":"de/admin/ssl/#teste-deine-ssl-einstellungen","text":"Wenn du fertig bist, kannst du auf der Testseite SSL-Labs pr\u00fcfen lassen, ob du alles richtig gemacht hast.","title":"Teste deine SSL-Einstellungen"},{"location":"de/admin/ssl/#friendica-konfigurieren","text":"Wenn du deine Friendica Instanz \u00fcber https erreichen kannst, solltest du ein paar Einstellungen vornehmen, um sicherzustellen, dass deine Nutzer ausschlie\u00dflich \u00fcber https zugreifen k\u00f6nnen.","title":"Friendica Konfigurieren"},{"location":"de/admin/ssl/#webserver-umleitungen","text":"Dies ist der einfachste Weg den Zugriff f\u00fcr die ganze Webseite abzusichern. Jedes Mal, wenn ein Nutzer Friendica aufruft wird er permanent vom Webserver auf die abgesicherte Seite umgeleitet. Wenn du den Apache Webserver verwendest, aktiviere die Module rewrite und ssl (bei einem Shared-Hosting Prider sollte dies bereits der Fall sein): sudo a2enmod rewrite ssl und f\u00fcge die folgenden Zeilen zur .htaccess Datei im Wurzelverzeichnis deiner Friendica Instanz hinzu: RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://your.friendica.domain/$1 [R=301,L] (Dank an AlfredSK . Bei nginx solltest du deinen Server folgenderma\u00dfen konfigurieren ( documentation ): server { listen 80; server_name your.friendica.domain; return 301 https://$server_name$request_uri; }","title":"Webserver-Umleitungen"},{"location":"de/admin/ssl/#ssl-einstellungen","text":"Im Admin-Panel gibt es drei Einstellungen, die SSL betreffen: Regeln f\u00fcr SSL Links : Diese Einstellung betrifft wie Friendica interne Links erzeugt. Wenn deine SSL Installation erfolgreich war, empfehlen wir die Einstellung \"SSL f\u00fcr alle Links erzwingen\". Erzwinge SSL : Mit dieser Einstellung werden alle externen Links auf HTTPS gesetzt. Dies kann bei Mixed-Content Problemen helfen, allerdings unterst\u00fctzen noch nicht alle Webseiten HTTPS. Benutzung auf eigene Gefahr. SSL \u00fcberpr\u00fcfen : Wenn diese Einstellung aktiv ist, wird Friendica nicht mehr mit Instanzen interagieren, die \u00fcber ein selbst signiertes Zertifikat verf\u00fcgen. Da selbst signierte Zertifikate ein Hinweis auf Man-in-the. Middle Angriffe sein k\u00f6nnen, empfehlen wir dies zu tun.","title":"SSL Einstellungen"},{"location":"de/developer/","tags":["develop","guide"],"text":"Friendica - Entwickler-Guide # Hier erf\u00e4hrst du, wie du bei uns mitmachen kannst: Zun\u00e4chst erstelle dir per 'git clone https://github.com/friendica/friendica.git' ein funktionierendes Git-Paket auf deinem System, auf dem du die Entwicklung durchf\u00fchrst, und einen eigenen Github-Account. Erstelle deine eigene Kopie (fork) der Ursprungsdaten auf Github, an der du dann entspannt arbeiten kannst. Deine Arbeiten sollten mit einem neuen Arbeitszweig (branch) beginnen, den du vom develop Zweig des Repositories beginnst. Die Anleitung unter http://help.github.com/fork-a-repo/ erkl\u00e4rt dir genau, wie du das tun musst. Gehe dann nach getaner Arbeit zu Deiner Github-Seite und erstelle eine \"Pull request\", um Deine \u00c4nderungen in das Hauptprojekt einzugliedern (merge). Solltest du keine Idee haben, an welcher Stelle du einsteigen k\u00f6nntest? Wir haben einige Aufgaben auf github mit dem Schlagwort Junior Job versehen. Bei diesen Aufgaben gehen wir davon aus, dass sie geeignete Einstiegsstellen sind. Du musst dich aber nat\u00fcrlich nicht mit diesen Aufgaben besch\u00e4ftigen, um den Friendica Code zu verbessern. Wichtig # Bitte hole Dir alle \u00c4nderungen aus dem Projektverzeichnis und f\u00fchre sie mit Deiner Arbeit zusammen, bevor Du Deine \"pull request\" erstellst. Wir behalten es uns vor, Patches abzulehnen, die eine gro\u00dfe Anzahl an Fehlern hervorrufen. Dies gilt vor allem f\u00fcr \u00dcbersetzungen, da wir hier m\u00f6glicherweise nicht alle feinen Unterschiede in konflikt\u00e4hren Versionen erkennen k\u00f6nnen. Au\u00dferdem: teste Deine \u00c4nderungen! Vergiss nicht, dass eine simple Fehlerl\u00f6sung einen anderen Fehler ausl\u00f6sen kann. Lass Deine \u00c4nderungen von einem erfahrenen Friendica-Entwickler gegenpr\u00fcfen. Eine ausf\u00fchrliche Anleitung zu Git findest Du unter https://git-scm.com/book/de/v1 .","title":"Guide"},{"location":"de/developer/#friendica-entwickler-guide","text":"Hier erf\u00e4hrst du, wie du bei uns mitmachen kannst: Zun\u00e4chst erstelle dir per 'git clone https://github.com/friendica/friendica.git' ein funktionierendes Git-Paket auf deinem System, auf dem du die Entwicklung durchf\u00fchrst, und einen eigenen Github-Account. Erstelle deine eigene Kopie (fork) der Ursprungsdaten auf Github, an der du dann entspannt arbeiten kannst. Deine Arbeiten sollten mit einem neuen Arbeitszweig (branch) beginnen, den du vom develop Zweig des Repositories beginnst. Die Anleitung unter http://help.github.com/fork-a-repo/ erkl\u00e4rt dir genau, wie du das tun musst. Gehe dann nach getaner Arbeit zu Deiner Github-Seite und erstelle eine \"Pull request\", um Deine \u00c4nderungen in das Hauptprojekt einzugliedern (merge). Solltest du keine Idee haben, an welcher Stelle du einsteigen k\u00f6nntest? Wir haben einige Aufgaben auf github mit dem Schlagwort Junior Job versehen. Bei diesen Aufgaben gehen wir davon aus, dass sie geeignete Einstiegsstellen sind. Du musst dich aber nat\u00fcrlich nicht mit diesen Aufgaben besch\u00e4ftigen, um den Friendica Code zu verbessern.","title":"Friendica - Entwickler-Guide"},{"location":"de/developer/#wichtig","text":"Bitte hole Dir alle \u00c4nderungen aus dem Projektverzeichnis und f\u00fchre sie mit Deiner Arbeit zusammen, bevor Du Deine \"pull request\" erstellst. Wir behalten es uns vor, Patches abzulehnen, die eine gro\u00dfe Anzahl an Fehlern hervorrufen. Dies gilt vor allem f\u00fcr \u00dcbersetzungen, da wir hier m\u00f6glicherweise nicht alle feinen Unterschiede in konflikt\u00e4hren Versionen erkennen k\u00f6nnen. Au\u00dferdem: teste Deine \u00c4nderungen! Vergiss nicht, dass eine simple Fehlerl\u00f6sung einen anderen Fehler ausl\u00f6sen kann. Lass Deine \u00c4nderungen von einem erfahrenen Friendica-Entwickler gegenpr\u00fcfen. Eine ausf\u00fchrliche Anleitung zu Git findest Du unter https://git-scm.com/book/de/v1 .","title":"Wichtig"},{"location":"de/developer/addons/","tags":["develop","addons","hooks"],"text":"Friendica Addon Entwicklung # Bitte schau dir das Beispiel-Addon \"randplace\" f\u00fcr ein funktionierendes Beispiel f\u00fcr manche der hier aufgef\u00fchrten Funktionen an. Das Facebook-Addon bietet ein Beispiel daf\u00fcr, die \"addon\"- und \"module\"-Funktion gemeinsam zu integrieren. Addons arbeiten, indem sie Event Hooks abfangen. Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden. Addon-Namen k\u00f6nnen keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt. Du kannst einen lesbaren Namen im Kommentarblock eintragen. Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-Namen basieren; z.B. \"addon1name_install()\". Diese beiden Funktionen haben keine Argumente und sind daf\u00fcr verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Addon ben\u00f6tigt. Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgef\u00fchrt (z.B. neu installiert), wenn sich das Addon nach der Installation \u00e4ndert - somit sollte deine Deinstallationsfunktion keine Daten zerst\u00f6rt und deine Installationsfunktion sollte bestehende Daten ber\u00fccksichtigen. Zuk\u00fcnftige Extensions werden m\u00f6glicherweise \"Setup\" und \"Entfernen\" anbieten. Addons sollten einen Kommentarblock mit den folgenden vier Parametern enthalten: <? php /* * Name: My Great Addon * Description: This is what my addon does. It's really cool. * Version: 1.0 * Author: John Q. Public <john@myfriendicasite.com> */ Registriere deine Addon-Hooks w\u00e4hrend der Installation. <? php \\Friendica\\Core\\Hook :: register ( $hookname , $file , $function ); $hookname ist ein String und entspricht einem bekannten Friendica-Hook. $file steht f\u00fcr den Pfadnamen, der relativ zum Top-Level-Friendica-Verzeichnis liegt. Das sollte addon/addon_name/addon_name.php sein. $function ist ein String und der Name der Funktion, die ausgef\u00fchrt wird, wenn der Hook aufgerufen wird. Argumente # Deine Hook-Callback-Funktion wird mit mindestens einem und bis zu zwei Argumenten aufgerufen <? php function myhook_function ( App $a , & $b ) { } Wenn du \u00c4nderungen an den aufgerufenen Daten vornehmen willst, musst du diese als Referenzvariable (mit \"&\") w\u00e4hrend der Funktionsdeklaration deklarieren. $a ist die Friendica \"App\"-Klasse, die eine Menge an Informationen \u00fcber den aktuellen Friendica-Status beinhaltet, u.a. welche Module genutzt werden, Konfigurationsinformationen, Inhalte der Seite zum Zeitpunkt des Hook-Aufrufs. Es ist empfohlen, diese Funktion \"$a\" zu nennen, um seine Nutzung an den Gebrauch an anderer Stelle anzugleichen. $b kann frei benannt werden. Diese Information ist speziell auf den Hook bezogen, der aktuell bearbeitet wird, und beinhaltet normalerweise Daten, die du sofort nutzen, anzeigen oder bearbeiten kannst. Achte darauf, diese mit \"&\" zu deklarieren, wenn du sie bearbeiten willst. Module # Addons k\u00f6nnen auch als \"Module\" agieren und alle Seitenanfragen f\u00fcr eine bestimmte URL abfangen. Um ein Addon als Modul zu nutzen, ist es n\u00f6tig, die Funktion \"addon_name_module()\" zu definieren, die keine Argumente ben\u00f6tigt und nichts weiter machen muss. Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen f\u00fcr \"http://example.com/addon_name\" erhalten - mit allen URL-Komponenten als zus\u00e4tzliche Argumente. Diese werden in das App\\Arguments Objekt geparst. So w\u00fcrde http://example.com/addon/arg1/arg2 dies ergeben: <? php DI :: args () -> getArgc (); // = 3 DI :: args () -> get ( 0 ); // = 'addon' DI :: args () -> get ( 1 ); // = 'arg1' DI :: args () -> get ( 2 ); // = 'arg2' Deine Modulfunktionen umfassen oft die Funktion addon_name_content(App $a), welche den Seiteninhalt definiert und zur\u00fcckgibt. Sie k\u00f6nnen auch addon_name_post(App $a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt. Du kannst ebenso addon_name_init(App $a) nutzen, was oft fr\u00fchzeitig aufgerufen wird und das Modul initialisiert. Derzeitige Hooks # 'authenticate' - wird aufgerufen, wenn sich der User einloggt. $b ist ein Array 'username' => der \u00fcbertragene Nutzername 'password' => das \u00fcbertragene Passwort 'authenticated' => setze das auf einen anderen Wert als \"0\", damit der User sich authentifiziert 'user_record' => die erfolgreiche Authentifizierung muss auch einen g\u00fcltigen Nutzereintrag aus der Datenbank zur\u00fcckgeben 'logged_in' - wird aufgerufen, sobald ein Nutzer sich erfolgreich angemeldet hat. $b beinhaltet den $a->Nutzer-Array 'display_item' - wird aufgerufen, wenn ein Beitrag f\u00fcr die Anzeige formatiert wird. $b ist ein Array 'item' => Die Item-Details (Array), die von der Datenbank ausgegeben werden 'output' => Die HTML-Ausgabe (String) des Items, bevor es zur Seite hinzugef\u00fcgt wird 'post_local' - wird aufgerufen, wenn der Statusbeitrag oder ein Kommentar im lokalen System eingetragen wird. $b ist das Item-Array der Information, die in der Datenbank hinterlegt wird. {Bitte beachte: Der Seiteninhalt ist bbcode - nicht HTML) 'post_local_end' - wird aufgerufen, wenn ein lokaler Statusbeitrag oder Kommentar im lokalen System gespeichert wird. $b ist das Item-Array einer Information, die gerade in der Datenbank gespeichert wurden. {Bitte beachte: Der Seiteninhalt ist bbcode - nicht HTML) 'post_remote' - wird aufgerufen, wenn ein Beitrag aus einer anderen Quelle empfangen wird. Dies kann auch genutzt werden, um lokale Aktivit\u00e4ten oder systemgenerierte Nachrichten zu ver\u00f6ffentlichen/posten. $b ist das Item-Array einer Information, die in der Datenbank und im Item gespeichert ist. {Bitte beachte: Der Seiteninhalt ist bbcode - nicht HTML) 'addon_settings' - wird aufgerufen, wenn die HTML-Ausgabe der Addon-Einstellungsseite generiert wird. $b ist die HTML-Ausgabe (String) der Addon-Einstellungsseite vor dem finalen \" \"-Tag. 'addon_settings_post' - wird aufgerufen, wenn die Addon-Einstellungsseite geladen wird. $b ist der $_POST-Array 'profile_post' - wird aufgerufen, wenn die Profilseite angezeigt wird. $b ist der $_POST-Array 'profile_edit' - wird aufgerufen, bevor die Profil-Bearbeitungsseite angezeigt wird. $b ist ein Array 'profile' => Profileintrag (Array) aus der Datenbank 'entry' => die HTML-Ausgabe (string) des generierten Eintrags 'profile_advanced' - wird aufgerufen, wenn die HTML-Ausgabe f\u00fcr das \"Advanced profile\" generiert wird; stimmt mit dem \"Profil\"-Tab auf der Profilseite der Nutzer \u00fcberein. $b ist die HTML-Ausgabe (String) des erstellten Profils (Die Details des Profil-Arrays sind in $a->profile) 'directory_item' - wird von der Verzeichnisseite aufgerufen, wenn ein Item f\u00fcr die Anzeige formatiert wird. $b ist ein Array 'contact' => Kontakteintrag (Array) einer Person aus der Datenbank 'entry' => die HTML-Ausgabe (String) des generierten Eintrags 'profile_sidebar_enter' - wird aufgerufen, bevor die Sidebar \"Kurzprofil\" einer Seite erstellt wird. $b ist der Profil-Array einer Person 'profile_sidebar' - wird aufgerufen, wenn die Sidebar \"Kurzprofil\" einer Seite erstellt wird. $b ist ein Array 'profile' => Kontakteintrag (Array) einer Person aus der Datenbank 'entry' => die HTML-Ausgabe (String) des generierten Eintrags 'contact_block_end' - wird aufgerufen, wenn der Block \"Kontakte/Freunde\" der Profil-Sidebar komplett formatiert wurde. $b ist ein Array 'contacts' => Array von \"contacts\" 'output' => die HTML-Ausgabe (String) des Kontaktblocks 'bbcode' - wird w\u00e4hrend der Umwandlung von bbcode auf HTML aufgerufen. $b ist der konvertierte Text (String) 'html2bbcode' - wird w\u00e4hrend der Umwandlung von HTML zu bbcode aufgerufen (z.B. bei Nachrichtenbeitr\u00e4gen). $b ist der konvertierte Text (String) 'page_header' - wird aufgerufen, nachdem der Bereich der Seitennavigation geladen wurde. $b ist die HTML-Ausgabe (String) der \"nav\"-Region 'personal_xrd' - wird aufgerufen, bevor die Ausgabe der pers\u00f6nlichen XRD-Datei erzeugt wird. $b ist ein Array 'user' => die hinterlegten Eintr\u00e4ge der Person 'xml' => die komplette XML-Datei die ausgegeben wird 'home_content' - wird aufgerufen, bevor die Ausgabe des Homepage-Inhalts erstellt wird; wird nicht eingeloggten Nutzern angezeigt. $b ist die HTML-Ausgabe (String) der Auswahlregion 'contact_edit' - wird aufgerufen, wenn die Kontaktdetails vom Nutzer auf der \"Kontakte\"-Seite bearbeitet werden. $b ist ein Array 'contact' => Kontakteintrag (Array) des abgezielten Kontakts 'output' => die HTML-Ausgabe (String) der \"Kontakt bearbeiten\"-Seite 'contact_edit_post' - wird aufgerufen, wenn die \"Kontakt bearbeiten\"-Seite ausgegeben wird. $b ist der $_POST-Array 'init_1' - wird aufgerufen, kurz nachdem die Datenbank vor Beginn der Sitzung ge\u00f6ffnet wird. $b wird nicht genutzt 'page_end' - wird aufgerufen, nachdem die Funktion des HTML-Inhalts komplett abgeschlossen ist. $b ist die HTML-Ausgabe (String) vom Inhalt-\"div\" 'avatar_lookup' - wird aufgerufen, wenn der Avatar geladen wird. $b ist ein Array 'size' => Gr\u00f6\u00dfe des Avatars, der geladen wird 'email' => Email-Adresse, um nach dem Avatar zu suchen 'url' => generierte URL (String) des Avatars 'nav_info' - wird aufgerufen, nachdem in include/nav.php der Inhalt des Navigationsmen\u00fcs erzeugt wurde. - $b ist ein Array, das $nav widerspiegelt. Komplette Liste der Hook-Callbacks # Eine komplette Liste aller Hook-Callbacks mit den zugeh\u00f6rigen Dateien (am 01-Apr-2018 generiert): Bitte schau in die Quellcodes f\u00fcr Details zu Hooks, die oben nicht dokumentiert sind. index.php # Hook::callAll('init_1'); Hook::callAll('app_menu', $arr); Hook::callAll('page_content_top', DI::page()['content']); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_post', $_POST); Hook::callAll($a->module.'_mod_content', $arr); Hook::callAll($a->module.'_mod_aftercontent', $arr); Hook::callAll('page_end', DI::page()['content']); include/api.php # Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); Hook::callAll('logged_in', $a->user); include/enotify.php # Hook::callAll('enotify', $h); Hook::callAll('enotify_store', $datarray); Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data); src/Content/Conversation.php # Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); Hook::callAll('display_item', $arr); Hook::callAll('item_photo_menu', $args); Hook::callAll('jot_tool', $jotplugins); mod/directory.php # Hook::callAll('directory_item', $arr); mod/xrd.php # Hook::callAll('personal_xrd', $arr); mod/parse_url.php # Hook::callAll(\"parse_link\", $arr); src/Module/Delegation.php # Hook::callAll('home_init', $ret); mod/acl.php # Hook::callAll('acl_lookup_end', $results); mod/network.php # Hook::callAll('network_content_init', $arr); Hook::callAll('network_tabs', $arr); mod/friendica.php # Hook::callAll('about_hook', $o); mod/profiles.php # Hook::callAll('profile_post', $_POST); Hook::callAll('profile_edit', $arr); mod/settings.php # Hook::callAll('addon_settings_post', $_POST); Hook::callAll('connector_settings_post', $_POST); Hook::callAll('display_settings_post', $_POST); Hook::callAll('addon_settings', $settings_addons); Hook::callAll('connector_settings', $settings_connectors); Hook::callAll('display_settings', $o); mod/photos.php # Hook::callAll('photo_post_init', $_POST); Hook::callAll('photo_post_file', $ret); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', intval($item_id)); Hook::callAll('photo_upload_form', $ret); mod/profile.php # Hook::callAll('profile_advanced', $o); mod/home.php # Hook::callAll('home_init', $ret); Hook::callAll(\"home_content\", $content); mod/poke.php # Hook::callAll('post_local_end', $arr); mod/contacts.php # Hook::callAll('contact_edit_post', $_POST); Hook::callAll('contact_edit', $arr); mod/tagger.php # Hook::callAll('post_local_end', $arr); mod/uexport.php # Hook::callAll('uexport_options', $options); mod/register.php # Hook::callAll('register_post', $arr); Hook::callAll('register_form', $arr); mod/item.php # Hook::callAll('post_local_start', $_REQUEST); Hook::callAll('post_local', $datarray); Hook::callAll('post_local_end', $datarray); mod/editpost.php # Hook::callAll('jot_tool', $jotplugins); src/Network/FKOAuth1.php # Hook::callAll('logged_in', $a->user); src/Render/FriendicaSmartyEngine.php # Hook::callAll(\"template_vars\", $arr); src/Model/Item.php # Hook::callAll('post_local', $item); Hook::callAll('post_remote', $item); Hook::callAll('post_local_end', $posted_item); Hook::callAll('post_remote_end', $posted_item); Hook::callAll('tagged', $arr); Hook::callAll('post_local_end', $new_item); Hook::callAll('put_item_in_cache', $hook_data); Hook::callAll('prepare_body_init', $item); Hook::callAll('prepare_body_content_filter', $hook_data); Hook::callAll('prepare_body', $hook_data); Hook::callAll('prepare_body_final', $hook_data); src/Model/Contact.php # Hook::callAll('contact_photo_menu', $args); Hook::callAll('follow', $arr); src/Model/Profile.php # Hook::callAll('profile_sidebar_enter', $profile); Hook::callAll('profile_sidebar', $arr); Hook::callAll('profile_tabs', $arr); Hook::callAll('zrl_init', $arr); src/Model/Event.php # Hook::callAll('event_updated', $event['id']); Hook::callAll(\"event_created\", $event['id']); src/Model/User.php # Hook::callAll('register_account', $uid); Hook::callAll('remove_user', $user); src/Content/ContactBlock.php # Hook::callAll('contact_block_end', $arr); src/Content/Text/BBCode.php # Hook::callAll('bbcode', $text); Hook::callAll('bb2diaspora', $text); src/Content/Text/HTML.php # Hook::callAll('html2bbcode', $message); src/Content/Smilies.php # Hook::callAll('smilie', $params); src/Content/Feature.php # Hook::callAll('isEnabled', $arr); Hook::callAll('get', $arr); src/Content/ContactSelector.php # Hook::callAll('network_to_name', $nets); src/Content/OEmbed.php # Hook::callAll('oembed_fetch_url', $embedurl, $j); src/Content/Nav.php # Hook::callAll('page_header', DI::page()['nav']); Hook::callAll('nav_info', $nav); src/Core/Authentication.php # Hook::callAll('logged_in', $a->user); src/Core/Protocol.php # Hook::callAll('support_follow', $hook_data); Hook::callAll('support_revoke_follow', $hook_data); Hook::callAll('unfollow', $hook_data); Hook::callAll('revoke_follow', $hook_data); Hook::callAll('block', $hook_data); Hook::callAll('unblock', $hook_data); src/Core/StorageManager # Hook::callAll('storage_instance', $data); Hook::callAll('storage_config', $data); src/Module/Notifications/Ping.php # Hook::callAll('network_ping', $arr); src/Module/PermissionTooltip.php # Hook::callAll('lockview_content', $item); src/Worker/Directory.php # Hook::callAll('globaldir_update', $arr); src/Worker/Notifier.php # Hook::callAll('notifier_end', $target_item); src/Module/Login.php # Hook::callAll('authenticate', $addon_auth); Hook::callAll('login_hook', $o); src/Module/Logout.php # Hook::callAll(\"logging_out\"); src/Object/Post.php # Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); src/Core/ACL.php # Hook::callAll('contact_select_options', $x); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll('jot_networks', $jotnets); src/Core/Authentication.php # Hook::callAll('logged_in', $a->user); src/Core/Hook.php # self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata); src/Core/L10n/L10n.php # Hook::callAll('poke_verbs', $arr); src/Core/Worker.php # Hook::callAll(\"proc_run\", $arr); src/Util/Emailer.php # Hook::callAll('emailer_send_prepare', $email); Hook::callAll(\"emailer_send\", $hookdata); src/Util/Map.php # Hook::callAll('generate_map', $arr); Hook::callAll('generate_named_map', $arr); Hook::callAll('Map::getCoordinates', $arr); src/Util/Network.php # Hook::callAll('avatar_lookup', $avatar); src/Util/ParseUrl.php # Hook::callAll(\"getsiteinfo\", $siteinfo); src/Protocol/DFRN.php # Hook::callAll('atom_feed_end', $atom); Hook::callAll('atom_feed_end', $atom); src/Protocol/Email.php # Hook::callAll('email_getmessage', $message); Hook::callAll('email_getmessage_end', $ret);","title":"Addons"},{"location":"de/developer/addons/#friendica-addon-entwicklung","text":"Bitte schau dir das Beispiel-Addon \"randplace\" f\u00fcr ein funktionierendes Beispiel f\u00fcr manche der hier aufgef\u00fchrten Funktionen an. Das Facebook-Addon bietet ein Beispiel daf\u00fcr, die \"addon\"- und \"module\"-Funktion gemeinsam zu integrieren. Addons arbeiten, indem sie Event Hooks abfangen. Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden. Addon-Namen k\u00f6nnen keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt. Du kannst einen lesbaren Namen im Kommentarblock eintragen. Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-Namen basieren; z.B. \"addon1name_install()\". Diese beiden Funktionen haben keine Argumente und sind daf\u00fcr verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Addon ben\u00f6tigt. Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgef\u00fchrt (z.B. neu installiert), wenn sich das Addon nach der Installation \u00e4ndert - somit sollte deine Deinstallationsfunktion keine Daten zerst\u00f6rt und deine Installationsfunktion sollte bestehende Daten ber\u00fccksichtigen. Zuk\u00fcnftige Extensions werden m\u00f6glicherweise \"Setup\" und \"Entfernen\" anbieten. Addons sollten einen Kommentarblock mit den folgenden vier Parametern enthalten: <? php /* * Name: My Great Addon * Description: This is what my addon does. It's really cool. * Version: 1.0 * Author: John Q. Public <john@myfriendicasite.com> */ Registriere deine Addon-Hooks w\u00e4hrend der Installation. <? php \\Friendica\\Core\\Hook :: register ( $hookname , $file , $function ); $hookname ist ein String und entspricht einem bekannten Friendica-Hook. $file steht f\u00fcr den Pfadnamen, der relativ zum Top-Level-Friendica-Verzeichnis liegt. Das sollte addon/addon_name/addon_name.php sein. $function ist ein String und der Name der Funktion, die ausgef\u00fchrt wird, wenn der Hook aufgerufen wird.","title":"Friendica Addon Entwicklung"},{"location":"de/developer/addons/#argumente","text":"Deine Hook-Callback-Funktion wird mit mindestens einem und bis zu zwei Argumenten aufgerufen <? php function myhook_function ( App $a , & $b ) { } Wenn du \u00c4nderungen an den aufgerufenen Daten vornehmen willst, musst du diese als Referenzvariable (mit \"&\") w\u00e4hrend der Funktionsdeklaration deklarieren. $a ist die Friendica \"App\"-Klasse, die eine Menge an Informationen \u00fcber den aktuellen Friendica-Status beinhaltet, u.a. welche Module genutzt werden, Konfigurationsinformationen, Inhalte der Seite zum Zeitpunkt des Hook-Aufrufs. Es ist empfohlen, diese Funktion \"$a\" zu nennen, um seine Nutzung an den Gebrauch an anderer Stelle anzugleichen. $b kann frei benannt werden. Diese Information ist speziell auf den Hook bezogen, der aktuell bearbeitet wird, und beinhaltet normalerweise Daten, die du sofort nutzen, anzeigen oder bearbeiten kannst. Achte darauf, diese mit \"&\" zu deklarieren, wenn du sie bearbeiten willst.","title":"Argumente"},{"location":"de/developer/addons/#module","text":"Addons k\u00f6nnen auch als \"Module\" agieren und alle Seitenanfragen f\u00fcr eine bestimmte URL abfangen. Um ein Addon als Modul zu nutzen, ist es n\u00f6tig, die Funktion \"addon_name_module()\" zu definieren, die keine Argumente ben\u00f6tigt und nichts weiter machen muss. Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen f\u00fcr \"http://example.com/addon_name\" erhalten - mit allen URL-Komponenten als zus\u00e4tzliche Argumente. Diese werden in das App\\Arguments Objekt geparst. So w\u00fcrde http://example.com/addon/arg1/arg2 dies ergeben: <? php DI :: args () -> getArgc (); // = 3 DI :: args () -> get ( 0 ); // = 'addon' DI :: args () -> get ( 1 ); // = 'arg1' DI :: args () -> get ( 2 ); // = 'arg2' Deine Modulfunktionen umfassen oft die Funktion addon_name_content(App $a), welche den Seiteninhalt definiert und zur\u00fcckgibt. Sie k\u00f6nnen auch addon_name_post(App $a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt. Du kannst ebenso addon_name_init(App $a) nutzen, was oft fr\u00fchzeitig aufgerufen wird und das Modul initialisiert.","title":"Module"},{"location":"de/developer/addons/#derzeitige-hooks","text":"'authenticate' - wird aufgerufen, wenn sich der User einloggt. $b ist ein Array 'username' => der \u00fcbertragene Nutzername 'password' => das \u00fcbertragene Passwort 'authenticated' => setze das auf einen anderen Wert als \"0\", damit der User sich authentifiziert 'user_record' => die erfolgreiche Authentifizierung muss auch einen g\u00fcltigen Nutzereintrag aus der Datenbank zur\u00fcckgeben 'logged_in' - wird aufgerufen, sobald ein Nutzer sich erfolgreich angemeldet hat. $b beinhaltet den $a->Nutzer-Array 'display_item' - wird aufgerufen, wenn ein Beitrag f\u00fcr die Anzeige formatiert wird. $b ist ein Array 'item' => Die Item-Details (Array), die von der Datenbank ausgegeben werden 'output' => Die HTML-Ausgabe (String) des Items, bevor es zur Seite hinzugef\u00fcgt wird 'post_local' - wird aufgerufen, wenn der Statusbeitrag oder ein Kommentar im lokalen System eingetragen wird. $b ist das Item-Array der Information, die in der Datenbank hinterlegt wird. {Bitte beachte: Der Seiteninhalt ist bbcode - nicht HTML) 'post_local_end' - wird aufgerufen, wenn ein lokaler Statusbeitrag oder Kommentar im lokalen System gespeichert wird. $b ist das Item-Array einer Information, die gerade in der Datenbank gespeichert wurden. {Bitte beachte: Der Seiteninhalt ist bbcode - nicht HTML) 'post_remote' - wird aufgerufen, wenn ein Beitrag aus einer anderen Quelle empfangen wird. Dies kann auch genutzt werden, um lokale Aktivit\u00e4ten oder systemgenerierte Nachrichten zu ver\u00f6ffentlichen/posten. $b ist das Item-Array einer Information, die in der Datenbank und im Item gespeichert ist. {Bitte beachte: Der Seiteninhalt ist bbcode - nicht HTML) 'addon_settings' - wird aufgerufen, wenn die HTML-Ausgabe der Addon-Einstellungsseite generiert wird. $b ist die HTML-Ausgabe (String) der Addon-Einstellungsseite vor dem finalen \" \"-Tag. 'addon_settings_post' - wird aufgerufen, wenn die Addon-Einstellungsseite geladen wird. $b ist der $_POST-Array 'profile_post' - wird aufgerufen, wenn die Profilseite angezeigt wird. $b ist der $_POST-Array 'profile_edit' - wird aufgerufen, bevor die Profil-Bearbeitungsseite angezeigt wird. $b ist ein Array 'profile' => Profileintrag (Array) aus der Datenbank 'entry' => die HTML-Ausgabe (string) des generierten Eintrags 'profile_advanced' - wird aufgerufen, wenn die HTML-Ausgabe f\u00fcr das \"Advanced profile\" generiert wird; stimmt mit dem \"Profil\"-Tab auf der Profilseite der Nutzer \u00fcberein. $b ist die HTML-Ausgabe (String) des erstellten Profils (Die Details des Profil-Arrays sind in $a->profile) 'directory_item' - wird von der Verzeichnisseite aufgerufen, wenn ein Item f\u00fcr die Anzeige formatiert wird. $b ist ein Array 'contact' => Kontakteintrag (Array) einer Person aus der Datenbank 'entry' => die HTML-Ausgabe (String) des generierten Eintrags 'profile_sidebar_enter' - wird aufgerufen, bevor die Sidebar \"Kurzprofil\" einer Seite erstellt wird. $b ist der Profil-Array einer Person 'profile_sidebar' - wird aufgerufen, wenn die Sidebar \"Kurzprofil\" einer Seite erstellt wird. $b ist ein Array 'profile' => Kontakteintrag (Array) einer Person aus der Datenbank 'entry' => die HTML-Ausgabe (String) des generierten Eintrags 'contact_block_end' - wird aufgerufen, wenn der Block \"Kontakte/Freunde\" der Profil-Sidebar komplett formatiert wurde. $b ist ein Array 'contacts' => Array von \"contacts\" 'output' => die HTML-Ausgabe (String) des Kontaktblocks 'bbcode' - wird w\u00e4hrend der Umwandlung von bbcode auf HTML aufgerufen. $b ist der konvertierte Text (String) 'html2bbcode' - wird w\u00e4hrend der Umwandlung von HTML zu bbcode aufgerufen (z.B. bei Nachrichtenbeitr\u00e4gen). $b ist der konvertierte Text (String) 'page_header' - wird aufgerufen, nachdem der Bereich der Seitennavigation geladen wurde. $b ist die HTML-Ausgabe (String) der \"nav\"-Region 'personal_xrd' - wird aufgerufen, bevor die Ausgabe der pers\u00f6nlichen XRD-Datei erzeugt wird. $b ist ein Array 'user' => die hinterlegten Eintr\u00e4ge der Person 'xml' => die komplette XML-Datei die ausgegeben wird 'home_content' - wird aufgerufen, bevor die Ausgabe des Homepage-Inhalts erstellt wird; wird nicht eingeloggten Nutzern angezeigt. $b ist die HTML-Ausgabe (String) der Auswahlregion 'contact_edit' - wird aufgerufen, wenn die Kontaktdetails vom Nutzer auf der \"Kontakte\"-Seite bearbeitet werden. $b ist ein Array 'contact' => Kontakteintrag (Array) des abgezielten Kontakts 'output' => die HTML-Ausgabe (String) der \"Kontakt bearbeiten\"-Seite 'contact_edit_post' - wird aufgerufen, wenn die \"Kontakt bearbeiten\"-Seite ausgegeben wird. $b ist der $_POST-Array 'init_1' - wird aufgerufen, kurz nachdem die Datenbank vor Beginn der Sitzung ge\u00f6ffnet wird. $b wird nicht genutzt 'page_end' - wird aufgerufen, nachdem die Funktion des HTML-Inhalts komplett abgeschlossen ist. $b ist die HTML-Ausgabe (String) vom Inhalt-\"div\" 'avatar_lookup' - wird aufgerufen, wenn der Avatar geladen wird. $b ist ein Array 'size' => Gr\u00f6\u00dfe des Avatars, der geladen wird 'email' => Email-Adresse, um nach dem Avatar zu suchen 'url' => generierte URL (String) des Avatars 'nav_info' - wird aufgerufen, nachdem in include/nav.php der Inhalt des Navigationsmen\u00fcs erzeugt wurde. - $b ist ein Array, das $nav widerspiegelt.","title":"Derzeitige Hooks"},{"location":"de/developer/addons/#komplette-liste-der-hook-callbacks","text":"Eine komplette Liste aller Hook-Callbacks mit den zugeh\u00f6rigen Dateien (am 01-Apr-2018 generiert): Bitte schau in die Quellcodes f\u00fcr Details zu Hooks, die oben nicht dokumentiert sind.","title":"Komplette Liste der Hook-Callbacks"},{"location":"de/developer/addons/#indexphp","text":"Hook::callAll('init_1'); Hook::callAll('app_menu', $arr); Hook::callAll('page_content_top', DI::page()['content']); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_init', $placeholder); Hook::callAll($a->module.'_mod_post', $_POST); Hook::callAll($a->module.'_mod_content', $arr); Hook::callAll($a->module.'_mod_aftercontent', $arr); Hook::callAll('page_end', DI::page()['content']);","title":"index.php"},{"location":"de/developer/addons/#includeapiphp","text":"Hook::callAll('logged_in', $a->user); Hook::callAll('authenticate', $addon_auth); Hook::callAll('logged_in', $a->user);","title":"include/api.php"},{"location":"de/developer/addons/#includeenotifyphp","text":"Hook::callAll('enotify', $h); Hook::callAll('enotify_store', $datarray); Hook::callAll('enotify_mail', $datarray); Hook::callAll('check_item_notification', $notification_data);","title":"include/enotify.php"},{"location":"de/developer/addons/#srccontentconversationphp","text":"Hook::callAll('conversation_start', $cb); Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr); Hook::callAll('display_item', $arr); Hook::callAll('item_photo_menu', $args); Hook::callAll('jot_tool', $jotplugins);","title":"src/Content/Conversation.php"},{"location":"de/developer/addons/#moddirectoryphp","text":"Hook::callAll('directory_item', $arr);","title":"mod/directory.php"},{"location":"de/developer/addons/#modxrdphp","text":"Hook::callAll('personal_xrd', $arr);","title":"mod/xrd.php"},{"location":"de/developer/addons/#modparse_urlphp","text":"Hook::callAll(\"parse_link\", $arr);","title":"mod/parse_url.php"},{"location":"de/developer/addons/#srcmoduledelegationphp","text":"Hook::callAll('home_init', $ret);","title":"src/Module/Delegation.php"},{"location":"de/developer/addons/#modaclphp","text":"Hook::callAll('acl_lookup_end', $results);","title":"mod/acl.php"},{"location":"de/developer/addons/#modnetworkphp","text":"Hook::callAll('network_content_init', $arr); Hook::callAll('network_tabs', $arr);","title":"mod/network.php"},{"location":"de/developer/addons/#modfriendicaphp","text":"Hook::callAll('about_hook', $o);","title":"mod/friendica.php"},{"location":"de/developer/addons/#modprofilesphp","text":"Hook::callAll('profile_post', $_POST); Hook::callAll('profile_edit', $arr);","title":"mod/profiles.php"},{"location":"de/developer/addons/#modsettingsphp","text":"Hook::callAll('addon_settings_post', $_POST); Hook::callAll('connector_settings_post', $_POST); Hook::callAll('display_settings_post', $_POST); Hook::callAll('addon_settings', $settings_addons); Hook::callAll('connector_settings', $settings_connectors); Hook::callAll('display_settings', $o);","title":"mod/settings.php"},{"location":"de/developer/addons/#modphotosphp","text":"Hook::callAll('photo_post_init', $_POST); Hook::callAll('photo_post_file', $ret); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', $foo); Hook::callAll('photo_post_end', intval($item_id)); Hook::callAll('photo_upload_form', $ret);","title":"mod/photos.php"},{"location":"de/developer/addons/#modprofilephp","text":"Hook::callAll('profile_advanced', $o);","title":"mod/profile.php"},{"location":"de/developer/addons/#modhomephp","text":"Hook::callAll('home_init', $ret); Hook::callAll(\"home_content\", $content);","title":"mod/home.php"},{"location":"de/developer/addons/#modpokephp","text":"Hook::callAll('post_local_end', $arr);","title":"mod/poke.php"},{"location":"de/developer/addons/#modcontactsphp","text":"Hook::callAll('contact_edit_post', $_POST); Hook::callAll('contact_edit', $arr);","title":"mod/contacts.php"},{"location":"de/developer/addons/#modtaggerphp","text":"Hook::callAll('post_local_end', $arr);","title":"mod/tagger.php"},{"location":"de/developer/addons/#moduexportphp","text":"Hook::callAll('uexport_options', $options);","title":"mod/uexport.php"},{"location":"de/developer/addons/#modregisterphp","text":"Hook::callAll('register_post', $arr); Hook::callAll('register_form', $arr);","title":"mod/register.php"},{"location":"de/developer/addons/#moditemphp","text":"Hook::callAll('post_local_start', $_REQUEST); Hook::callAll('post_local', $datarray); Hook::callAll('post_local_end', $datarray);","title":"mod/item.php"},{"location":"de/developer/addons/#modeditpostphp","text":"Hook::callAll('jot_tool', $jotplugins);","title":"mod/editpost.php"},{"location":"de/developer/addons/#srcnetworkfkoauth1php","text":"Hook::callAll('logged_in', $a->user);","title":"src/Network/FKOAuth1.php"},{"location":"de/developer/addons/#srcrenderfriendicasmartyenginephp","text":"Hook::callAll(\"template_vars\", $arr);","title":"src/Render/FriendicaSmartyEngine.php"},{"location":"de/developer/addons/#srcmodelitemphp","text":"Hook::callAll('post_local', $item); Hook::callAll('post_remote', $item); Hook::callAll('post_local_end', $posted_item); Hook::callAll('post_remote_end', $posted_item); Hook::callAll('tagged', $arr); Hook::callAll('post_local_end', $new_item); Hook::callAll('put_item_in_cache', $hook_data); Hook::callAll('prepare_body_init', $item); Hook::callAll('prepare_body_content_filter', $hook_data); Hook::callAll('prepare_body', $hook_data); Hook::callAll('prepare_body_final', $hook_data);","title":"src/Model/Item.php"},{"location":"de/developer/addons/#srcmodelcontactphp","text":"Hook::callAll('contact_photo_menu', $args); Hook::callAll('follow', $arr);","title":"src/Model/Contact.php"},{"location":"de/developer/addons/#srcmodelprofilephp","text":"Hook::callAll('profile_sidebar_enter', $profile); Hook::callAll('profile_sidebar', $arr); Hook::callAll('profile_tabs', $arr); Hook::callAll('zrl_init', $arr);","title":"src/Model/Profile.php"},{"location":"de/developer/addons/#srcmodeleventphp","text":"Hook::callAll('event_updated', $event['id']); Hook::callAll(\"event_created\", $event['id']);","title":"src/Model/Event.php"},{"location":"de/developer/addons/#srcmodeluserphp","text":"Hook::callAll('register_account', $uid); Hook::callAll('remove_user', $user);","title":"src/Model/User.php"},{"location":"de/developer/addons/#srccontentcontactblockphp","text":"Hook::callAll('contact_block_end', $arr);","title":"src/Content/ContactBlock.php"},{"location":"de/developer/addons/#srccontenttextbbcodephp","text":"Hook::callAll('bbcode', $text); Hook::callAll('bb2diaspora', $text);","title":"src/Content/Text/BBCode.php"},{"location":"de/developer/addons/#srccontenttexthtmlphp","text":"Hook::callAll('html2bbcode', $message);","title":"src/Content/Text/HTML.php"},{"location":"de/developer/addons/#srccontentsmiliesphp","text":"Hook::callAll('smilie', $params);","title":"src/Content/Smilies.php"},{"location":"de/developer/addons/#srccontentfeaturephp","text":"Hook::callAll('isEnabled', $arr); Hook::callAll('get', $arr);","title":"src/Content/Feature.php"},{"location":"de/developer/addons/#srccontentcontactselectorphp","text":"Hook::callAll('network_to_name', $nets);","title":"src/Content/ContactSelector.php"},{"location":"de/developer/addons/#srccontentoembedphp","text":"Hook::callAll('oembed_fetch_url', $embedurl, $j);","title":"src/Content/OEmbed.php"},{"location":"de/developer/addons/#srccontentnavphp","text":"Hook::callAll('page_header', DI::page()['nav']); Hook::callAll('nav_info', $nav);","title":"src/Content/Nav.php"},{"location":"de/developer/addons/#srccoreauthenticationphp","text":"Hook::callAll('logged_in', $a->user);","title":"src/Core/Authentication.php"},{"location":"de/developer/addons/#srccoreprotocolphp","text":"Hook::callAll('support_follow', $hook_data); Hook::callAll('support_revoke_follow', $hook_data); Hook::callAll('unfollow', $hook_data); Hook::callAll('revoke_follow', $hook_data); Hook::callAll('block', $hook_data); Hook::callAll('unblock', $hook_data);","title":"src/Core/Protocol.php"},{"location":"de/developer/addons/#srccorestoragemanager","text":"Hook::callAll('storage_instance', $data); Hook::callAll('storage_config', $data);","title":"src/Core/StorageManager"},{"location":"de/developer/addons/#srcmodulenotificationspingphp","text":"Hook::callAll('network_ping', $arr);","title":"src/Module/Notifications/Ping.php"},{"location":"de/developer/addons/#srcmodulepermissiontooltipphp","text":"Hook::callAll('lockview_content', $item);","title":"src/Module/PermissionTooltip.php"},{"location":"de/developer/addons/#srcworkerdirectoryphp","text":"Hook::callAll('globaldir_update', $arr);","title":"src/Worker/Directory.php"},{"location":"de/developer/addons/#srcworkernotifierphp","text":"Hook::callAll('notifier_end', $target_item);","title":"src/Worker/Notifier.php"},{"location":"de/developer/addons/#srcmoduleloginphp","text":"Hook::callAll('authenticate', $addon_auth); Hook::callAll('login_hook', $o);","title":"src/Module/Login.php"},{"location":"de/developer/addons/#srcmodulelogoutphp","text":"Hook::callAll(\"logging_out\");","title":"src/Module/Logout.php"},{"location":"de/developer/addons/#srcobjectpostphp","text":"Hook::callAll('render_location', $locate); Hook::callAll('display_item', $arr);","title":"src/Object/Post.php"},{"location":"de/developer/addons/#srccoreaclphp","text":"Hook::callAll('contact_select_options', $x); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll($a->module.'_pre_'.$selname, $arr); Hook::callAll($a->module.'_post_'.$selname, $o); Hook::callAll('jot_networks', $jotnets);","title":"src/Core/ACL.php"},{"location":"de/developer/addons/#srccoreauthenticationphp_1","text":"Hook::callAll('logged_in', $a->user);","title":"src/Core/Authentication.php"},{"location":"de/developer/addons/#srccorehookphp","text":"self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata);","title":"src/Core/Hook.php"},{"location":"de/developer/addons/#srccorel10nl10nphp","text":"Hook::callAll('poke_verbs', $arr);","title":"src/Core/L10n/L10n.php"},{"location":"de/developer/addons/#srccoreworkerphp","text":"Hook::callAll(\"proc_run\", $arr);","title":"src/Core/Worker.php"},{"location":"de/developer/addons/#srcutilemailerphp","text":"Hook::callAll('emailer_send_prepare', $email); Hook::callAll(\"emailer_send\", $hookdata);","title":"src/Util/Emailer.php"},{"location":"de/developer/addons/#srcutilmapphp","text":"Hook::callAll('generate_map', $arr); Hook::callAll('generate_named_map', $arr); Hook::callAll('Map::getCoordinates', $arr);","title":"src/Util/Map.php"},{"location":"de/developer/addons/#srcutilnetworkphp","text":"Hook::callAll('avatar_lookup', $avatar);","title":"src/Util/Network.php"},{"location":"de/developer/addons/#srcutilparseurlphp","text":"Hook::callAll(\"getsiteinfo\", $siteinfo);","title":"src/Util/ParseUrl.php"},{"location":"de/developer/addons/#srcprotocoldfrnphp","text":"Hook::callAll('atom_feed_end', $atom); Hook::callAll('atom_feed_end', $atom);","title":"src/Protocol/DFRN.php"},{"location":"de/developer/addons/#srcprotocolemailphp","text":"Hook::callAll('email_getmessage', $message); Hook::callAll('email_getmessage_end', $ret);","title":"src/Protocol/Email.php"},{"location":"de/spec/protocol/message-flow/","tags":["specification","protocol","develop"],"text":"Friendica Nachrichtenfluss # Diese Seite soll einige Informationen dar\u00fcber dokumentieren, wie Nachrichten innerhalb von Friendica von einer Person zur anderen \u00fcbertragen werden. Es gibt verschiedene Pfade, die verschiedene Protokolle und Nachrichtenformate nutzen. Diejenigen, die den Nachrichtenfluss genauer verstehen wollen, sollten sich mindestens mit dem DFRN-Protokoll ( Dokument mit den DFRN Spezifikationen ) und den Elementen zur Nachrichtenverarbeitung des OStatus Stack informieren (salmon und Pubsubhubbub). Wenn eine Nachricht ver\u00f6ffentlicht wird, werden alle \u00dcbermittlungen an alle Netzwerke mit include/notifier.php durchgef\u00fchrt, welche entscheidet, wie und an wen die Nachricht geliefert wird. Diese Datei bindet dabei die lokale Bearbeitung aller \u00dcbertragungen ein inklusive dfrn-notify. mod/dfrn_notify.php handhabt die R\u00fcckmeldung (remote side) von dfrn-notify. Lokale Feeds werden durch mod/dfrn_poll.php generiert - was ebenfalls die R\u00fcckmeldung (remote side) von dfrn-notify handhabt. Salmon-Benachrichtigungen kommen via mod/salmon.php an. PuSh-Feeds (pubsubhubbub) kommen via mod/pubsub.php an. DFRN-poll Feed-Imports kommen via src/Worker/OnePoll.php als geplanter Task an, das implementiert die lokale Bearbeitung (local side) des DFRN-Protokolls. Szenario #1. Bob schreibt eine \u00f6ffentliche Statusnachricht # Dies ist eine \u00f6ffentliche Nachricht ohne begrenzte Nutzerfreigabe, sodass keine private \u00dcbertragung notwendig ist. Es gibt zwei Wege, die genutzt werden k\u00f6nnen - als bbcode an DFRN-Clients oder als durch den Server konvertierten HTML-Code (mit PuSH; pubsubhubbub). Wenn ein PuSH-Hub einsatzf\u00e4hig ist, nutzen DFRN-Poll-Clients vorrangig die Informationen, die durch den PuSH-Kanal kommen. Sie fallen zur\u00fcck auf eine t\u00e4gliche Abfrage, wenn der Hub \u00dcbertragungsschwierigkeiten hat (das kann vorkommen, wenn der standardm\u00e4\u00dfige Google-Referenzhub genutzt wird). Wenn kein spezifizierter Hub oder Hubs ausgew\u00e4hlt sind, werden DFRN-Clients in einer pro Kontakt konfigurierbaren Rate mit bis zu 5-Minuten-Intervallen abfragen. Feeds, die via DFRN-Poll abgerufen werden, sind bbcode und k\u00f6nnen auch private Unterhaltungen enthalten, die vom Poller auf ihre Zugriffsrechte hin gepr\u00fcft werden. Szenario #2. Jack antwortet auf Bobs \u00f6ffentliche Nachricht. Jack ist im Friendica/DFRN-Netzwerk. # Jack nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist und dfrn-notify nutzt. Die PuSH-Hubs werden dar\u00fcber informiert, dass neuer Inhalt verf\u00fcgbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und \u00fcbertragen diese an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken geh\u00f6ren k\u00f6nnen). Szenario #3. Mary antwortet auf Bobs \u00f6ffentliche Nachricht. Mary ist im Friendica/DFRN-Netzwerk. # Mary nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist (mit Ausnahme von Bob selbst; die Unterhaltung wird nun an Jack und Mary geschickt). Die Nachrichten werden mit dfrn-notify \u00fcbertragen. PuSH-Hubs werden dar\u00fcber informiert, dass neuer Inhalt verf\u00fcgbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und \u00fcbertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken geh\u00f6ren k\u00f6nnen). Szenario #4. William antwortet auf Bobs \u00f6ffentliche Nachricht. William ist in einem OStatus-Netzwerk. # William nutzt salmon, um Bob \u00fcber seine Antwort zu benachrichtigen. Der Inhalt ist HTML-Code, der in das Salmon Magic Envelope eingebettet ist. Bob erstellt dann einen Feed der Unterhaltung und sendet es an alle Friendica-Nutzer, die an der Unterhaltung beteiligt sind und dfrn-notify nutzen (mit Ausnahme von William selbst; die Unterhaltung wird an Jack und Mary weitergeleitet). PuSH-Hubs werden dar\u00fcber informiert, dass neuer Inhalt verf\u00fcgbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und \u00fcbertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken geh\u00f6ren k\u00f6nnen). Szenario #5. Bob schreibt eine private Nachricht an Mary und Jack. # Die Nachricht wird sofort an Mary und Jack mithilfe von dfrn_notify geschickt. \u00d6ffentliche Hubs werden nicht benachrichtigt. Im Falle eines Timeouts wird eine erneute Verarbeitung angesto\u00dfen. Antworten folgen dem gleichen Nachrichtenfluss wie \u00f6ffentliche Antworten, allerdings werden die Hubs nicht dar\u00fcber informiert, wodurch die Nachrichten niemals in \u00f6ffentliche Feeds gelangen. Die komplette Unterhaltung ist nur f\u00fcr Mary und Jack in ihren durch dfrn-poll personalisierten Feeds verf\u00fcgbar (und f\u00fcr niemanden sonst).","title":"Nachrichtenfluss"},{"location":"de/spec/protocol/message-flow/#friendica-nachrichtenfluss","text":"Diese Seite soll einige Informationen dar\u00fcber dokumentieren, wie Nachrichten innerhalb von Friendica von einer Person zur anderen \u00fcbertragen werden. Es gibt verschiedene Pfade, die verschiedene Protokolle und Nachrichtenformate nutzen. Diejenigen, die den Nachrichtenfluss genauer verstehen wollen, sollten sich mindestens mit dem DFRN-Protokoll ( Dokument mit den DFRN Spezifikationen ) und den Elementen zur Nachrichtenverarbeitung des OStatus Stack informieren (salmon und Pubsubhubbub). Wenn eine Nachricht ver\u00f6ffentlicht wird, werden alle \u00dcbermittlungen an alle Netzwerke mit include/notifier.php durchgef\u00fchrt, welche entscheidet, wie und an wen die Nachricht geliefert wird. Diese Datei bindet dabei die lokale Bearbeitung aller \u00dcbertragungen ein inklusive dfrn-notify. mod/dfrn_notify.php handhabt die R\u00fcckmeldung (remote side) von dfrn-notify. Lokale Feeds werden durch mod/dfrn_poll.php generiert - was ebenfalls die R\u00fcckmeldung (remote side) von dfrn-notify handhabt. Salmon-Benachrichtigungen kommen via mod/salmon.php an. PuSh-Feeds (pubsubhubbub) kommen via mod/pubsub.php an. DFRN-poll Feed-Imports kommen via src/Worker/OnePoll.php als geplanter Task an, das implementiert die lokale Bearbeitung (local side) des DFRN-Protokolls.","title":"Friendica Nachrichtenfluss"},{"location":"de/spec/protocol/message-flow/#szenario-1-bob-schreibt-eine-offentliche-statusnachricht","text":"Dies ist eine \u00f6ffentliche Nachricht ohne begrenzte Nutzerfreigabe, sodass keine private \u00dcbertragung notwendig ist. Es gibt zwei Wege, die genutzt werden k\u00f6nnen - als bbcode an DFRN-Clients oder als durch den Server konvertierten HTML-Code (mit PuSH; pubsubhubbub). Wenn ein PuSH-Hub einsatzf\u00e4hig ist, nutzen DFRN-Poll-Clients vorrangig die Informationen, die durch den PuSH-Kanal kommen. Sie fallen zur\u00fcck auf eine t\u00e4gliche Abfrage, wenn der Hub \u00dcbertragungsschwierigkeiten hat (das kann vorkommen, wenn der standardm\u00e4\u00dfige Google-Referenzhub genutzt wird). Wenn kein spezifizierter Hub oder Hubs ausgew\u00e4hlt sind, werden DFRN-Clients in einer pro Kontakt konfigurierbaren Rate mit bis zu 5-Minuten-Intervallen abfragen. Feeds, die via DFRN-Poll abgerufen werden, sind bbcode und k\u00f6nnen auch private Unterhaltungen enthalten, die vom Poller auf ihre Zugriffsrechte hin gepr\u00fcft werden.","title":"Szenario #1. Bob schreibt eine \u00f6ffentliche Statusnachricht"},{"location":"de/spec/protocol/message-flow/#szenario-2-jack-antwortet-auf-bobs-offentliche-nachricht-jack-ist-im-friendicadfrn-netzwerk","text":"Jack nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist und dfrn-notify nutzt. Die PuSH-Hubs werden dar\u00fcber informiert, dass neuer Inhalt verf\u00fcgbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und \u00fcbertragen diese an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken geh\u00f6ren k\u00f6nnen).","title":"Szenario #2. Jack antwortet auf Bobs \u00f6ffentliche Nachricht. Jack ist im Friendica/DFRN-Netzwerk."},{"location":"de/spec/protocol/message-flow/#szenario-3-mary-antwortet-auf-bobs-offentliche-nachricht-mary-ist-im-friendicadfrn-netzwerk","text":"Mary nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist (mit Ausnahme von Bob selbst; die Unterhaltung wird nun an Jack und Mary geschickt). Die Nachrichten werden mit dfrn-notify \u00fcbertragen. PuSH-Hubs werden dar\u00fcber informiert, dass neuer Inhalt verf\u00fcgbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und \u00fcbertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken geh\u00f6ren k\u00f6nnen).","title":"Szenario #3. Mary antwortet auf Bobs \u00f6ffentliche Nachricht. Mary ist im Friendica/DFRN-Netzwerk."},{"location":"de/spec/protocol/message-flow/#szenario-4-william-antwortet-auf-bobs-offentliche-nachricht-william-ist-in-einem-ostatus-netzwerk","text":"William nutzt salmon, um Bob \u00fcber seine Antwort zu benachrichtigen. Der Inhalt ist HTML-Code, der in das Salmon Magic Envelope eingebettet ist. Bob erstellt dann einen Feed der Unterhaltung und sendet es an alle Friendica-Nutzer, die an der Unterhaltung beteiligt sind und dfrn-notify nutzen (mit Ausnahme von William selbst; die Unterhaltung wird an Jack und Mary weitergeleitet). PuSH-Hubs werden dar\u00fcber informiert, dass neuer Inhalt verf\u00fcgbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und \u00fcbertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken geh\u00f6ren k\u00f6nnen).","title":"Szenario #4. William antwortet auf Bobs \u00f6ffentliche Nachricht. William ist in einem OStatus-Netzwerk."},{"location":"de/spec/protocol/message-flow/#szenario-5-bob-schreibt-eine-private-nachricht-an-mary-und-jack","text":"Die Nachricht wird sofort an Mary und Jack mithilfe von dfrn_notify geschickt. \u00d6ffentliche Hubs werden nicht benachrichtigt. Im Falle eines Timeouts wird eine erneute Verarbeitung angesto\u00dfen. Antworten folgen dem gleichen Nachrichtenfluss wie \u00f6ffentliche Antworten, allerdings werden die Hubs nicht dar\u00fcber informiert, wodurch die Nachrichten niemals in \u00f6ffentliche Feeds gelangen. Die komplette Unterhaltung ist nur f\u00fcr Mary und Jack in ihren durch dfrn-poll personalisierten Feeds verf\u00fcgbar (und f\u00fcr niemanden sonst).","title":"Szenario #5. Bob schreibt eine private Nachricht an Mary und Jack."},{"location":"de/user/account-basics/","tags":["user"],"text":"Account - Basics # Registrierung # Viele, aber nicht alle Friendica-Knoten (Server) bieten die M\u00f6glichkeit zur Registrierung an. Falls der Friendica-Knoten, den Du besuchst, keine Registrierung anbietet, oder Du glaubst, dass Dir ein anderer Knoten m\u00f6glicherweise besser gef\u00e4llt, dann findest Du hier eine Liste von \u00f6ffentlichen Friendica-Knoten , aus der Du Dir einen netten Knoten heraussuchen kannst. Auf der Startseite des Knotens wird unter dem Login-Feld ein \"Registrieren\"-Link angezeigt. Dieser Link f\u00fchrt dann direkt auf das Registrierungsformular. OpenID # Falls du keine OpenID-Adresse hast, kannst du diesen Punkt ignorieren. Solltest du eine OpenID Adresse haben, kannst du sie im ersten Feld eintragen und \"Registrieren\" klicken. Friendica wird versuchen, so viele Informationen wie m\u00f6glich von deinem OpenID-Provider zu \u00fcbernehmen, um diese in dein Profil auf dieser Seite einzutragen. Dein vollst\u00e4ndiger Name # Bitte trage bei \"vollst\u00e4ndiger Name\" Deinen gew\u00fcnschten Namen ein, wie er \u00fcber deinen Beitr\u00e4gen angezeigt werden soll. Du kannst deinen echten Namen eintragen, kannst dir aber auch einen Namen ausdenken. Einen Zwang zu dem sogenannten Klarnamen gibt es nicht. Email-Adresse # Bitte trage eine richtige E-Mail-Adresse ein. Dies ist die einzige pers\u00f6nliche Information, die korrekt sein muss. Deine E-Mail-Adresse wird niemals ver\u00f6ffentlicht. Wir ben\u00f6tigen diese, um Dir Account-Informationen, das Initialpasswort und die Login-Daten zu schicken. Oder z.B. Dein Passwort zur\u00fcckzusetzen. Du erh\u00e4ltst zudem von Zeit zu Zeit Benachrichtigungen \u00fcber eingegangene Nachrichten oder Punkte, die Deine Aufmerksamkeit ben\u00f6tigen. Diese Nachrichten sind in den Einstellungen jederzeit an- oder abschaltbar. Spitzname/Nickname # Der Spitzname wird ben\u00f6tigt, um eine Webadresse (Profiladresse) f\u00fcr viele Deiner pers\u00f6nlichen Seiten zu erstellen. Auch wird dieser wie eine E-Mail-Adresse genutzt, wenn eine Verbindung zu anderen Personen hergestellt werden soll. Durch die Art, wie der Spitzname genutzt wird, gibt es bestimmte Einschr\u00e4nkungen: er muss mit einem Buchstaben beginnen er darf nur US-ASCII-Textzeichen und Nummern enthalten er muss einzigartig auf diesem Friendica-Knoten sein er kann sp\u00e4ter nicht mehr ge\u00e4ndert werden Dieser Spitzname wird an vielen Stellen genutzt, um Deinen Account zu identifizieren, daher ist es nicht m\u00f6glich ihn sp\u00e4ter zu \u00e4ndern. Verzeichnis-Eintrag # Das Registrierungsformular erlaubt es dir, direkt auszuw\u00e4hlen, ob du im Onlineverzeichnis (Friendica Directory) aufgelistet wirst oder nicht. Das ist wie ein Telefonbuch und du entscheidest, ob du darin eingetragen werden m\u00f6chtest. Wir bitten dich, \"Ja\" zu w\u00e4hlen, damit Andere dich finden k\u00f6nnen, so wie du sie finden kannst W\u00e4hlst Du \"Nein\", bist Du f\u00fcr Andere nicht einfach auffindbar Was auch immer Du w\u00e4hlst, kann jederzeit nach dem Login in Deinen Account-Einstellungen ge\u00e4ndert werden. Registrierung # Sobald Du die n\u00f6tigen Informationen eingegeben hast, klicke auf \"Registrieren\". Eine E-Mail mit den Registrierungsdetails und Deinem Initialpasswort wird an die hinterlegte E-Mail-Adresse geschickt. Bitte pr\u00fcfe den Posteingang (inklusive dem Spam-Ordner). Login-Seite # Gib auf der \"Login\"-Seite die Informationen ein, die Du mit der oben genannten E-Mail erhalten hast. Du kannst entweder Deinen Spitznamen oder die E-Mail-Adresse als Login-Namen nutzen. Wenn Dein Account OpenID nutzt, dann kannst Du Deine OpenID-Adresse als Login-Name nutzen und das Passwort-Feld frei lassen. Du wirst zu Deinem OpenID-Anbieter weitergeleitet, wo Du Deine Anmeldung abschlie\u00dft. Wenn Du OpenID nicht nutzt, dann gib Dein Passwort ein, das Du mit der Registrierungsmail erhalten hast. Das Passwort muss genau so geschrieben werden, wie es in der E-Mail steht; Gro\u00df- und Kleinschreibung wird beachtet. Falls Du Schwierigkeiten beim Login hast, pr\u00fcfe bitte, ob z. B. Deine Feststelltaste aktiv ist. Passwort \u00e4ndern # Besuche nach Deinem ersten Login bitte die Einstellungsseite und wechsle das Passwort in eines, dass Du Dir merken kannst. Die ersten Schritte # Pers\u00f6nliche Daten exportieren # Du solltest dir als Erstes deinen neu erstellen \"Account exportieren\" unter Einstellungen/pers\u00f6nliche Daten exportieren und an einem sicheren Ort verwahren. In diesem Export (JSON-Datei) sind enthalten Deine Identit\u00e4t, die mit kryptographischen Schl\u00fcsseln ausgestattet ist Deine Kontakte Dies ist z.B. dann n\u00fctzlich, wenn du mit deinem Account auf einen anderen Friendica Knoten umziehen willst, oder musst. Hilfe f\u00fcr Neulinge # Ein 'Tipp f\u00fcr neue Mitglieder' ( https://your-site.info/newmember )-Link zeigt sich in den ersten beiden Wochen auf Deiner Startseite, um Dir erste Informationen zum Start zu bieten. Schau Dir ebenfalls folgende Seiten an # Gruppen und Privatsph\u00e4re Account l\u00f6schen Der eigene Friendica-Knoten # Wenn Du Deinen eigenen Friendica-Knoten auf einem Server aufsetzen willst, kannst Du das ebenfalls machen. Besuche die Friendica-Webseite , um den Code mit den Installationsanleitungen herunterzuladen. Es ist ein einfacher Installationsprozess, den jeder mit ein wenig technischen Erfahrungen im Webseiten-Hosting oder mit grundlegenden Linux-Erfahrungen handhaben kann.","title":"Grundlagen"},{"location":"de/user/account-basics/#account-basics","text":"","title":"Account - Basics"},{"location":"de/user/account-basics/#registrierung","text":"Viele, aber nicht alle Friendica-Knoten (Server) bieten die M\u00f6glichkeit zur Registrierung an. Falls der Friendica-Knoten, den Du besuchst, keine Registrierung anbietet, oder Du glaubst, dass Dir ein anderer Knoten m\u00f6glicherweise besser gef\u00e4llt, dann findest Du hier eine Liste von \u00f6ffentlichen Friendica-Knoten , aus der Du Dir einen netten Knoten heraussuchen kannst. Auf der Startseite des Knotens wird unter dem Login-Feld ein \"Registrieren\"-Link angezeigt. Dieser Link f\u00fchrt dann direkt auf das Registrierungsformular.","title":"Registrierung"},{"location":"de/user/account-basics/#openid","text":"Falls du keine OpenID-Adresse hast, kannst du diesen Punkt ignorieren. Solltest du eine OpenID Adresse haben, kannst du sie im ersten Feld eintragen und \"Registrieren\" klicken. Friendica wird versuchen, so viele Informationen wie m\u00f6glich von deinem OpenID-Provider zu \u00fcbernehmen, um diese in dein Profil auf dieser Seite einzutragen.","title":"OpenID"},{"location":"de/user/account-basics/#dein-vollstandiger-name","text":"Bitte trage bei \"vollst\u00e4ndiger Name\" Deinen gew\u00fcnschten Namen ein, wie er \u00fcber deinen Beitr\u00e4gen angezeigt werden soll. Du kannst deinen echten Namen eintragen, kannst dir aber auch einen Namen ausdenken. Einen Zwang zu dem sogenannten Klarnamen gibt es nicht.","title":"Dein vollst\u00e4ndiger Name"},{"location":"de/user/account-basics/#email-adresse","text":"Bitte trage eine richtige E-Mail-Adresse ein. Dies ist die einzige pers\u00f6nliche Information, die korrekt sein muss. Deine E-Mail-Adresse wird niemals ver\u00f6ffentlicht. Wir ben\u00f6tigen diese, um Dir Account-Informationen, das Initialpasswort und die Login-Daten zu schicken. Oder z.B. Dein Passwort zur\u00fcckzusetzen. Du erh\u00e4ltst zudem von Zeit zu Zeit Benachrichtigungen \u00fcber eingegangene Nachrichten oder Punkte, die Deine Aufmerksamkeit ben\u00f6tigen. Diese Nachrichten sind in den Einstellungen jederzeit an- oder abschaltbar.","title":"Email-Adresse"},{"location":"de/user/account-basics/#spitznamenickname","text":"Der Spitzname wird ben\u00f6tigt, um eine Webadresse (Profiladresse) f\u00fcr viele Deiner pers\u00f6nlichen Seiten zu erstellen. Auch wird dieser wie eine E-Mail-Adresse genutzt, wenn eine Verbindung zu anderen Personen hergestellt werden soll. Durch die Art, wie der Spitzname genutzt wird, gibt es bestimmte Einschr\u00e4nkungen: er muss mit einem Buchstaben beginnen er darf nur US-ASCII-Textzeichen und Nummern enthalten er muss einzigartig auf diesem Friendica-Knoten sein er kann sp\u00e4ter nicht mehr ge\u00e4ndert werden Dieser Spitzname wird an vielen Stellen genutzt, um Deinen Account zu identifizieren, daher ist es nicht m\u00f6glich ihn sp\u00e4ter zu \u00e4ndern.","title":"Spitzname/Nickname"},{"location":"de/user/account-basics/#verzeichnis-eintrag","text":"Das Registrierungsformular erlaubt es dir, direkt auszuw\u00e4hlen, ob du im Onlineverzeichnis (Friendica Directory) aufgelistet wirst oder nicht. Das ist wie ein Telefonbuch und du entscheidest, ob du darin eingetragen werden m\u00f6chtest. Wir bitten dich, \"Ja\" zu w\u00e4hlen, damit Andere dich finden k\u00f6nnen, so wie du sie finden kannst W\u00e4hlst Du \"Nein\", bist Du f\u00fcr Andere nicht einfach auffindbar Was auch immer Du w\u00e4hlst, kann jederzeit nach dem Login in Deinen Account-Einstellungen ge\u00e4ndert werden.","title":"Verzeichnis-Eintrag"},{"location":"de/user/account-basics/#registrierung_1","text":"Sobald Du die n\u00f6tigen Informationen eingegeben hast, klicke auf \"Registrieren\". Eine E-Mail mit den Registrierungsdetails und Deinem Initialpasswort wird an die hinterlegte E-Mail-Adresse geschickt. Bitte pr\u00fcfe den Posteingang (inklusive dem Spam-Ordner).","title":"Registrierung"},{"location":"de/user/account-basics/#login-seite","text":"Gib auf der \"Login\"-Seite die Informationen ein, die Du mit der oben genannten E-Mail erhalten hast. Du kannst entweder Deinen Spitznamen oder die E-Mail-Adresse als Login-Namen nutzen. Wenn Dein Account OpenID nutzt, dann kannst Du Deine OpenID-Adresse als Login-Name nutzen und das Passwort-Feld frei lassen. Du wirst zu Deinem OpenID-Anbieter weitergeleitet, wo Du Deine Anmeldung abschlie\u00dft. Wenn Du OpenID nicht nutzt, dann gib Dein Passwort ein, das Du mit der Registrierungsmail erhalten hast. Das Passwort muss genau so geschrieben werden, wie es in der E-Mail steht; Gro\u00df- und Kleinschreibung wird beachtet. Falls Du Schwierigkeiten beim Login hast, pr\u00fcfe bitte, ob z. B. Deine Feststelltaste aktiv ist.","title":"Login-Seite"},{"location":"de/user/account-basics/#passwort-andern","text":"Besuche nach Deinem ersten Login bitte die Einstellungsseite und wechsle das Passwort in eines, dass Du Dir merken kannst.","title":"Passwort \u00e4ndern"},{"location":"de/user/account-basics/#die-ersten-schritte","text":"","title":"Die ersten Schritte"},{"location":"de/user/account-basics/#personliche-daten-exportieren","text":"Du solltest dir als Erstes deinen neu erstellen \"Account exportieren\" unter Einstellungen/pers\u00f6nliche Daten exportieren und an einem sicheren Ort verwahren. In diesem Export (JSON-Datei) sind enthalten Deine Identit\u00e4t, die mit kryptographischen Schl\u00fcsseln ausgestattet ist Deine Kontakte Dies ist z.B. dann n\u00fctzlich, wenn du mit deinem Account auf einen anderen Friendica Knoten umziehen willst, oder musst.","title":"Pers\u00f6nliche Daten exportieren"},{"location":"de/user/account-basics/#hilfe-fur-neulinge","text":"Ein 'Tipp f\u00fcr neue Mitglieder' ( https://your-site.info/newmember )-Link zeigt sich in den ersten beiden Wochen auf Deiner Startseite, um Dir erste Informationen zum Start zu bieten.","title":"Hilfe f\u00fcr Neulinge"},{"location":"de/user/account-basics/#schau-dir-ebenfalls-folgende-seiten-an","text":"Gruppen und Privatsph\u00e4re Account l\u00f6schen","title":"Schau Dir ebenfalls folgende Seiten an"},{"location":"de/user/account-basics/#der-eigene-friendica-knoten","text":"Wenn Du Deinen eigenen Friendica-Knoten auf einem Server aufsetzen willst, kannst Du das ebenfalls machen. Besuche die Friendica-Webseite , um den Code mit den Installationsanleitungen herunterzuladen. Es ist ein einfacher Installationsprozess, den jeder mit ein wenig technischen Erfahrungen im Webseiten-Hosting oder mit grundlegenden Linux-Erfahrungen handhaben kann.","title":"Der eigene Friendica-Knoten"},{"location":"de/user/bbcode/","tags":["user"],"text":"Referenz der Friendica BBCode Tags # Inline # table.bbcodes { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.bbcodes > tr > th, table.bbcodes > tr > td, table.bbcodes > * > tr > th, table.bbcodes > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.bbcodes > tr > th, table.bbcodes > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } BBCode Ergebnis [b]fett[/b] fett [i]kursiv[/i] kursiv [u]unterstrichen[/u] unterstrichen [s]durchgestrichen[/s] durchgestrichen [o]\u00fcberstrichen[/o] \u00fcberstrichen [color=red]rot[/color] rot [url=https://friendi.ca]Friendica[/url] Friendica [img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png[/img] [img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png]Das Friendica Logo[/img] [img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg[/img] Note: provided height is simply discarded. [size=xx-small]kleiner Text[/size] kleiner Text [size=xx-large]gro\u00dfer Text[/size] gro\u00dfer Text [size=20]exakte Gr\u00f6\u00dfe[/size] (die Gr\u00f6\u00dfe kann beliebig in Pixeln gew\u00e4hlt werden) exakte Gr\u00f6\u00dfe [font=serif]Serife Schriftart[/font] Serife Schriftart Links # BBCode Ergebnis [url]https://friendi.ca[/url] https://friendi.ca [url=https://friendi.ca.com]Friendica[/url] Friendica [bookmark]https://friendi.ca[/bookmark] #^[url]https://friendi.ca[/url] Friendica: https://friendi.ca [bookmark=https://friendi.ca]Lesezeichen[/bookmark] #^[url=https://friendi.ca]Lesezeichen[/url] #[url=https://friendi.ca]^[/url][url=https://friendi.ca]Lesezeichen[/url] Friendica: Lesezeichen [url=/posts/f16d77b0630f0134740c0cc47a0ea02a]Diaspora Beitrag mit GUID[/url] Diaspora Beitrag mit GUID #Friendica # Friendica @Erw\u00e4hnung @ Erw\u00e4hnung acct:account@friendica.host.com (WebFinger) acct:account@friendica.host.com [mail]user@mail.example.com[/mail] user@mail.example.com [mail=user@mail.example.com]Eine E-Mail senden[/mail] Eine E-Mail senden Blocks # BBCode Ergebnis [p]Ein Absatz mit Text[/p] Ein Absatz mit Text Eingebetteter [code]Programmcode[/code] im Text Eingebetteter Programmcode im Text [code]Programmcode \u00fcber mehrere Zeilen[/code] Programmcode \u00fcber mehrere Zeilen [code=php]function text_highlight($s,$lang)[/code] function text_highlight ( $s , $lang ) [quote]Zitat[/quote] Zitat [quote=Autor]Autor? Ich? Nein, niemals...[/quote] Autor hat geschrieben: Autor? Ich? Nein, niemals... [center]zentrierter Text[/center] zentrierter Text Du solltest nicht weiter lesen, wenn du das Ende des Films nicht vorher erfahren willst. [spoiler]Es gibt ein Happy End.[/spoiler] Du solltest nicht weiter lesen, wenn du das Ende des Films nicht vorher erfahren willst. Zum \u00f6ffnen/schlie\u00dfen klicken Es gibt ein Happy End. [spoiler=Autor]Spoiler Alarm[/spoiler] Autor hat geschrieben Zum \u00f6ffnen/schlie\u00dfen klicken Spoiler Alarm [hr] (horizontale Linie) \u00dcberschriften # BBCode Ergebnis [h1]Titel 1[/h1] Titel 1 [h2]Titel 2[/h2] Titel 2 [h3]Titel 3[/h3] Titel 3 [h4]Titel 4[/h4] Titel 4 [h5]Titel 5[/h5] Titel 5 [h6]Titel 6[/h6] Titel 6 Tabellen # BBCode Ergebnis [table] [tr] [th]Kopfzeile 1[/th] [th]Kopfzeile 2[/th] [th]Kopfzeile 2[/th] [/tr] [tr] [td]Zelle 1[/td] [td]Zelle 2[/td] [td]Zelle 3[/td] [/tr] [tr] [td]Zelle 4[/td] [td]Zelle 5[/td] [td]Zelle 6[/td] [/tr] [/table] Kopfzeile 1 Kopfzeile 2 Kopfzeile 3 Zelle 1 Zelle 2 Zelle 3 Zelle 4 Zelle 5 Zelle 6 [table border=0] Kopfzeile 1 Kopfzeile 2 Kopfzeile 3 Zelle 1 Zelle 2 Zelle 3 Zelle 4 Zelle 5 Zelle 6 [table border=1] Kopfzeile 1 Kopfzeile 2 Kopfzeile 3 Zelle 1 Zelle 2 Zelle 3 Zelle 4 Zelle 5 Zelle 6 Listen # BBCode Ergebnis [ul] [li] Erstes Listenelement [li] Zweites Listenelement [/ul] [list] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [ol] [*] Erstes Listenelement [*] Zweites Listenelement [/ol] [list=1] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=i] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=I] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=a] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=A] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement Einbetten # Du kannst Videos, Musikdateien und weitere Dinge in Beitr\u00e4gen einbinden. BBCode Ergebnis [video]url[/video] Wobei die *url* eine URL von youtube, vimeo, soundcloud oder einer anderen Plattform sein kann, die die opengraph Spezifikationen unterst\u00fctzt. [video]URL der Videodatei[/video] [audio]URL der Musikdatei[/audio] Die komplette URL einer ogg/ogv/oga/ogm/webm/mp4/mp3 Datei angeben, diese wird dann mit einem HTML5-Player angezeigt. [youtube]Youtube URL[/youtube] Youtube Video mittels OEmbed anzeigen. Kann u.U, den Player nicht einbetten. [youtube]Youtube video ID[/youtube] Youtube-Player im iframe einbinden. [vimeo]Vimeo URL[/vimeo] Vimeo Video mittels OEmbed anzeigen. Kann u.U, den Player nicht einbetten. [vimeo]Vimeo video ID[/vimeo] Vimeo-Player im iframe einbinden. [embed]URL[/embed] OEmbed rich content einbetten. [url]*url*[/url] Wenn *url* die OEmbed- oder Opengraph-Spezifikationen unterst\u00fctzt, wird das Objekt eingebettet (z.B. Dokumente von scribd). Ansonsten wird der Titel der Seite mit der URL verlinkt. Karten # Das Einbetten von Karten ben\u00f6tigt das \"OpenStreetMap\" oder das \"Google Maps\" Addon. Wenn keines der Addons aktiv ist, werden stattde\u00dfen die Koordinaten angezeigt- BBCode Ergebnis [map]Adresse[/map] Bindet eine Karte ein, auf der die angegebene Adresse zentriert ist. [map=lat,long] Bindet eine Karte ein, die auf die angegebenen Koordinaten zentriert ist. [map] Bindet eine Karte ein, die auf die Position des Beitrags zentriert ist. Zusammenfassungen f\u00fcr lange Beitr\u00e4ge # Wenn du deine Beitr\u00e4ge auf anderen Netzwerken von Drittanbietern verbreiten m\u00f6chtest, z.B. Twitter, k\u00f6nntest du Probleme mit deren Zeichenbegrenzung haben. Friendica verwendet einen semi-intelligenten Mechanismus, um passende Zusammenfassungen zu erstellen. Du kannst allerdings auch selbst die Zusammenfassungen erstellen, die auf den unterschiedlichen Netzwerken angezeigt werden. Um dies zu tun, verwendest du den [abstract]-Tag. BBCode Ergebnis [abstract]Unglaublich interessant! Muss man gesehen haben! Unbedingt dem Link folgen![/abstract] Ich m\u00f6chte euch eine unglaublich langweilige Geschichte erz\u00e4hlen, die ihr sicherlich niemals h\u00f6ren wolltet. Auf Twitter w\u00fcrde folgender Text ver\u00f6ffentlicht werden Unglaublich interessant! Muss man gesehen haben! Unbedingt dem Link folgen! Wohingegen auf Friendica folgendes stehen w\u00fcrde Ich m\u00f6chte euch eine unglaublich langweilige Geschichte erz\u00e4hlen, die ihr sicherlich niemals h\u00f6ren wolltet. Wenn du magst, kannst du auch unterschiedliche Zusammenfassungen f\u00fcr die unterschiedlichen Netzwerke verwenden. BBCode Ergebnis [abstract]Hey Leute, hier sind meines neuesten Bilder![/abstract] [abstract=twit]Hallo liebe Twitter Follower. Wollt ihr meine neuesten Bilder sehen?[/abstract] [abstract=apdn]Moin liebe Follower auf ADN. Ich habe einige neue Bilder gemacht, die ich euch gerne zeigen will.[/abstract] Heute war ich im Wald unterwegs und habe einige wirklich sch\u00f6ne Bilder gemacht... F\u00fcr Twitter und App.net wird Friendica in diesem Fall die speziell definierten Zusammenfassungen Verwenden. F\u00fcr andere Netzwerke (wie z.B. bei der Verwendung des GNU Social Konnektors zum Ver\u00f6ffentlichen auf deinen GNU Social Account) w\u00fcrde die allgemeine Zusammenfassung verwenden. Wenn du beispielsweise den \"buffer\"-Konnektor verwendest um Beitr\u00e4ge nach Facebook und Google+ zu senden, dort aber nicht den gesamten Blogbeitrag posten willst, sondern nur einen Anrei\u00dfer, kannst du dies mit dem [abstract]-Tag realisieren. Bei Netzwerken wie Facebook oder Google+, die selbst kein Zeichenlimit haben wird das [abstract]-Element allerdings nicht grunds\u00e4tzlich verwendet. Daher m\u00fcssen diese Netzwerke explizit genannt werden. BBCode Ergebnis [abstract]Dieser Tage hatte ich eine ungew\u00f6hnliche Begegnung...[/abstract] [abstract=goog]Hey liebe Google+ Follower. Habt ihr schon meinen neuesten Blog-Beitrag gelesen?[/abstract] [abstract=face]Hallo liebe Facebook Freunde. Letztens ist mir etwas wirklich sch\u00f6nes pa\u00dfiert.[/abstract] Als ich die Bilder im Wald aufgenommen habe, hatte ich eine wirklich ungew\u00f6hnliche Begegnung... Auf Google und Facebook w\u00fcrde nun die entsprechende Zusammenfassung verbreitet. F\u00fcr andere Netzwerke w\u00fcrde die allgemeine Zusammenfassung verwendet werden. Auf Friendica wird weiterhin keine Zusammenfassung angezeigt. F\u00fcr Verbindungen zu Netzwerken, zu denen Friendica den HTML Code postet, wie Tumblr, Wordpress oder Pump.io wird das [abstract] Element nicht verwendet. Bei nativen Verbindungen; das hei\u00dft zu z.B. Friendica, Hubzilla, Diaspora oder GNU Social Kontakten; wird der ungek\u00fcrzte Beitrag \u00fcbertragen. Die Instanz des Kontakts k\u00fcmmert sich um die Darstellung. Wird ein Beitrag \u00fcber das ActivityPub Protokoll \u00fcbermittelt, wird der Text des Abstracts f\u00fcr das \"summary\" (Zusammenfassung) Feld verwendet. Dieses Feld wird von Mastodon f\u00fcr die Inhaltswarnung (content warning) verwendet. Special # BBCode Ergebnis Wenn du verhindern m\u00f6chtest, da\u00df der BBCode in einer Nachricht interpretiert wird, kannst du die [noparse], [nobb] oder [pre] Tag verwenden: [noparse][b]fett[/b][/noparse] [nobb][b]fett[/b][/nobb] [pre][b]fett[/b][/pre] [b]fett[/b] [nosmile] kann verwendet werden, um f\u00fcr einen Beitrag das Umsetzen von Smilies zu verhindern. [nosmile] ;-) :-O ;-) :-O Benutzerdefinierte Block-Styles [style=text-shadow: 0 0 4px #CC0000;]Du kannst alle CSS-Eigenschaften eines Blocks \u00e4ndern-[/style] Du kannst alle CSS-Eigenschaften eines Blocks \u00e4ndern. Benutzerdefinierte Inline-Styles [style=text-shadow: 0 0 4px #CC0000;]Du kannst alle CSS-Eigenschaften eines Blocks \u00e4ndern-[/style] Du kannst alle CSS-Eigenschaften dieses Inline-Textes \u00e4ndern-","title":"BBCode"},{"location":"de/user/bbcode/#referenz-der-friendica-bbcode-tags","text":"","title":"Referenz der Friendica BBCode Tags"},{"location":"de/user/bbcode/#inline","text":"table.bbcodes { margin: 1em 0; background-color: #f9f9f9; border: 1px solid #aaa; border-collapse: collapse; color: #000; width: 100%; } table.bbcodes > tr > th, table.bbcodes > tr > td, table.bbcodes > * > tr > th, table.bbcodes > * > tr > td { border: 1px solid #aaa; padding: 0.2em 0.4em } table.bbcodes > tr > th, table.bbcodes > * > tr > th { background-color: #f2f2f2; text-align: center; width: 50% } BBCode Ergebnis [b]fett[/b] fett [i]kursiv[/i] kursiv [u]unterstrichen[/u] unterstrichen [s]durchgestrichen[/s] durchgestrichen [o]\u00fcberstrichen[/o] \u00fcberstrichen [color=red]rot[/color] rot [url=https://friendi.ca]Friendica[/url] Friendica [img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png[/img] [img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png]Das Friendica Logo[/img] [img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg[/img] Note: provided height is simply discarded. [size=xx-small]kleiner Text[/size] kleiner Text [size=xx-large]gro\u00dfer Text[/size] gro\u00dfer Text [size=20]exakte Gr\u00f6\u00dfe[/size] (die Gr\u00f6\u00dfe kann beliebig in Pixeln gew\u00e4hlt werden) exakte Gr\u00f6\u00dfe [font=serif]Serife Schriftart[/font] Serife Schriftart","title":"Inline"},{"location":"de/user/bbcode/#links","text":"BBCode Ergebnis [url]https://friendi.ca[/url] https://friendi.ca [url=https://friendi.ca.com]Friendica[/url] Friendica [bookmark]https://friendi.ca[/bookmark] #^[url]https://friendi.ca[/url]","title":"Links"},{"location":"de/user/bbcode/#blocks","text":"BBCode Ergebnis [p]Ein Absatz mit Text[/p] Ein Absatz mit Text Eingebetteter [code]Programmcode[/code] im Text Eingebetteter Programmcode im Text [code]Programmcode \u00fcber mehrere Zeilen[/code] Programmcode \u00fcber mehrere Zeilen [code=php]function text_highlight($s,$lang)[/code] function text_highlight ( $s , $lang ) [quote]Zitat[/quote] Zitat [quote=Autor]Autor? Ich? Nein, niemals...[/quote] Autor hat geschrieben: Autor? Ich? Nein, niemals... [center]zentrierter Text[/center] zentrierter Text Du solltest nicht weiter lesen, wenn du das Ende des Films nicht vorher erfahren willst. [spoiler]Es gibt ein Happy End.[/spoiler] Du solltest nicht weiter lesen, wenn du das Ende des Films nicht vorher erfahren willst. Zum \u00f6ffnen/schlie\u00dfen klicken Es gibt ein Happy End. [spoiler=Autor]Spoiler Alarm[/spoiler] Autor hat geschrieben Zum \u00f6ffnen/schlie\u00dfen klicken Spoiler Alarm [hr] (horizontale Linie)","title":"Blocks"},{"location":"de/user/bbcode/#uberschriften","text":"BBCode Ergebnis [h1]Titel 1[/h1]","title":"\u00dcberschriften"},{"location":"de/user/bbcode/#tabellen","text":"BBCode Ergebnis [table] [tr] [th]Kopfzeile 1[/th] [th]Kopfzeile 2[/th] [th]Kopfzeile 2[/th] [/tr] [tr] [td]Zelle 1[/td] [td]Zelle 2[/td] [td]Zelle 3[/td] [/tr] [tr] [td]Zelle 4[/td] [td]Zelle 5[/td] [td]Zelle 6[/td] [/tr] [/table] Kopfzeile 1 Kopfzeile 2 Kopfzeile 3 Zelle 1 Zelle 2 Zelle 3 Zelle 4 Zelle 5 Zelle 6 [table border=0] Kopfzeile 1 Kopfzeile 2 Kopfzeile 3 Zelle 1 Zelle 2 Zelle 3 Zelle 4 Zelle 5 Zelle 6 [table border=1] Kopfzeile 1 Kopfzeile 2 Kopfzeile 3 Zelle 1 Zelle 2 Zelle 3 Zelle 4 Zelle 5 Zelle 6","title":"Tabellen"},{"location":"de/user/bbcode/#listen","text":"BBCode Ergebnis [ul] [li] Erstes Listenelement [li] Zweites Listenelement [/ul] [list] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [ol] [*] Erstes Listenelement [*] Zweites Listenelement [/ol] [list=1] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=i] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=I] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=a] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement [list=A] [*] Erstes Listenelement [*] Zweites Listenelement [/list] Erstes Listenelement Zweites Listenelement","title":"Listen"},{"location":"de/user/bbcode/#einbetten","text":"Du kannst Videos, Musikdateien und weitere Dinge in Beitr\u00e4gen einbinden. BBCode Ergebnis [video]url[/video] Wobei die *url* eine URL von youtube, vimeo, soundcloud oder einer anderen Plattform sein kann, die die opengraph Spezifikationen unterst\u00fctzt. [video]URL der Videodatei[/video] [audio]URL der Musikdatei[/audio] Die komplette URL einer ogg/ogv/oga/ogm/webm/mp4/mp3 Datei angeben, diese wird dann mit einem HTML5-Player angezeigt. [youtube]Youtube URL[/youtube] Youtube Video mittels OEmbed anzeigen. Kann u.U, den Player nicht einbetten. [youtube]Youtube video ID[/youtube] Youtube-Player im iframe einbinden. [vimeo]Vimeo URL[/vimeo] Vimeo Video mittels OEmbed anzeigen. Kann u.U, den Player nicht einbetten. [vimeo]Vimeo video ID[/vimeo] Vimeo-Player im iframe einbinden. [embed]URL[/embed] OEmbed rich content einbetten. [url]*url*[/url] Wenn *url* die OEmbed- oder Opengraph-Spezifikationen unterst\u00fctzt, wird das Objekt eingebettet (z.B. Dokumente von scribd). Ansonsten wird der Titel der Seite mit der URL verlinkt.","title":"Einbetten"},{"location":"de/user/bbcode/#karten","text":"Das Einbetten von Karten ben\u00f6tigt das \"OpenStreetMap\" oder das \"Google Maps\" Addon. Wenn keines der Addons aktiv ist, werden stattde\u00dfen die Koordinaten angezeigt- BBCode Ergebnis [map]Adresse[/map] Bindet eine Karte ein, auf der die angegebene Adresse zentriert ist. [map=lat,long] Bindet eine Karte ein, die auf die angegebenen Koordinaten zentriert ist. [map] Bindet eine Karte ein, die auf die Position des Beitrags zentriert ist.","title":"Karten"},{"location":"de/user/bbcode/#zusammenfassungen-fur-lange-beitrage","text":"Wenn du deine Beitr\u00e4ge auf anderen Netzwerken von Drittanbietern verbreiten m\u00f6chtest, z.B. Twitter, k\u00f6nntest du Probleme mit deren Zeichenbegrenzung haben. Friendica verwendet einen semi-intelligenten Mechanismus, um passende Zusammenfassungen zu erstellen. Du kannst allerdings auch selbst die Zusammenfassungen erstellen, die auf den unterschiedlichen Netzwerken angezeigt werden. Um dies zu tun, verwendest du den [abstract]-Tag. BBCode Ergebnis [abstract]Unglaublich interessant! Muss man gesehen haben! Unbedingt dem Link folgen![/abstract] Ich m\u00f6chte euch eine unglaublich langweilige Geschichte erz\u00e4hlen, die ihr sicherlich niemals h\u00f6ren wolltet. Auf Twitter w\u00fcrde folgender Text ver\u00f6ffentlicht werden Unglaublich interessant! Muss man gesehen haben! Unbedingt dem Link folgen! Wohingegen auf Friendica folgendes stehen w\u00fcrde Ich m\u00f6chte euch eine unglaublich langweilige Geschichte erz\u00e4hlen, die ihr sicherlich niemals h\u00f6ren wolltet. Wenn du magst, kannst du auch unterschiedliche Zusammenfassungen f\u00fcr die unterschiedlichen Netzwerke verwenden. BBCode Ergebnis [abstract]Hey Leute, hier sind meines neuesten Bilder![/abstract] [abstract=twit]Hallo liebe Twitter Follower. Wollt ihr meine neuesten Bilder sehen?[/abstract] [abstract=apdn]Moin liebe Follower auf ADN. Ich habe einige neue Bilder gemacht, die ich euch gerne zeigen will.[/abstract] Heute war ich im Wald unterwegs und habe einige wirklich sch\u00f6ne Bilder gemacht... F\u00fcr Twitter und App.net wird Friendica in diesem Fall die speziell definierten Zusammenfassungen Verwenden. F\u00fcr andere Netzwerke (wie z.B. bei der Verwendung des GNU Social Konnektors zum Ver\u00f6ffentlichen auf deinen GNU Social Account) w\u00fcrde die allgemeine Zusammenfassung verwenden. Wenn du beispielsweise den \"buffer\"-Konnektor verwendest um Beitr\u00e4ge nach Facebook und Google+ zu senden, dort aber nicht den gesamten Blogbeitrag posten willst, sondern nur einen Anrei\u00dfer, kannst du dies mit dem [abstract]-Tag realisieren. Bei Netzwerken wie Facebook oder Google+, die selbst kein Zeichenlimit haben wird das [abstract]-Element allerdings nicht grunds\u00e4tzlich verwendet. Daher m\u00fcssen diese Netzwerke explizit genannt werden. BBCode Ergebnis [abstract]Dieser Tage hatte ich eine ungew\u00f6hnliche Begegnung...[/abstract] [abstract=goog]Hey liebe Google+ Follower. Habt ihr schon meinen neuesten Blog-Beitrag gelesen?[/abstract] [abstract=face]Hallo liebe Facebook Freunde. Letztens ist mir etwas wirklich sch\u00f6nes pa\u00dfiert.[/abstract] Als ich die Bilder im Wald aufgenommen habe, hatte ich eine wirklich ungew\u00f6hnliche Begegnung... Auf Google und Facebook w\u00fcrde nun die entsprechende Zusammenfassung verbreitet. F\u00fcr andere Netzwerke w\u00fcrde die allgemeine Zusammenfassung verwendet werden. Auf Friendica wird weiterhin keine Zusammenfassung angezeigt. F\u00fcr Verbindungen zu Netzwerken, zu denen Friendica den HTML Code postet, wie Tumblr, Wordpress oder Pump.io wird das [abstract] Element nicht verwendet. Bei nativen Verbindungen; das hei\u00dft zu z.B. Friendica, Hubzilla, Diaspora oder GNU Social Kontakten; wird der ungek\u00fcrzte Beitrag \u00fcbertragen. Die Instanz des Kontakts k\u00fcmmert sich um die Darstellung. Wird ein Beitrag \u00fcber das ActivityPub Protokoll \u00fcbermittelt, wird der Text des Abstracts f\u00fcr das \"summary\" (Zusammenfassung) Feld verwendet. Dieses Feld wird von Mastodon f\u00fcr die Inhaltswarnung (content warning) verwendet.","title":"Zusammenfassungen f\u00fcr lange Beitr\u00e4ge"},{"location":"de/user/bbcode/#special","text":"BBCode Ergebnis Wenn du verhindern m\u00f6chtest, da\u00df der BBCode in einer Nachricht interpretiert wird, kannst du die [noparse], [nobb] oder [pre] Tag verwenden: [noparse][b]fett[/b][/noparse] [nobb][b]fett[/b][/nobb] [pre][b]fett[/b][/pre] [b]fett[/b] [nosmile] kann verwendet werden, um f\u00fcr einen Beitrag das Umsetzen von Smilies zu verhindern. [nosmile] ;-) :-O ;-) :-O Benutzerdefinierte Block-Styles [style=text-shadow: 0 0 4px #CC0000;]Du kannst alle CSS-Eigenschaften eines Blocks \u00e4ndern-[/style] Du kannst alle CSS-Eigenschaften eines Blocks \u00e4ndern. Benutzerdefinierte Inline-Styles [style=text-shadow: 0 0 4px #CC0000;]Du kannst alle CSS-Eigenschaften eines Blocks \u00e4ndern-[/style] Du kannst alle CSS-Eigenschaften dieses Inline-Textes \u00e4ndern-","title":"Special"},{"location":"de/user/chats/","tags":["user"],"text":"Chats # du hast derzeit zwei M\u00f6glichkeiten, einen Chat auf deiner Friendica-Seite zu betreiben IRC - Internet Relay Chat Jappix IRC Addon # Sobald das Addon aktiviert ist, kannst du den Chat unter https://deineSeite.de/irc finden. Beachte aber, dass dieser Chat auch ohne Anmeldung auf deiner Seite zug\u00e4nglich ist und somit auch Fremde diesen Chat mitnutzen k\u00f6nnen. Wenn du dem Link folgst, dann kommst du zum Anmeldefenster des IR-Chats. W\u00e4hle nun einen Spitznamen (Nickname) und w\u00e4hle einen Raum aus, in dem du chatten willst. Hier kannst du jeden Namen eingeben. Es kann also auch #tollerChatdessenNamenurichkenne sein. Gib als N\u00e4chstes noch die Captchas ein, um zu zeigen, dass es sich bei dir um einen Menschen handelt und klicke auf \"Connect\". Im n\u00e4chsten Fenster siehst du zun\u00e4chst viel Text beim Verbindungsaufbau, der allerdings f\u00fcr dich nicht weiter von Bedeutung ist. Anschlie\u00dfend \u00f6ffnet sich das Chat-Fenster. In den ersten Zeilen wird dir dein Name und deine aktuelle IP-Adresse angezeigt. Rechts im Fenster siehst du alle Teilnehmer des Chats. Unten hast du ein Eingabefeld, um Beitr\u00e4ge zu schreiben. Weiter Informationen zu IRC findest du zum Beispiel auf ubuntuusers.de , in Wikipedia oder bei icrhelp.org (in Englisch). Jappix Mini # Das Jappix Mini Addon erlaubt das Erstellen einer Chatbox f\u00fcr Jabber/XMPP-Kontakte. Ein Jabber/XMPP Account sollte vor der Installation bereits vorhanden sein. Die ausf\u00fchrliche Anleitung dazu und eine Kontrolle, ob du nicht sogar schon \u00fcber deinen E-Mail-Anbieter einen Jabber-Account hast, findest du unter einfachjabber.de . Einige Server zum Anmelden eines neuen Accounts: https://jappix.com https://www.jabme.de http://www.jabber.de oder die Auswahl von http://xmpp.net nutzen. 1. Grunds\u00e4tzliches # Als Erstes musst du die aktuellste Version herunterladen: Per Git: cd /var/www/<Pfad zu deiner friendica-Installation>/addon git pull oder als normaler Download von hier: https://github.com/friendica/friendica-addons/blob/stable/jappixmini.tgz (auf \u201eview raw\u201c klicken) Entpacke diese Datei (ggf. den entpackten Ordner in \u201ejappixmini\u201c umbenennen) und lade sowohl den entpackten Ordner komplett als auch die .tgz Datei in den Addon Ordner deiner Friendica Installation hoch. Nach dem Upload gehts in den Friendica Adminbereich und dort zu den Addons. Aktiviere das Jappixmini Addon und gehe anschlie\u00dfend \u00fcber die Addons Seitenleiste (dort wo auch die Twitter-, Impressums-, GNU Social-, usw. Einstellungen gemacht werden) zu den Jappix Grundeinstellungen. Setze hier den Haken zur Aktivierung des BOSH Proxys. Weiter gehts in den Einstellungen deines Friendica Accounts. 2. Einstellungen # Gehe bitte zu den Addon-Einstellungen in deinen Konto-Einstellungen (Account Settings). Scrolle ein St\u00fcck hinunter bis zu den Jappix Mini Addon settings. Aktiviere hier zuerst das Addon. Trage nun deinen Jabber/XMPP Namen ein, ebenfalls die entsprechende Domain bzw. den Server (ohne http, also z. B. einfach so: jappix.com). Um das JavaScript zum Chatten im Browser verwenden zu k\u00f6nnen, ben\u00f6tigst du einen BOSH Proxy. Entweder betreibst du deinen eigenen (s. Dokumentation deines XMPP Servers) oder du verwendest einen \u00f6ffentlichen BOSH Proxy. Beachte aber, dass der Betreiber dieses Proxies den kompletten Datenverkehr \u00fcber den Proxy mitlesen kann. Siehe dazu auch die \u201eConfiguration Help\u201c unter den Eingabefeldern. Gebe danach noch dein Passwort an, und damit ist eigentlich schon fast alles geschafft. Die weiteren Einstellm\u00f6glichkeiten bleiben dir \u00fcberlassen, sind also optional. Jetzt noch auf \u201esenden\u201c klicken und fertig. deine Chatbox sollte jetzt irgendwo unten rechts im Browserfenster \u201ekleben\u201c. Falls du manuell Kontakte hinzuf\u00fcgen m\u00f6chtest, einfach den \u201eAdd Contact\u201c-Knopf nutzen. Viel Spass beim Chatten!","title":"Chats"},{"location":"de/user/chats/#chats","text":"du hast derzeit zwei M\u00f6glichkeiten, einen Chat auf deiner Friendica-Seite zu betreiben IRC - Internet Relay Chat Jappix","title":"Chats"},{"location":"de/user/chats/#irc-addon","text":"Sobald das Addon aktiviert ist, kannst du den Chat unter https://deineSeite.de/irc finden. Beachte aber, dass dieser Chat auch ohne Anmeldung auf deiner Seite zug\u00e4nglich ist und somit auch Fremde diesen Chat mitnutzen k\u00f6nnen. Wenn du dem Link folgst, dann kommst du zum Anmeldefenster des IR-Chats. W\u00e4hle nun einen Spitznamen (Nickname) und w\u00e4hle einen Raum aus, in dem du chatten willst. Hier kannst du jeden Namen eingeben. Es kann also auch #tollerChatdessenNamenurichkenne sein. Gib als N\u00e4chstes noch die Captchas ein, um zu zeigen, dass es sich bei dir um einen Menschen handelt und klicke auf \"Connect\". Im n\u00e4chsten Fenster siehst du zun\u00e4chst viel Text beim Verbindungsaufbau, der allerdings f\u00fcr dich nicht weiter von Bedeutung ist. Anschlie\u00dfend \u00f6ffnet sich das Chat-Fenster. In den ersten Zeilen wird dir dein Name und deine aktuelle IP-Adresse angezeigt. Rechts im Fenster siehst du alle Teilnehmer des Chats. Unten hast du ein Eingabefeld, um Beitr\u00e4ge zu schreiben. Weiter Informationen zu IRC findest du zum Beispiel auf ubuntuusers.de , in Wikipedia oder bei icrhelp.org (in Englisch).","title":"IRC Addon"},{"location":"de/user/chats/#jappix-mini","text":"Das Jappix Mini Addon erlaubt das Erstellen einer Chatbox f\u00fcr Jabber/XMPP-Kontakte. Ein Jabber/XMPP Account sollte vor der Installation bereits vorhanden sein. Die ausf\u00fchrliche Anleitung dazu und eine Kontrolle, ob du nicht sogar schon \u00fcber deinen E-Mail-Anbieter einen Jabber-Account hast, findest du unter einfachjabber.de . Einige Server zum Anmelden eines neuen Accounts: https://jappix.com https://www.jabme.de http://www.jabber.de oder die Auswahl von http://xmpp.net nutzen.","title":"Jappix Mini"},{"location":"de/user/chats/#1-grundsatzliches","text":"Als Erstes musst du die aktuellste Version herunterladen: Per Git: cd /var/www/<Pfad zu deiner friendica-Installation>/addon git pull oder als normaler Download von hier: https://github.com/friendica/friendica-addons/blob/stable/jappixmini.tgz (auf \u201eview raw\u201c klicken) Entpacke diese Datei (ggf. den entpackten Ordner in \u201ejappixmini\u201c umbenennen) und lade sowohl den entpackten Ordner komplett als auch die .tgz Datei in den Addon Ordner deiner Friendica Installation hoch. Nach dem Upload gehts in den Friendica Adminbereich und dort zu den Addons. Aktiviere das Jappixmini Addon und gehe anschlie\u00dfend \u00fcber die Addons Seitenleiste (dort wo auch die Twitter-, Impressums-, GNU Social-, usw. Einstellungen gemacht werden) zu den Jappix Grundeinstellungen. Setze hier den Haken zur Aktivierung des BOSH Proxys. Weiter gehts in den Einstellungen deines Friendica Accounts.","title":"1. Grunds\u00e4tzliches"},{"location":"de/user/chats/#2-einstellungen","text":"Gehe bitte zu den Addon-Einstellungen in deinen Konto-Einstellungen (Account Settings). Scrolle ein St\u00fcck hinunter bis zu den Jappix Mini Addon settings. Aktiviere hier zuerst das Addon. Trage nun deinen Jabber/XMPP Namen ein, ebenfalls die entsprechende Domain bzw. den Server (ohne http, also z. B. einfach so: jappix.com). Um das JavaScript zum Chatten im Browser verwenden zu k\u00f6nnen, ben\u00f6tigst du einen BOSH Proxy. Entweder betreibst du deinen eigenen (s. Dokumentation deines XMPP Servers) oder du verwendest einen \u00f6ffentlichen BOSH Proxy. Beachte aber, dass der Betreiber dieses Proxies den kompletten Datenverkehr \u00fcber den Proxy mitlesen kann. Siehe dazu auch die \u201eConfiguration Help\u201c unter den Eingabefeldern. Gebe danach noch dein Passwort an, und damit ist eigentlich schon fast alles geschafft. Die weiteren Einstellm\u00f6glichkeiten bleiben dir \u00fcberlassen, sind also optional. Jetzt noch auf \u201esenden\u201c klicken und fertig. deine Chatbox sollte jetzt irgendwo unten rechts im Browserfenster \u201ekleben\u201c. Falls du manuell Kontakte hinzuf\u00fcgen m\u00f6chtest, einfach den \u201eAdd Contact\u201c-Knopf nutzen. Viel Spass beim Chatten!","title":"2. Einstellungen"},{"location":"de/user/connectors/","tags":["user"],"text":"Konnektoren (Connectors) # Konnektoren erlauben es dir, dich mit anderen sozialen Netzwerken zu verbinden. Konnektoren werden nur bei bestehenden Twitter und GNU Social-Accounts ben\u00f6tigt. Au\u00dferdem gibt es einen Konnektor, um deinen E-Mail-Posteingang zu nutzen. Wenn du keinen eigenen Knoten betreibst und wissen willst, ob der server deiner Wahl diese Konnektoren installiert hat, kannst du dich dar\u00fcber auf der Seite '<domain_des_friendica-servers>/friendica' informieren. Sind die Netzwerk-Konnektoren auf deinem System installiert sind, kannst du mit den folgenden Links die Einstellungsseiten besuchen und f\u00fcr deinen Account konfigurieren: Twitter GNU Social Email Anleitung # um sich mit Personen in bestimmten Netzwerken zu verbinden. Friendica # du kannst dich verbinden, indem du die Adresse deiner Identit\u00e4t (<dein_nick>@<dein_friendica-host>) auf der \"Verbinden\"-Seite des Friendica-Nutzers eingibst. Ebenso kannst du deren Identit\u00e4ts-Adresse in der \"Verbinden\"-Box auf deiner \"Kontakt\"-Seite eingeben. Diaspora # F\u00fcge die Diaspora-Identit\u00e4ts-Adresse (z.B. name@diasporapod.com)auf deiner \"Kontakte\"-Seite in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein. GNU Social # Dieses Netzwerk wird als \"federated social web\" bzw. \"OStatus\"-Kontakte bezeichnet. Bitte beachte, dass es keine Einstellungen zur Privatsph\u00e4re im OStatus-Netzwerk gibt. Jede Nachricht, die an eines dieser OStatus-Mitglieder verschickt wird, ist f\u00fcr jeden auf der Welt sichtbar; alle Privatsph\u00e4reneinstellungen verlieren ihre Wirkung. Diese Nachrichten erscheinen ebenfalls in \u00f6ffentlichen Suchergebnissen. Da die OStatus-Kommunikation keine Authentifizierung benutzt, k\u00f6nnen OStatus-Nutzer keine Nachrichten empfangen, wenn du in deinen Privatsph\u00e4reneinstellungen \"Profil und Nachrichten vor Unbekannten verbergen\" w\u00e4hlst. Um dich mit einem OStatus-Mitglied zu verbinden, trage deren Profil-URL oder Identit\u00e4ts-Adresse auf deiner \"Kontakte\"-Seite in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein. Der GNU Social-Konnektor kann genutzt werden, wenn du Beitr\u00e4ge schreiben willst, die auf einer OStatus-Seite \u00fcber einen existierenden OStatus-Account erscheinen sollen. Das ist nicht notwendig, wenn du OStatus-Mitgliedern von Friendica aus folgst und diese dir auch folgen, indem sie auf deiner Kontaktseite ihre eigene Identit\u00e4ts-Adresse eingeben. Blogger, Wordpress, RSS feeds, andere Webseiten # Trage die URL auf deiner \"Kontakte\"-Seite ( https://your-site.info/contacts ) in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein. du hast keine M\u00f6glichkeit, diesen Kontakten zu antworten. Das erlaubt dir, dich mit Millionen von Seiten im Internet zu verbinden . Alles, was daf\u00fcr n\u00f6tig ist, ist, dass die Seite einen Feed im RSS- oder Atom Syndication-Format nutzt und welches einen Autor und ein Bild zur Seite liefert. Twitter # Um einem Twitter-Nutzer zu folgen, trage die URL der Hauptseite des Twitter-Accounts auf deiner \"Kontakte\"-Seite in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein. Um zu antworten, musst du den Twitter-Konnektor installieren und \u00fcber deinen eigenen Status-Editor antworten. Beginne deine Nachricht mit @twitternutzer, ersetze das aber durch den richtigen Twitter-Namen. Email # Konfiguriere den E-Mail-Konnektor auf deiner Einstellungsseite ( https://your-site.info/settings ). Wenn du das gemacht hast, kannst du auf deiner \"Kontakte\"-Seite die E-Mail-Adresse in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" eintragen. Diese E-Mail-Adresse muss jedoch bereits mit einer Nachricht in deinem E-Mail-Posteingang auf dem Server liegen. du hast die M\u00f6glichkeit, E-Mail-Kontakte in deine privaten Unterhaltungen einzubeziehen.","title":"Konnektoren"},{"location":"de/user/connectors/#konnektoren-connectors","text":"Konnektoren erlauben es dir, dich mit anderen sozialen Netzwerken zu verbinden. Konnektoren werden nur bei bestehenden Twitter und GNU Social-Accounts ben\u00f6tigt. Au\u00dferdem gibt es einen Konnektor, um deinen E-Mail-Posteingang zu nutzen. Wenn du keinen eigenen Knoten betreibst und wissen willst, ob der server deiner Wahl diese Konnektoren installiert hat, kannst du dich dar\u00fcber auf der Seite '<domain_des_friendica-servers>/friendica' informieren. Sind die Netzwerk-Konnektoren auf deinem System installiert sind, kannst du mit den folgenden Links die Einstellungsseiten besuchen und f\u00fcr deinen Account konfigurieren: Twitter GNU Social Email","title":"Konnektoren (Connectors)"},{"location":"de/user/connectors/#anleitung","text":"um sich mit Personen in bestimmten Netzwerken zu verbinden.","title":"Anleitung"},{"location":"de/user/connectors/#friendica","text":"du kannst dich verbinden, indem du die Adresse deiner Identit\u00e4t (<dein_nick>@<dein_friendica-host>) auf der \"Verbinden\"-Seite des Friendica-Nutzers eingibst. Ebenso kannst du deren Identit\u00e4ts-Adresse in der \"Verbinden\"-Box auf deiner \"Kontakt\"-Seite eingeben.","title":"Friendica"},{"location":"de/user/connectors/#diaspora","text":"F\u00fcge die Diaspora-Identit\u00e4ts-Adresse (z.B. name@diasporapod.com)auf deiner \"Kontakte\"-Seite in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein.","title":"Diaspora"},{"location":"de/user/connectors/#gnu-social","text":"Dieses Netzwerk wird als \"federated social web\" bzw. \"OStatus\"-Kontakte bezeichnet. Bitte beachte, dass es keine Einstellungen zur Privatsph\u00e4re im OStatus-Netzwerk gibt. Jede Nachricht, die an eines dieser OStatus-Mitglieder verschickt wird, ist f\u00fcr jeden auf der Welt sichtbar; alle Privatsph\u00e4reneinstellungen verlieren ihre Wirkung. Diese Nachrichten erscheinen ebenfalls in \u00f6ffentlichen Suchergebnissen. Da die OStatus-Kommunikation keine Authentifizierung benutzt, k\u00f6nnen OStatus-Nutzer keine Nachrichten empfangen, wenn du in deinen Privatsph\u00e4reneinstellungen \"Profil und Nachrichten vor Unbekannten verbergen\" w\u00e4hlst. Um dich mit einem OStatus-Mitglied zu verbinden, trage deren Profil-URL oder Identit\u00e4ts-Adresse auf deiner \"Kontakte\"-Seite in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein. Der GNU Social-Konnektor kann genutzt werden, wenn du Beitr\u00e4ge schreiben willst, die auf einer OStatus-Seite \u00fcber einen existierenden OStatus-Account erscheinen sollen. Das ist nicht notwendig, wenn du OStatus-Mitgliedern von Friendica aus folgst und diese dir auch folgen, indem sie auf deiner Kontaktseite ihre eigene Identit\u00e4ts-Adresse eingeben.","title":"GNU Social"},{"location":"de/user/connectors/#blogger-wordpress-rss-feeds-andere-webseiten","text":"Trage die URL auf deiner \"Kontakte\"-Seite ( https://your-site.info/contacts ) in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein. du hast keine M\u00f6glichkeit, diesen Kontakten zu antworten. Das erlaubt dir, dich mit Millionen von Seiten im Internet zu verbinden . Alles, was daf\u00fcr n\u00f6tig ist, ist, dass die Seite einen Feed im RSS- oder Atom Syndication-Format nutzt und welches einen Autor und ein Bild zur Seite liefert.","title":"Blogger, Wordpress, RSS feeds, andere Webseiten"},{"location":"de/user/connectors/#twitter","text":"Um einem Twitter-Nutzer zu folgen, trage die URL der Hauptseite des Twitter-Accounts auf deiner \"Kontakte\"-Seite in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" ein. Um zu antworten, musst du den Twitter-Konnektor installieren und \u00fcber deinen eigenen Status-Editor antworten. Beginne deine Nachricht mit @twitternutzer, ersetze das aber durch den richtigen Twitter-Namen.","title":"Twitter"},{"location":"de/user/connectors/#email","text":"Konfiguriere den E-Mail-Konnektor auf deiner Einstellungsseite ( https://your-site.info/settings ). Wenn du das gemacht hast, kannst du auf deiner \"Kontakte\"-Seite die E-Mail-Adresse in das Feld \"Neuen Kontakt hinzuf\u00fcgen\" eintragen. Diese E-Mail-Adresse muss jedoch bereits mit einer Nachricht in deinem E-Mail-Posteingang auf dem Server liegen. du hast die M\u00f6glichkeit, E-Mail-Kontakte in deine privaten Unterhaltungen einzubeziehen.","title":"Email"},{"location":"de/user/events/","tags":["user","events"],"text":"Veranstaltungen # Veranstaltungen sind spezielle Postings. Die Veranstaltungen, die du und deine Kontakte teilen, k\u00f6nnen unter https://your-site.info/events auf deiner Instanz aufgefunden werden. Um da hinzukommen, gehe \u00fcber den Tab \"Veranstaltungen\", abh\u00e4ngig von dem Theme, das du benutzt, ist der eventuell ein zus\u00e4tzlicher Link im Navigationsmen\u00fc der Seite vorhanden. Veranstaltungs\u00fcbersicht # Die \u00dcbersichtsseite zeigt den Kalender des aktuellen Monats an, plus einige Tage am Beginn und am Ende. Angezeigt werden alle Veranstaltungen des aktuellen Monats, die von dir angelegt wurden oder die von deinen Kontakten geteilt wurden. Dies beinhaltet auch Geburtstagserinnerungen, welche mit dir geteilt wurden. Es gibt Buttons mit denen die Ansicht zwischen monatlich/w\u00f6chentlich und t\u00e4glich wechseln kann. Um eine neue Veranstaltung anzulegen, kannst du dem Link \"Veranstaltung erstellen\" folgen oder einen Doppelklick in das Kalenderfeld, in dem die Veranstaltung stehen soll, machen. Mit einem Klick auf eine bereits existierende Veranstaltung, \u00f6ffnet sich ein Pop-up-Fenster, welches dir die Veranstaltung anzeigt. Erstelle eine neue Veranstaltung # Folge einer der oben beschriebenen Methoden, dann erreichst du das Formular, um die Veranstaltungsdaten einzutragen. Felder mit *** m\u00fcssen ausgef\u00fcllt werden. Veranstaltungsbeginn : trage den Anfang der Veranstaltung ein. Veranstaltungsende : trage das Ende der Veranstaltung ein. Wenn du in eines dieser Felder klickst, wird sich ein Popup Fester \u00f6ffnen, wo du Tag und Uhrzeit eintragen kannst. Wenn du einen Doppelklick auf die Box im Kalender machst, werden diese Felder automatisch ausgef\u00fcllt. Das Veranstaltungsende muss nach dem Veranstaltungsanfang liegen. Aber du musst es nicht angeben. Wenn eine Veranstaltung ein offenes Ende hat oder das Veranstaltungsende nicht wichtig ist, klicke in die Box zwei Felder darunter. An Zeitzone des Betrachters anpassen : Wenn du die Box anklickst, wird die Anfangs- und Endzeit der Veranstaltung automatisch an die lokale Zeitzone, wie in den Zeitzoneneinstellungen angepasst. Dies vermeidet verfr\u00fchte Geburtstagsgl\u00fcckw\u00fcnsche, oder die Bef\u00fcrchtung, dass du den Geburtstag deines Freundes auf der anderen Seite der Welt vergisst und \u00e4hnliche Ereignisse. Titel : Titel der Veranstaltung Beschreibung : eine l\u00e4ngere Beschreibung der Veranstaltung Ort : Ort, wo die Veranstaltung stattfinden wird Diese 3 Felder beschreiben deine Veranstaltung. Im Beschreibungs- und Ortsfeld kannst du BBCode zum Formatieren des Textes verwenden. Veranstaltung teilen : wenn diese Box aktiviert wird, kannst du in der ACL ausw\u00e4hlen, mit wem du diese Veranstaltung teilen willst. Dies funktioniert wie die Kontrolle jedes anderen Postings. Wenn du Veranstaltungen teilst, werden diese auf deine Pinnwand gepostet mit den Zugriffsberechtigungen, die du ausgew\u00e4hlt hast. Bevor du das machst, kannst du dir die Veranstaltung als Vorschau in einem Pop-up-Fenster anzeigen lassen. Interaktionen mit Veranstaltungen # Wenn du eine Veranstaltung ver\u00f6ffentlichst, kannst du ausw\u00e4hlen, wer sie bekommen wird, wie bei einem normalen Posting. Die Empf\u00e4nger sehen deine Veranstaltung in einem Posting in ihrem Network-Stream. Zus\u00e4tzlich wird die Veranstaltung zu ihrem Kalender hinzugef\u00fcgt und somit in ihrer Veranstaltungs\u00fcbersicht angezeigt. Empf\u00e4nger von einem Veranstaltungsposting, k\u00f6nnen dies kommentieren oder dis-/liken, wie bei einem normalen Posting. Zus\u00e4tzlich k\u00f6nnen sie sagen, ob sie teilnehmen, oder vielleicht teilnehmen an der Veranstaltung mit einem einzigen Klick. Kalender exportieren # Wenn du deine \u00f6ffentlichen Kalender Eintr\u00e4ge exportieren m\u00f6chtest, kannst du dies in den Einstellungen aktivieren (Einstellungen \u2192 Zus\u00e4tzliche Features \u2192 Allgemeine Features \u2192 \u00d6ffentlichen Kalender exportieren). Im Anschluss sind auf der Veranstaltungs\u00fcbersichtsseite zwei Links zu den exportierten Eintr\u00e4gen (im ical oder csv Format) verf\u00fcgbar.","title":"Veranstaltungen"},{"location":"de/user/events/#veranstaltungen","text":"Veranstaltungen sind spezielle Postings. Die Veranstaltungen, die du und deine Kontakte teilen, k\u00f6nnen unter https://your-site.info/events auf deiner Instanz aufgefunden werden. Um da hinzukommen, gehe \u00fcber den Tab \"Veranstaltungen\", abh\u00e4ngig von dem Theme, das du benutzt, ist der eventuell ein zus\u00e4tzlicher Link im Navigationsmen\u00fc der Seite vorhanden.","title":"Veranstaltungen"},{"location":"de/user/events/#veranstaltungsubersicht","text":"Die \u00dcbersichtsseite zeigt den Kalender des aktuellen Monats an, plus einige Tage am Beginn und am Ende. Angezeigt werden alle Veranstaltungen des aktuellen Monats, die von dir angelegt wurden oder die von deinen Kontakten geteilt wurden. Dies beinhaltet auch Geburtstagserinnerungen, welche mit dir geteilt wurden. Es gibt Buttons mit denen die Ansicht zwischen monatlich/w\u00f6chentlich und t\u00e4glich wechseln kann. Um eine neue Veranstaltung anzulegen, kannst du dem Link \"Veranstaltung erstellen\" folgen oder einen Doppelklick in das Kalenderfeld, in dem die Veranstaltung stehen soll, machen. Mit einem Klick auf eine bereits existierende Veranstaltung, \u00f6ffnet sich ein Pop-up-Fenster, welches dir die Veranstaltung anzeigt.","title":"Veranstaltungs\u00fcbersicht"},{"location":"de/user/events/#erstelle-eine-neue-veranstaltung","text":"Folge einer der oben beschriebenen Methoden, dann erreichst du das Formular, um die Veranstaltungsdaten einzutragen. Felder mit *** m\u00fcssen ausgef\u00fcllt werden. Veranstaltungsbeginn : trage den Anfang der Veranstaltung ein. Veranstaltungsende : trage das Ende der Veranstaltung ein. Wenn du in eines dieser Felder klickst, wird sich ein Popup Fester \u00f6ffnen, wo du Tag und Uhrzeit eintragen kannst. Wenn du einen Doppelklick auf die Box im Kalender machst, werden diese Felder automatisch ausgef\u00fcllt. Das Veranstaltungsende muss nach dem Veranstaltungsanfang liegen. Aber du musst es nicht angeben. Wenn eine Veranstaltung ein offenes Ende hat oder das Veranstaltungsende nicht wichtig ist, klicke in die Box zwei Felder darunter. An Zeitzone des Betrachters anpassen : Wenn du die Box anklickst, wird die Anfangs- und Endzeit der Veranstaltung automatisch an die lokale Zeitzone, wie in den Zeitzoneneinstellungen angepasst. Dies vermeidet verfr\u00fchte Geburtstagsgl\u00fcckw\u00fcnsche, oder die Bef\u00fcrchtung, dass du den Geburtstag deines Freundes auf der anderen Seite der Welt vergisst und \u00e4hnliche Ereignisse. Titel : Titel der Veranstaltung Beschreibung : eine l\u00e4ngere Beschreibung der Veranstaltung Ort : Ort, wo die Veranstaltung stattfinden wird Diese 3 Felder beschreiben deine Veranstaltung. Im Beschreibungs- und Ortsfeld kannst du BBCode zum Formatieren des Textes verwenden. Veranstaltung teilen : wenn diese Box aktiviert wird, kannst du in der ACL ausw\u00e4hlen, mit wem du diese Veranstaltung teilen willst. Dies funktioniert wie die Kontrolle jedes anderen Postings. Wenn du Veranstaltungen teilst, werden diese auf deine Pinnwand gepostet mit den Zugriffsberechtigungen, die du ausgew\u00e4hlt hast. Bevor du das machst, kannst du dir die Veranstaltung als Vorschau in einem Pop-up-Fenster anzeigen lassen.","title":"Erstelle eine neue Veranstaltung"},{"location":"de/user/events/#interaktionen-mit-veranstaltungen","text":"Wenn du eine Veranstaltung ver\u00f6ffentlichst, kannst du ausw\u00e4hlen, wer sie bekommen wird, wie bei einem normalen Posting. Die Empf\u00e4nger sehen deine Veranstaltung in einem Posting in ihrem Network-Stream. Zus\u00e4tzlich wird die Veranstaltung zu ihrem Kalender hinzugef\u00fcgt und somit in ihrer Veranstaltungs\u00fcbersicht angezeigt. Empf\u00e4nger von einem Veranstaltungsposting, k\u00f6nnen dies kommentieren oder dis-/liken, wie bei einem normalen Posting. Zus\u00e4tzlich k\u00f6nnen sie sagen, ob sie teilnehmen, oder vielleicht teilnehmen an der Veranstaltung mit einem einzigen Klick.","title":"Interaktionen mit Veranstaltungen"},{"location":"de/user/events/#kalender-exportieren","text":"Wenn du deine \u00f6ffentlichen Kalender Eintr\u00e4ge exportieren m\u00f6chtest, kannst du dies in den Einstellungen aktivieren (Einstellungen \u2192 Zus\u00e4tzliche Features \u2192 Allgemeine Features \u2192 \u00d6ffentlichen Kalender exportieren). Im Anschluss sind auf der Veranstaltungs\u00fcbersichtsseite zwei Links zu den exportierten Eintr\u00e4gen (im ical oder csv Format) verf\u00fcgbar.","title":"Kalender exportieren"},{"location":"de/user/export-import-contacts/","tags":["user","kontakte"],"text":"Export / Import von gefolgten Kontakte # Zus\u00e4tzlich zum Umziehen des Accounts kannst du die Liste der von dir gefolgten Kontakte exportieren und importieren. Die exportierte Liste wird als CSV Datei in einem zu anderen Plattformen, z.B. Mastodon, Misskey oder Pleroma, kompatiblen Format gespeichert. Export der gefolgten Kontakte # Um die Liste der Kontakte denen du folgst zu exportieren, geht die Einstellungen pers\u00f6nliche Daten exportieren ( https://your-site.info/settings/userexport ) und klicke den Exportiere Kontakte als CSV ( https://your-site.info/settings/userexport/contact ) an. Import der gefolgten Kontakte # Um die Kontakt CSV Datei zu importieren, gehe in die Einstellungen. Am Ende der Einstellungen zum Nutzerkonto findest du den Abschnitt \"Kontakte Importieren\". Hier kannst du die CSV Datei ausw\u00e4hlen und hoch laden. Unterst\u00fctztes Datei Format # Die CSV Datei muss mindestens eine Spalte beinhalten. In der ersten Spalte der Tabelle sollte entweder das Handle oder die URL des gefolgten Kontakts. (Ein Kontakt pro Zeile.) alle anderen Spalten der CSV Datei werden beim Importieren ignoriert.","title":"Import/Export Kontakte"},{"location":"de/user/export-import-contacts/#export-import-von-gefolgten-kontakte","text":"Zus\u00e4tzlich zum Umziehen des Accounts kannst du die Liste der von dir gefolgten Kontakte exportieren und importieren. Die exportierte Liste wird als CSV Datei in einem zu anderen Plattformen, z.B. Mastodon, Misskey oder Pleroma, kompatiblen Format gespeichert.","title":"Export / Import von gefolgten Kontakte"},{"location":"de/user/export-import-contacts/#export-der-gefolgten-kontakte","text":"Um die Liste der Kontakte denen du folgst zu exportieren, geht die Einstellungen pers\u00f6nliche Daten exportieren ( https://your-site.info/settings/userexport ) und klicke den Exportiere Kontakte als CSV ( https://your-site.info/settings/userexport/contact ) an.","title":"Export der gefolgten Kontakte"},{"location":"de/user/export-import-contacts/#import-der-gefolgten-kontakte","text":"Um die Kontakt CSV Datei zu importieren, gehe in die Einstellungen. Am Ende der Einstellungen zum Nutzerkonto findest du den Abschnitt \"Kontakte Importieren\". Hier kannst du die CSV Datei ausw\u00e4hlen und hoch laden.","title":"Import der gefolgten Kontakte"},{"location":"de/user/export-import-contacts/#unterstutztes-datei-format","text":"Die CSV Datei muss mindestens eine Spalte beinhalten. In der ersten Spalte der Tabelle sollte entweder das Handle oder die URL des gefolgten Kontakts. (Ein Kontakt pro Zeile.) alle anderen Spalten der CSV Datei werden beim Importieren ignoriert.","title":"Unterst\u00fctztes Datei Format"},{"location":"de/user/faq/","tags":["user","faq"],"text":"H\u00e4ufig gestellte Fragen - FAQ # Wo finde ich Hilfe? # Wenn Du Probleme mit Deiner Friendica-Seite hast, dann kannst Du die Community in der Friendica-Support-Gruppe fragen. Wenn Du Deinen Account nicht nutzen kannst, kannst Du einen Account auf einer \u00f6ffentlichen Seite ( Liste ) nutzen. Wenn du dir keinen weiteren Friendica Account einrichten willst, kannst du auch gerne \u00fcber einen der folgenden alternativen Kan\u00e4le Hilfe suchen: Friendica Support Forum: @helpers@forum.friendi.ca Chats der Friendica Community (die IRC, Matrix und XMPP R\u00e4ume sind mit einer Br\u00fccke verbunden) Logs dieser \u00f6ffentlichen Chatr\u00e4ume k\u00f6nnen hier aus dem IRC und hier aus der Matrix gefunden werden. XMPP: support(at)forum.friendi.ca IRC: #friendica auf libera.chat Matrix: #friendica-en:matrix.org or #friendi.ca:matrix.org Mailing List Warum erhalte ich Warnungen \u00fcber fehlende Zertifikate? # Manchmal erh\u00e4ltst Du eine Browser-Warnung \u00fcber fehlende Zertifikate. Diese Warnungen k\u00f6nnen drei Gr\u00fcnde haben: der Server, mit dem Du verbunden bist, nutzt kein SSL; der Server hat ein selbst-signiertes Zertifikat (nicht empfohlen) das Zertifikat ist nicht mehr g\u00fcltig. (SSL (Secure Socket Layer) ist eine Technologie, die Daten auf ihrem Weg zwischen zwei Computern verschl\u00fcsselt.) Wenn Du noch kein SSL-Zertifikat hast, dann gibt es drei Wege, eines zu erhalten: kauf Dir eines, hole Dir ein kostenloses (z.B. bei StartSSL, WoSign, hoffentlich bald auch LetsEncrypt) oder kreiere Dein eigenes (nicht empfohlen). Weitere Informationen \u00fcber die Einrichtung von SSL und warum es schlecht ist, selbst-signierte Zertifikate zu nutzen, findest Du hier. Sei Dir bewusst, dass Browser-Warnungen \u00fcber Sicherheitsl\u00fccken etwas sind, wodurch neue Nutzer schnell das Vertrauen in das gesamte Friendica-Projekt verlieren k\u00f6nnen. Aus diesem Grund wird Friendica Red nur SSL-Zertifikate eines anerkannten Anbieters (CA, certificate authority) akzeptieren und nicht zu Seiten verbinden, die kein SSL nutzen. Unabh\u00e4ngig von den negativen Aspekten von SSL handelt es sich hierbei um eine notwendige L\u00f6sung, solange keine etablierte Alternative existiert. Abgesehen davon kann es ohne SSL auch Probleme mit der Verbindung zu Diaspora geben, da einige Diaspora-Pods eine zertifizierte Verbindung ben\u00f6tigen. Wenn Du Friendica nur f\u00fcr eine bestimmte Gruppe von Leuten auf einem einzelnen Server nutzt, bei dem keine Verbindung zum restlichen Netzwerk besteht, dann ben\u00f6tigst Du kein SSL. Ebenso ben\u00f6tigst Du SSL nicht, wenn Du ausschlie\u00dflich \u00f6ffentliche Beitr\u00e4ge auf Deiner Seite ver\u00f6ffentlichst bzw. empf\u00e4ngst. Wenn Du zum jetzigen Zeitpunkt noch keinen Server aufgesetzt hast, ist es sinnvoll, die verschiedenen Anbieter in Bezug auf SSL zu vergleichen. Einige erlauben die Nutzung von freien Zertifikaten oder lassen Dich ihre eigenen Zertifikate mitnutzen. Andere erlauben nur kostenpflichtige Zertifikate als eigenes Angebot bzw. von anderen Anbietern. Wie kann ich Bilder, Dateien, Links, Video und Audio in Beitr\u00e4ge einf\u00fcgen? # Bilder k\u00f6nnen direkt im Beitragseditor vom Computer hochgeladen werden. Eine \u00dcbersicht aller Bilder, die auf Deinem Server liegen, findest Du unter deineSeite.de/photos/profilname . Dort kannst Du auch direkt Bilder hochladen und festlegen, ob Deine Kontakte eine Nachricht \u00fcber das neue Bild bekommen. Alle Arten von Dateien k\u00f6nnen grunds\u00e4tzlich als Anhang in Friendica hochgeladen werden. Daf\u00fcr verwendest Du das B\u00fcroklammersymbol im Editor. Sie sind dann direkt an den Beitrag gekn\u00fcpft, k\u00f6nnen von den Betrachtern heruntergeladen werden, aber werden nicht als Vorschau angezeigt. Deshalb eignet sich diese Methode vor allem f\u00fcr Office-Dateien oder gepackte Dateien wie ZIPs, aber weniger f\u00fcr Multimediadateien. Wer hingegen Dateien \u00fcber Dropbox, \u00fcber eine auf dem eigenen Server installierte Owncloud oder \u00fcber einen anderen Filehoster einf\u00fcgen will, verwendet den Link-Button. Wenn Du mit dem Link-Button (Ketten-Symbol) URLs zu anderen Seiten einf\u00fcgst, versucht Friendica eine kurze Zusammenfassung als Vorschau abzurufen. Manchmal klappt das nicht ... dann verlinke den Beitrag einfach per [url=http://example.com] freigew\u00e4hlter Name [/url] im Editor. Video- und Audiodateien k\u00f6nnen zwar in Beitr\u00e4ge eingebunden werden, allerdings geht das nicht \u00fcber einen direkten Upload im Editor wie bei Fotos. Du hast zwei M\u00f6glichkeiten: Du kannst bei dem Video- oder Audiobutton die URL von einem Hoster eingeben (Youtube, Vimeo, Soundcloud und alle anderen mit oembed/opengraph-Unterst\u00fctzung). Bei Videos zeigt Friendica dann ein Vorschaubild in Deinem Beitrag an, nach einem Klick \u00f6ffnet sich ein eingebetter Player. Bei Soundcloud wird der Player direkt eingebunden. Wenn Du Zugang zu einem eigenen Server hast, kannst Deine Multimediadatei per FTP dort hochladen und beim Video-/Audiobutton diese URL angeben. Dann wird das Video oder die Audiodatei direkt mit einem Player in Deinem Beitrag angezeigt. Friendica verwendet zur Einbettung HTML5. Das bedeutet, dass je nach Browser und Betriebssystem andere Formate unterst\u00fctzt werden, darunter WebM, MP4, MP3 und Ogg. Eine Tabelle findest Du bei Wikipedia ( Video , Audio ). Zum Konvertieren von Videos in das lizenzfreie Videoformat WebM gibt es unter Windows das kostenlose Programm Xmedia-Recode . Ist es m\u00f6glich, bei mehreren Profilen verschiedene Avatare (Nutzerbilder) zu haben? # Ja. Auf Deiner \"Profile verwalten/editieren\"-Seite w\u00e4hlst Du zun\u00e4chst das gew\u00fcnschte Profil aus. Anschlie\u00dfend siehst Du eine Seite mit allen Informationen zu diesem Profil. Klicke nun oben auf den Link \"Profilbild \u00e4ndern\" und lade im n\u00e4chsten Fenster ein Bild von Deinem PC hoch. Um Deine privaten Daten zu sch\u00fctzen, wird in Beitr\u00e4gen nur das Bild aus Deinem \u00f6ffentlichen Profil angezeigt. Wie kann ich Friendica in einer bestimmten Sprache ansehen? # Die Sprache des Friendica Interfaces kann durch den lang Parameter un der URL beeinflusst werden. Das Argument des Parameters ist ein ISO 639-1 Code. Zwischen der URL und dem Parameter muss ein Fragezeichen als Trennzeichen verwendet werden. Ein Beispiel: https://social.example.com/profile/example auf Deutsch: https://social.example.com/profile/example?lang=de. Was ist der Unterschied zwischen blockierten|ignorierten|archivierten|versteckten Kontakten? # Wir verhindern direkte Kommunikation mit blockierten Kontakten. Sie geh\u00f6ren nicht zu den Empf\u00e4ngern beim Versand von Beitr\u00e4gen und deren Beitr\u00e4ge werden auch nicht importiert. Trotzdem werden deren Unterhaltungen mit Deinen Freunden in Deinem Stream sichtbar sein. Wenn Du einen Kontakt komplett l\u00f6schst, k\u00f6nnen sie Dir eine neue Freundschaftsanfrage schicken. Blockierte Kontakte k\u00f6nnen das nicht machen. Sie k\u00f6nnen nicht mit Dir direkt kommunizieren, nur \u00fcber Freunde. Ignorierte Kontakte k\u00f6nnen weiterhin Beitr\u00e4ge und private Nachrichten von Dir erhalten. Deren Beitr\u00e4ge und private Nachrichten werden allerdings nicht importiert. Wie bei blockierten Beitr\u00e4gen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beitr\u00e4gen Deiner Freunde. [Ein Erweiterung namens \"blockem\" kann installiert werden, um alle Beitr\u00e4ge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verk\u00fcrzen. Dabei werden auch Kommentare dieser Person in Beitr\u00e4gen Deiner Freunde blockiert.] Ein archivierter Kontakt bedeutet, dass Kommunikation nicht m\u00f6glich ist und auch nicht versucht wird (das ist z.B. sinnvoll, wenn eine Person zu einem neuen Server gewechselt ist und das alte Profil gel\u00f6scht hat). Anders als beim Blockieren werden existierende Beitr\u00e4ge, die vor der Archivierung erstellt wurden, weiterhin angezeigt. Ein versteckter Kontakt wird in keiner \"Freundesliste\" erscheinen (au\u00dfer f\u00fcr dich). Trotzdem wird ein versteckter Kontakt normal in Unterhaltungen angezeigt - was f\u00fcr andere Kontakte ein Hinweis sein kann, dass diese Person als versteckter Kontakt in deiner Liste ist. Was passiert, wenn ein Account gel\u00f6scht ist? Ist dieser richtig gel\u00f6scht? # Wenn Du Deinen Account l\u00f6schst, wird sofort der gesamte Inhalt auf Deinem Server gel\u00f6scht und ein L\u00f6schbefehl an alle Deine Kontakte verschickt. Dadurch wirst Du ebenfalls aus dem globalen Verzeichnis gel\u00f6scht. Dieses Vorgehen setzt voraus, dass Dein Profil f\u00fcr 24 Stunden weiterhin \"teilweise\" verf\u00fcgbar sein wird, um eine Verbindung zu allen Deinen Kontakten erm\u00f6glicht. Wir k\u00f6nnen also Dein Profil blockieren und es so erscheinen lassen, als w\u00e4ren alle Daten sofort gel\u00f6scht, allerdings warten wir 24 Stunden (bzw. bis alle Deine Kontakte informiert wurden), bevor wir die Daten auch physikalisch l\u00f6schen. Kann ich einem Hashtag folgen? # Ja. F\u00fcge die Tags zu Deinen gespeicherten Suchen hinzu, sie werden automatisch auf der Netzwerk-Seite auftauchen. Bitte beachte, dass Deine Antworten auf solche Posts aus technischen Gr\u00fcnden nicht unter dem \"Pers\u00f6nlich\"-Reiter auf der Netzwerk-Seite und der gesamte Thread nicht per API zu sehen sind. Wie kann ich einen RSS-Feed meiner Netzwerkseite (Stream) erstellen? # Wenn Du die Beitr\u00e4ge Deines Accounts mit RSS teilen willst, dann kannst Du einen der folgenden Links nutzen: RSS-Feed Deiner Beitr\u00e4ge # deineSeite.de/feed/[profilname]/posts Beispiel: Friendica Support https://forum.friendi.ca/feed/helpers/posts RSS-Feed all deiner Beitr\u00e4ge und Antworten # deineSeite.de/dfrn_poll/feed/[profilname]/comments Beispiel: Friendica Support https://forum.friendi.ca/feeds/helpers/comments RSS-Feed all deiner Aktivit\u00e4ten # deineSeite.de/feed/[profilname]/ Gibt es Clients f\u00fcr Friendica? # Friendica unterst\u00fctzt Mastodon API [EN] und Twitter API | gnusocial [EN] . Das bedeutet, du kannst einge der Mastodon und Twitter Clients f\u00fcr Friendica verwenden. Die verf\u00fcgbaren Features sind Abh\u00e4ngig vom Client, sodass diese teils unterschiedlich sein k\u00f6nnen. Android # AndStatus ( F-Droid , Google Play ) B4X for Pleroma & Mastodon DiCa ( Google Play , letztes Update 2019) Fedi Fedilab ( F-Droid , Google Play ) Friendiqa (Gibt es im Google Playstore oder als binary Repository f\u00fcr F-Droid) Husky Roma Subway Tooter Tooot Tusky Twidere ( F-Droid , Google Play , GitHub ) TwidereX twitlatte Yuito SailfishOS # Friendly iOS # B4X for Pleroma & Mastodon ( AppStore , GitHub ) Fedi ( AppStore ) Mastodon ( AppStore ) Roma ( AppStore ) Stella* ( AppStore ) Tooot ( AppStore , GitHub ), Datensammlung (nicht mit Identit\u00e4t verkn\u00fcpft) Tootle ( AppStore ), letztes update: 2020 Linux # Choqok Whalebird TheDesk Toot Tootle macOS # Mastonaut ( AppStore ), kostet ~8\u20ac Whalebird ( AppStore , GitHub ) Web # Halcyon Pinafore","title":"FAQ"},{"location":"de/user/faq/#haufig-gestellte-fragen-faq","text":"","title":"H\u00e4ufig gestellte Fragen - FAQ"},{"location":"de/user/faq/#wo-finde-ich-hilfe","text":"Wenn Du Probleme mit Deiner Friendica-Seite hast, dann kannst Du die Community in der Friendica-Support-Gruppe fragen. Wenn Du Deinen Account nicht nutzen kannst, kannst Du einen Account auf einer \u00f6ffentlichen Seite ( Liste ) nutzen. Wenn du dir keinen weiteren Friendica Account einrichten willst, kannst du auch gerne \u00fcber einen der folgenden alternativen Kan\u00e4le Hilfe suchen: Friendica Support Forum: @helpers@forum.friendi.ca Chats der Friendica Community (die IRC, Matrix und XMPP R\u00e4ume sind mit einer Br\u00fccke verbunden) Logs dieser \u00f6ffentlichen Chatr\u00e4ume k\u00f6nnen hier aus dem IRC und hier aus der Matrix gefunden werden. XMPP: support(at)forum.friendi.ca IRC: #friendica auf libera.chat Matrix: #friendica-en:matrix.org or #friendi.ca:matrix.org Mailing List","title":"Wo finde ich Hilfe?"},{"location":"de/user/faq/#warum-erhalte-ich-warnungen-uber-fehlende-zertifikate","text":"Manchmal erh\u00e4ltst Du eine Browser-Warnung \u00fcber fehlende Zertifikate. Diese Warnungen k\u00f6nnen drei Gr\u00fcnde haben: der Server, mit dem Du verbunden bist, nutzt kein SSL; der Server hat ein selbst-signiertes Zertifikat (nicht empfohlen) das Zertifikat ist nicht mehr g\u00fcltig. (SSL (Secure Socket Layer) ist eine Technologie, die Daten auf ihrem Weg zwischen zwei Computern verschl\u00fcsselt.) Wenn Du noch kein SSL-Zertifikat hast, dann gibt es drei Wege, eines zu erhalten: kauf Dir eines, hole Dir ein kostenloses (z.B. bei StartSSL, WoSign, hoffentlich bald auch LetsEncrypt) oder kreiere Dein eigenes (nicht empfohlen). Weitere Informationen \u00fcber die Einrichtung von SSL und warum es schlecht ist, selbst-signierte Zertifikate zu nutzen, findest Du hier. Sei Dir bewusst, dass Browser-Warnungen \u00fcber Sicherheitsl\u00fccken etwas sind, wodurch neue Nutzer schnell das Vertrauen in das gesamte Friendica-Projekt verlieren k\u00f6nnen. Aus diesem Grund wird Friendica Red nur SSL-Zertifikate eines anerkannten Anbieters (CA, certificate authority) akzeptieren und nicht zu Seiten verbinden, die kein SSL nutzen. Unabh\u00e4ngig von den negativen Aspekten von SSL handelt es sich hierbei um eine notwendige L\u00f6sung, solange keine etablierte Alternative existiert. Abgesehen davon kann es ohne SSL auch Probleme mit der Verbindung zu Diaspora geben, da einige Diaspora-Pods eine zertifizierte Verbindung ben\u00f6tigen. Wenn Du Friendica nur f\u00fcr eine bestimmte Gruppe von Leuten auf einem einzelnen Server nutzt, bei dem keine Verbindung zum restlichen Netzwerk besteht, dann ben\u00f6tigst Du kein SSL. Ebenso ben\u00f6tigst Du SSL nicht, wenn Du ausschlie\u00dflich \u00f6ffentliche Beitr\u00e4ge auf Deiner Seite ver\u00f6ffentlichst bzw. empf\u00e4ngst. Wenn Du zum jetzigen Zeitpunkt noch keinen Server aufgesetzt hast, ist es sinnvoll, die verschiedenen Anbieter in Bezug auf SSL zu vergleichen. Einige erlauben die Nutzung von freien Zertifikaten oder lassen Dich ihre eigenen Zertifikate mitnutzen. Andere erlauben nur kostenpflichtige Zertifikate als eigenes Angebot bzw. von anderen Anbietern.","title":"Warum erhalte ich Warnungen \u00fcber fehlende Zertifikate?"},{"location":"de/user/faq/#wie-kann-ich-bilder-dateien-links-video-und-audio-in-beitrage-einfugen","text":"Bilder k\u00f6nnen direkt im Beitragseditor vom Computer hochgeladen werden. Eine \u00dcbersicht aller Bilder, die auf Deinem Server liegen, findest Du unter deineSeite.de/photos/profilname . Dort kannst Du auch direkt Bilder hochladen und festlegen, ob Deine Kontakte eine Nachricht \u00fcber das neue Bild bekommen. Alle Arten von Dateien k\u00f6nnen grunds\u00e4tzlich als Anhang in Friendica hochgeladen werden. Daf\u00fcr verwendest Du das B\u00fcroklammersymbol im Editor. Sie sind dann direkt an den Beitrag gekn\u00fcpft, k\u00f6nnen von den Betrachtern heruntergeladen werden, aber werden nicht als Vorschau angezeigt. Deshalb eignet sich diese Methode vor allem f\u00fcr Office-Dateien oder gepackte Dateien wie ZIPs, aber weniger f\u00fcr Multimediadateien. Wer hingegen Dateien \u00fcber Dropbox, \u00fcber eine auf dem eigenen Server installierte Owncloud oder \u00fcber einen anderen Filehoster einf\u00fcgen will, verwendet den Link-Button. Wenn Du mit dem Link-Button (Ketten-Symbol) URLs zu anderen Seiten einf\u00fcgst, versucht Friendica eine kurze Zusammenfassung als Vorschau abzurufen. Manchmal klappt das nicht ... dann verlinke den Beitrag einfach per [url=http://example.com] freigew\u00e4hlter Name [/url] im Editor. Video- und Audiodateien k\u00f6nnen zwar in Beitr\u00e4ge eingebunden werden, allerdings geht das nicht \u00fcber einen direkten Upload im Editor wie bei Fotos. Du hast zwei M\u00f6glichkeiten: Du kannst bei dem Video- oder Audiobutton die URL von einem Hoster eingeben (Youtube, Vimeo, Soundcloud und alle anderen mit oembed/opengraph-Unterst\u00fctzung). Bei Videos zeigt Friendica dann ein Vorschaubild in Deinem Beitrag an, nach einem Klick \u00f6ffnet sich ein eingebetter Player. Bei Soundcloud wird der Player direkt eingebunden. Wenn Du Zugang zu einem eigenen Server hast, kannst Deine Multimediadatei per FTP dort hochladen und beim Video-/Audiobutton diese URL angeben. Dann wird das Video oder die Audiodatei direkt mit einem Player in Deinem Beitrag angezeigt. Friendica verwendet zur Einbettung HTML5. Das bedeutet, dass je nach Browser und Betriebssystem andere Formate unterst\u00fctzt werden, darunter WebM, MP4, MP3 und Ogg. Eine Tabelle findest Du bei Wikipedia ( Video , Audio ). Zum Konvertieren von Videos in das lizenzfreie Videoformat WebM gibt es unter Windows das kostenlose Programm Xmedia-Recode .","title":"Wie kann ich Bilder, Dateien, Links, Video und Audio in Beitr\u00e4ge einf\u00fcgen?"},{"location":"de/user/faq/#ist-es-moglich-bei-mehreren-profilen-verschiedene-avatare-nutzerbilder-zu-haben","text":"Ja. Auf Deiner \"Profile verwalten/editieren\"-Seite w\u00e4hlst Du zun\u00e4chst das gew\u00fcnschte Profil aus. Anschlie\u00dfend siehst Du eine Seite mit allen Informationen zu diesem Profil. Klicke nun oben auf den Link \"Profilbild \u00e4ndern\" und lade im n\u00e4chsten Fenster ein Bild von Deinem PC hoch. Um Deine privaten Daten zu sch\u00fctzen, wird in Beitr\u00e4gen nur das Bild aus Deinem \u00f6ffentlichen Profil angezeigt.","title":"Ist es m\u00f6glich, bei mehreren Profilen verschiedene Avatare (Nutzerbilder) zu haben?"},{"location":"de/user/faq/#wie-kann-ich-friendica-in-einer-bestimmten-sprache-ansehen","text":"Die Sprache des Friendica Interfaces kann durch den lang Parameter un der URL beeinflusst werden. Das Argument des Parameters ist ein ISO 639-1 Code. Zwischen der URL und dem Parameter muss ein Fragezeichen als Trennzeichen verwendet werden. Ein Beispiel: https://social.example.com/profile/example auf Deutsch: https://social.example.com/profile/example?lang=de.","title":"Wie kann ich Friendica in einer bestimmten Sprache ansehen?"},{"location":"de/user/faq/#was-ist-der-unterschied-zwischen-blockiertenignoriertenarchiviertenversteckten-kontakten","text":"Wir verhindern direkte Kommunikation mit blockierten Kontakten. Sie geh\u00f6ren nicht zu den Empf\u00e4ngern beim Versand von Beitr\u00e4gen und deren Beitr\u00e4ge werden auch nicht importiert. Trotzdem werden deren Unterhaltungen mit Deinen Freunden in Deinem Stream sichtbar sein. Wenn Du einen Kontakt komplett l\u00f6schst, k\u00f6nnen sie Dir eine neue Freundschaftsanfrage schicken. Blockierte Kontakte k\u00f6nnen das nicht machen. Sie k\u00f6nnen nicht mit Dir direkt kommunizieren, nur \u00fcber Freunde. Ignorierte Kontakte k\u00f6nnen weiterhin Beitr\u00e4ge und private Nachrichten von Dir erhalten. Deren Beitr\u00e4ge und private Nachrichten werden allerdings nicht importiert. Wie bei blockierten Beitr\u00e4gen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beitr\u00e4gen Deiner Freunde. [Ein Erweiterung namens \"blockem\" kann installiert werden, um alle Beitr\u00e4ge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verk\u00fcrzen. Dabei werden auch Kommentare dieser Person in Beitr\u00e4gen Deiner Freunde blockiert.] Ein archivierter Kontakt bedeutet, dass Kommunikation nicht m\u00f6glich ist und auch nicht versucht wird (das ist z.B. sinnvoll, wenn eine Person zu einem neuen Server gewechselt ist und das alte Profil gel\u00f6scht hat). Anders als beim Blockieren werden existierende Beitr\u00e4ge, die vor der Archivierung erstellt wurden, weiterhin angezeigt. Ein versteckter Kontakt wird in keiner \"Freundesliste\" erscheinen (au\u00dfer f\u00fcr dich). Trotzdem wird ein versteckter Kontakt normal in Unterhaltungen angezeigt - was f\u00fcr andere Kontakte ein Hinweis sein kann, dass diese Person als versteckter Kontakt in deiner Liste ist.","title":"Was ist der Unterschied zwischen blockierten|ignorierten|archivierten|versteckten Kontakten?"},{"location":"de/user/faq/#was-passiert-wenn-ein-account-geloscht-ist-ist-dieser-richtig-geloscht","text":"Wenn Du Deinen Account l\u00f6schst, wird sofort der gesamte Inhalt auf Deinem Server gel\u00f6scht und ein L\u00f6schbefehl an alle Deine Kontakte verschickt. Dadurch wirst Du ebenfalls aus dem globalen Verzeichnis gel\u00f6scht. Dieses Vorgehen setzt voraus, dass Dein Profil f\u00fcr 24 Stunden weiterhin \"teilweise\" verf\u00fcgbar sein wird, um eine Verbindung zu allen Deinen Kontakten erm\u00f6glicht. Wir k\u00f6nnen also Dein Profil blockieren und es so erscheinen lassen, als w\u00e4ren alle Daten sofort gel\u00f6scht, allerdings warten wir 24 Stunden (bzw. bis alle Deine Kontakte informiert wurden), bevor wir die Daten auch physikalisch l\u00f6schen.","title":"Was passiert, wenn ein Account gel\u00f6scht ist? Ist dieser richtig gel\u00f6scht?"},{"location":"de/user/faq/#kann-ich-einem-hashtag-folgen","text":"Ja. F\u00fcge die Tags zu Deinen gespeicherten Suchen hinzu, sie werden automatisch auf der Netzwerk-Seite auftauchen. Bitte beachte, dass Deine Antworten auf solche Posts aus technischen Gr\u00fcnden nicht unter dem \"Pers\u00f6nlich\"-Reiter auf der Netzwerk-Seite und der gesamte Thread nicht per API zu sehen sind.","title":"Kann ich einem Hashtag folgen?"},{"location":"de/user/faq/#wie-kann-ich-einen-rss-feed-meiner-netzwerkseite-stream-erstellen","text":"Wenn Du die Beitr\u00e4ge Deines Accounts mit RSS teilen willst, dann kannst Du einen der folgenden Links nutzen:","title":"Wie kann ich einen RSS-Feed meiner Netzwerkseite (Stream) erstellen?"},{"location":"de/user/faq/#rss-feed-deiner-beitrage","text":"deineSeite.de/feed/[profilname]/posts Beispiel: Friendica Support https://forum.friendi.ca/feed/helpers/posts","title":"RSS-Feed Deiner Beitr\u00e4ge"},{"location":"de/user/faq/#rss-feed-all-deiner-beitrage-und-antworten","text":"deineSeite.de/dfrn_poll/feed/[profilname]/comments Beispiel: Friendica Support https://forum.friendi.ca/feeds/helpers/comments","title":"RSS-Feed all deiner Beitr\u00e4ge und Antworten"},{"location":"de/user/faq/#rss-feed-all-deiner-aktivitaten","text":"deineSeite.de/feed/[profilname]/","title":"RSS-Feed all deiner Aktivit\u00e4ten"},{"location":"de/user/faq/#gibt-es-clients-fur-friendica","text":"Friendica unterst\u00fctzt Mastodon API [EN] und Twitter API | gnusocial [EN] . Das bedeutet, du kannst einge der Mastodon und Twitter Clients f\u00fcr Friendica verwenden. Die verf\u00fcgbaren Features sind Abh\u00e4ngig vom Client, sodass diese teils unterschiedlich sein k\u00f6nnen.","title":"Gibt es Clients f\u00fcr Friendica?"},{"location":"de/user/faq/#android","text":"AndStatus ( F-Droid , Google Play ) B4X for Pleroma & Mastodon DiCa ( Google Play , letztes Update 2019) Fedi Fedilab ( F-Droid , Google Play ) Friendiqa (Gibt es im Google Playstore oder als binary Repository f\u00fcr F-Droid) Husky Roma Subway Tooter Tooot Tusky Twidere ( F-Droid , Google Play , GitHub ) TwidereX twitlatte Yuito","title":"Android"},{"location":"de/user/faq/#sailfishos","text":"Friendly","title":"SailfishOS"},{"location":"de/user/faq/#ios","text":"B4X for Pleroma & Mastodon ( AppStore , GitHub ) Fedi ( AppStore ) Mastodon ( AppStore ) Roma ( AppStore ) Stella* ( AppStore ) Tooot ( AppStore , GitHub ), Datensammlung (nicht mit Identit\u00e4t verkn\u00fcpft) Tootle ( AppStore ), letztes update: 2020","title":"iOS"},{"location":"de/user/faq/#linux","text":"Choqok Whalebird TheDesk Toot Tootle","title":"Linux"},{"location":"de/user/faq/#macos","text":"Mastonaut ( AppStore ), kostet ~8\u20ac Whalebird ( AppStore , GitHub )","title":"macOS"},{"location":"de/user/faq/#web","text":"Halcyon Pinafore","title":"Web"},{"location":"de/user/forums/","tags":["user"],"text":"Foren # In Friendica kannst du auch Foren und/oder Prominenten-Seiten erstellen. Jede Seite in Friendica hat einen einmaligen Spitznamen. Das gilt f\u00fcr alle Seiten, unabh\u00e4ngig davon, ob es sich um normale Profile oder Forenseiten handelt. Das Erste, was du machen musst, um ein neues Forum zu kreieren, ist einen neuen Account zu erstellen. Bitte beachte, dass der Seitenadministrator die Registrierung neuer Accounts sperren oder an Bedingungen kn\u00fcpfen kann. Wenn du einen zweiten Account in einem System erstellst und die gleiche E-Mail-Adresse oder den gleichen OpenID-Account nutzt, kannst du dich zuk\u00fcnftig nur noch mit deinem Spitznamen anmelden. Gehe im neuen Account auf die \"Einstellungs\"-Seite und dort am Ende der Seite auf \"Erweiterte Konto-/Seitentyp-Einstellungen\". Normalerweise nutzt du \"Normales Konto\" f\u00fcr einen normalen, pers\u00f6nlichen Account. Das ist die Standardeinstellung. Gruppenseiten bieten die M\u00f6glichkeit, Leute als Freund/Fan ohne Kontaktbest\u00e4tigung zuzulassen. Die Auswahl der Einstellung, die du w\u00e4hlst, h\u00e4ngt davon ab, wie du mit anderen Leuten auf deiner Seite interagieren willst. Die \"Marktschreier\"-Einstellung (Soapbox) l\u00e4sst den Seitenbesitzer die gesamte Kommunikation kontrollieren. Alles, was du schreibst, geht an alle Seitennutzer, aber es gibt keine M\u00f6glichkeit, zu interagieren. Diese Seite wird normalerweise f\u00fcr Ank\u00fcndigungen oder die Kommunikation von Gemeinschaften genutzt. Die normalste Einstellung ist das \"Forum-/Promi-Konto\". Diese erstellt eine Gruppenseite, in der alle Mitglieder frei miteinander interagieren k\u00f6nnen. Der \"Automatische Freunde Seite\"-Account ist typischerweise f\u00fcr pers\u00f6nliche Profile, bei denen du alle Freundschaftsanfragen automatisch best\u00e4tigen willst. Multiple Foren verwalten # Wir schlagen vor, dass du ein Gruppenforum mit der gleichen E-Mail-Adresse und dem gleichen Passwort wie bei deinem normalen Account nutzt. Wenn du das machst, findest du einen neuen \"Verwalten\"-Link in der Men\u00fcleiste, \u00fcber den du einfach zwischen den Identit\u00e4ten wechseln kannst. du musst das nicht machen, die Alternative ist allerdings, dich immer wieder aus- und wieder einzuloggen. Und das kann umst\u00e4ndlich sein, wenn du mehrere verschiedene Foren/Identit\u00e4ten verwaltest. du kannst ebenso jemanden w\u00e4hlen, der dein Forum verwaltet. Mach das, indem du die Delegations-Setup-Seite besuchst. Dort wird dir eine Liste an \"Potenziellen Bevollm\u00e4chtigen\" angezeigt. Die Auswahl einer oder mehrerer Personen gibt diesen die M\u00f6glichkeit, dein Forum zu verwalten. Sie k\u00f6nnen Kontakte, Profile und alle Inhalte deines Accounts/deiner Seite bearbeiten. Bitte nutze diese Einstellung mit Vorsicht. Delegierte haben allerdings keine M\u00f6glichkeit, grundlegende Account-Einstellungen wie das Passwort oder den Seitentypen zu \u00e4ndern bzw. den Account zu l\u00f6schen. Beitr\u00e4ge auf Community-Foren # Wenn du Mitglied eines Community-Forums bist, kannst du das Forum in einem Beitrag hinzuf\u00fcgen/erw\u00e4hnen, wenn du den @-Tag nutzt. Zum Beispiel w\u00fcrde @Fahrrad deinen Beitrag neben den sonst ausgew\u00e4hlten Nutzern an alle Nutzer schicken, die in der Gruppe \"Fahrrad\" sind. Wenn dein Beitrag privat ist, musst du diese Gruppe explizit in den Zugriffsrechten des Beitrags ausw\u00e4hlen und sie mit dem @-Tag erw\u00e4hnen (was den Beitrag auf die Gruppenmitglieder erweitert). Zus\u00e4tzlich ist es m\u00f6glich, Foren mit dem Ausrufezeichen zu adressieren. Im obigen Beispiel bedeutet dies, dass du das Fahrrad-Forum per !Fahrrad erreichen w\u00fcrdest. Der Unterschied zum @ besteht darin, dass der Beitrag ausschlie\u00dflich \u00fcber das Forum verbreitet wird und nicht an weitere Nutzer. Dies bedeutet auch, dass es nicht sinnvoll ist, mehrere Foren per ! in einem Beitrag zu adressieren, da nur eines der Foren den Beitrag verbreiten wird. du kannst au\u00dferdem via \"Wall zu Wall\" einen Beitrag auf der Community-Seite bzw. in dem Community-Forum erstellen. Kommentare, die du an ein Community-Forum schickst, werden dem Originalbeitrag hinzugef\u00fcgt. Ein weiteres Forum mit dem @ -Tag zu erw\u00e4hnen, leitet den Beitrag nicht an dieses weiter, da die Verteilung der Kommentare komplett vom Originalbeitrag bestimmt wird.","title":"Foren"},{"location":"de/user/forums/#foren","text":"In Friendica kannst du auch Foren und/oder Prominenten-Seiten erstellen. Jede Seite in Friendica hat einen einmaligen Spitznamen. Das gilt f\u00fcr alle Seiten, unabh\u00e4ngig davon, ob es sich um normale Profile oder Forenseiten handelt. Das Erste, was du machen musst, um ein neues Forum zu kreieren, ist einen neuen Account zu erstellen. Bitte beachte, dass der Seitenadministrator die Registrierung neuer Accounts sperren oder an Bedingungen kn\u00fcpfen kann. Wenn du einen zweiten Account in einem System erstellst und die gleiche E-Mail-Adresse oder den gleichen OpenID-Account nutzt, kannst du dich zuk\u00fcnftig nur noch mit deinem Spitznamen anmelden. Gehe im neuen Account auf die \"Einstellungs\"-Seite und dort am Ende der Seite auf \"Erweiterte Konto-/Seitentyp-Einstellungen\". Normalerweise nutzt du \"Normales Konto\" f\u00fcr einen normalen, pers\u00f6nlichen Account. Das ist die Standardeinstellung. Gruppenseiten bieten die M\u00f6glichkeit, Leute als Freund/Fan ohne Kontaktbest\u00e4tigung zuzulassen. Die Auswahl der Einstellung, die du w\u00e4hlst, h\u00e4ngt davon ab, wie du mit anderen Leuten auf deiner Seite interagieren willst. Die \"Marktschreier\"-Einstellung (Soapbox) l\u00e4sst den Seitenbesitzer die gesamte Kommunikation kontrollieren. Alles, was du schreibst, geht an alle Seitennutzer, aber es gibt keine M\u00f6glichkeit, zu interagieren. Diese Seite wird normalerweise f\u00fcr Ank\u00fcndigungen oder die Kommunikation von Gemeinschaften genutzt. Die normalste Einstellung ist das \"Forum-/Promi-Konto\". Diese erstellt eine Gruppenseite, in der alle Mitglieder frei miteinander interagieren k\u00f6nnen. Der \"Automatische Freunde Seite\"-Account ist typischerweise f\u00fcr pers\u00f6nliche Profile, bei denen du alle Freundschaftsanfragen automatisch best\u00e4tigen willst.","title":"Foren"},{"location":"de/user/forums/#multiple-foren-verwalten","text":"Wir schlagen vor, dass du ein Gruppenforum mit der gleichen E-Mail-Adresse und dem gleichen Passwort wie bei deinem normalen Account nutzt. Wenn du das machst, findest du einen neuen \"Verwalten\"-Link in der Men\u00fcleiste, \u00fcber den du einfach zwischen den Identit\u00e4ten wechseln kannst. du musst das nicht machen, die Alternative ist allerdings, dich immer wieder aus- und wieder einzuloggen. Und das kann umst\u00e4ndlich sein, wenn du mehrere verschiedene Foren/Identit\u00e4ten verwaltest. du kannst ebenso jemanden w\u00e4hlen, der dein Forum verwaltet. Mach das, indem du die Delegations-Setup-Seite besuchst. Dort wird dir eine Liste an \"Potenziellen Bevollm\u00e4chtigen\" angezeigt. Die Auswahl einer oder mehrerer Personen gibt diesen die M\u00f6glichkeit, dein Forum zu verwalten. Sie k\u00f6nnen Kontakte, Profile und alle Inhalte deines Accounts/deiner Seite bearbeiten. Bitte nutze diese Einstellung mit Vorsicht. Delegierte haben allerdings keine M\u00f6glichkeit, grundlegende Account-Einstellungen wie das Passwort oder den Seitentypen zu \u00e4ndern bzw. den Account zu l\u00f6schen.","title":"Multiple Foren verwalten"},{"location":"de/user/forums/#beitrage-auf-community-foren","text":"Wenn du Mitglied eines Community-Forums bist, kannst du das Forum in einem Beitrag hinzuf\u00fcgen/erw\u00e4hnen, wenn du den @-Tag nutzt. Zum Beispiel w\u00fcrde @Fahrrad deinen Beitrag neben den sonst ausgew\u00e4hlten Nutzern an alle Nutzer schicken, die in der Gruppe \"Fahrrad\" sind. Wenn dein Beitrag privat ist, musst du diese Gruppe explizit in den Zugriffsrechten des Beitrags ausw\u00e4hlen und sie mit dem @-Tag erw\u00e4hnen (was den Beitrag auf die Gruppenmitglieder erweitert). Zus\u00e4tzlich ist es m\u00f6glich, Foren mit dem Ausrufezeichen zu adressieren. Im obigen Beispiel bedeutet dies, dass du das Fahrrad-Forum per !Fahrrad erreichen w\u00fcrdest. Der Unterschied zum @ besteht darin, dass der Beitrag ausschlie\u00dflich \u00fcber das Forum verbreitet wird und nicht an weitere Nutzer. Dies bedeutet auch, dass es nicht sinnvoll ist, mehrere Foren per ! in einem Beitrag zu adressieren, da nur eines der Foren den Beitrag verbreiten wird. du kannst au\u00dferdem via \"Wall zu Wall\" einen Beitrag auf der Community-Seite bzw. in dem Community-Forum erstellen. Kommentare, die du an ein Community-Forum schickst, werden dem Originalbeitrag hinzugef\u00fcgt. Ein weiteres Forum mit dem @ -Tag zu erw\u00e4hnen, leitet den Beitrag nicht an dieses weiter, da die Verteilung der Kommentare komplett vom Originalbeitrag bestimmt wird.","title":"Beitr\u00e4ge auf Community-Foren"},{"location":"de/user/groups-and-privacy/","tags":["user","gruppen","datenschutz"],"text":"Gruppen und Privatsph\u00e4re # Gruppen sind nur eine Ansammlung von Freunden. Aber Friendica nutzt diese, um sehr m\u00e4chtige Features zur Verf\u00fcgung zu stellen. Gruppen erstellen # Um eine Gruppe zu erstellen, besuche deine \"Kontakte\"-Seite und w\u00e4hle \"Neue Gruppe erstellen\" (je nach Design nur als Pluszeichen angezeigt). Gib deiner Gruppe einen Namen. Das f\u00fchrt dich zu einer Seite, auf der du die Gruppenmitglieder ausw\u00e4hlen kannst. Du hast zwei Boxen auf der Seite. Die obere Box ist die \u00dcbersicht der aktuellen Mitglieder. Die untere beinhaltet alle Freunde, die nicht Mitglied dieser Gruppe sind. Wenn du auf das Foto einer Person klickst, die nicht in der Gruppe ist, wird diese in die Gruppe verschoben. Wenn du auf das Foto einer Person klickst, die bereits in der Gruppe ist, dann wird diese Person daraus entfernt. Zugriffskontrolle # Sobald du eine Gruppe erstellt hast, kannst du diese auf jeder Zugriffsrechteliste nutzen. Damit ist das kleine Schloss neben deinem Statuseditor auf deiner Startseite gemeint. Wenn du darauf klickst, kannst du ausw\u00e4hlen, wer deinen Beitrag sehen kann und wer nicht . Dabei kann es sich um eine einzelne Person oder eine ganze Gruppe handeln. Auf deiner \"Netzwerk\"-Seite (\"Unterhaltungen deiner Kontakte\") findest du Beitr\u00e4ge und Gespr\u00e4che aller deiner Kontakte in deinem Netzwerk. Du kannst aber auch eine einzelne Gruppe ausw\u00e4hlen und nur Beitr\u00e4ge dieser Gruppenmitglieder anzeigen lassen. Aber stopp, es gibt noch mehr... Wenn du auf deiner \"Netzwerk\"-Seite eine bestimmte Gruppe ausgew\u00e4hlt hast, dann findest du im Statuseditor neben dem Schloss ein Ausrufezeichen. Dies dient dazu, deine Aufmerksamkeit auf das Schloss zu richten. Klicke auf das Schloss. Dort siehst du, dass dein Status-Update in dieser Ansicht standardm\u00e4\u00dfig nur f\u00fcr diese Gruppe freigegeben ist. Das hilft dir, deinen zuk\u00fcnftigen Mitarbeitern nicht das Gleiche zu schreiben wie deinen Trinkfreunden. Du kannst diese Einstellung nat\u00fcrlich auch \u00fcberschreiben. Standardm\u00e4\u00dfige Zugriffsrechte von Beitr\u00e4gen # Standardm\u00e4\u00dfig geht Friendica davon aus, dass alle deine Beitr\u00e4ge privat sein sollen. Aus diesem Grund erstellt Friendica nach der Anmeldung eine Gruppe, in die automatisch alle deine Kontakte hinzugef\u00fcgt werden. Alle deine Beitr\u00e4ge sind nur auf diese Gruppe beschr\u00e4nkt. Beachte, dass diese Einstellung von deinem Seiten-Administrator \u00fcberschrieben werden kann, was bedeutet, dass alle deine Beitr\u00e4ge standardm\u00e4\u00dfig \"\u00f6ffentlich\" sind (beispielsweise f\u00fcr das gesamte Internet). Wenn du deine Beitr\u00e4ge standardm\u00e4\u00dfig \"\u00f6ffentlich\" haben willst, dann kannst du deine Standardzugriffsrechte auf deiner Einstellungsseite \u00e4ndern. Dort kannst du au\u00dferdem festlegen, welchen Gruppen standardm\u00e4\u00dfig deine Beitr\u00e4ge erhalten oder in welche Gruppe deine neuen Kontakte standardm\u00e4\u00dfig eingeordnet werden. Fragen der Privatsph\u00e4re, die zu beachten sind Diese privaten Gespr\u00e4che funktionieren am besten, wenn deine Freunde Friendica-Mitglieder sind. So wissen wir, wer sonst noch deine Gespr\u00e4che sehen kann - niemand, solange deine Freunde deine Nachrichten nicht kopieren und an andere verschicken. Dies ist eine Vertrauensfrage, die du beachten musst. Keine Software der Welt kann deine Freunde davon abhalten, die privaten Unterhaltungen zu ver\u00f6ffentlichen. Nur eine gute Auswahl deiner Freunde. Bei GNu Social und anderen Netzwerk-Anbietern ist es nicht so gesichert. Du musst sehr vorsichtig sein, wenn du Mitglieder anderer Netzwerke in einer deiner Gruppen hast, da es m\u00f6glich ist, dass deine privaten Nachrichten in einem \u00f6ffentlichen Stream enden. Wenn du auf die \"Kontakt bearbeiten\"-Seite einer Person gehst, zeigen wir dir, ob sie Mitglied eines unsicheren Netzwerks ist oder nicht. Sobald du einen Post erstellt hast, kannst du die Zugriffsrechte nicht mehr \u00e4ndern. Innerhalb von Sekunden ist dieser an viele verschiedene Personen verschickt worden - m\u00f6glicherweise bereits an alle Adressierten. Wenn du versehentlich eine Nachricht erstellt hast und sie zur\u00fccknehmen willst, dann ist es das beste, diese zu l\u00f6schen. Wir senden eine L\u00f6schmitteilung an jeden, der deine Nachricht erhalten hat - und das sollte die Nachricht genauso schnell l\u00f6schen, wie sie zun\u00e4chst erstellt wurde. In vielen F\u00e4llen wird sie in weniger als einer Minute aus dem Internet gel\u00f6scht. Nochmals: das gilt f\u00fcr Friendica-Netzwerke. Sobald eine Nachricht an ein anderes Netzwerk geschickt wurde, kann es nicht mehr so schnell gel\u00f6scht werden und in manchen F\u00e4llen auch gar nicht mehr. Wenn du das bisher noch nicht wusstest, dann empfehlen wir dir, deine Freunde dazu zu ermutigen, auch Friendica zu nutzen, da alle diese Privatsph\u00e4ren-Einstellungen innerhalb eines privatsph\u00e4renbewussten Netzwerks viel besser funktionieren. Viele andere Netzwerke, mit denen sich Friendica verbinden kann, bieten keine Kontrolle \u00fcber die Privatsph\u00e4re. Profile, Fotos und die Privatsph\u00e4re # Die dezentralisierte Natur von Friendica (statt eine Webseite zu haben, die alles kontrolliert, gibt es viele Webseiten, die Information austauschen) hat in der Kommunikation mit anderen Seiten einige Konsequenzen. Du solltest dir \u00fcber einige Dinge bewusst sein, um am besten entscheiden zu k\u00f6nnen, wie du mit deiner Privatsph\u00e4re umgehst. Fotos # Fotos privat zu verteilen ist ein Problem. Wir k\u00f6nnen Fotos nur mit Friendica-Nutzern privat austauschen. Um mit anderen Leuten Fotos zu teilen, m\u00fcssen wir erkennen, wer sie sind. Wir k\u00f6nnen die Identit\u00e4t von Friendica-Nutzern pr\u00fcfen, da es hierf\u00fcr einen Mechanismus gibt. Deine Freunde anderer Netzwerke werden deine privaten Fotos nicht sehen k\u00f6nnen, da wir deren Identit\u00e4t nicht \u00fcberpr\u00fcfen k\u00f6nnen. Unsere Entwickler arbeiten an einer L\u00f6sung, um deinen Freunden den Zugriff zu erm\u00f6glichen - unabh\u00e4ngig, zu welchem Netzwerk sie geh\u00f6ren. Wir nehmen hingegen Privatsph\u00e4re ernst und agieren nicht wie andere Netzwerke, die nur so tun, als ob deine Fotos privat sind, sie aber trotzdem anderen ohne Identit\u00e4tspr\u00fcfung zeigen. Profile # Dein Profil und deine \"Wall\" sollen vielleicht auch von Freunden anderer Netzwerke besucht werden k\u00f6nnen. Wenn du diese Seiten allerdings f\u00fcr Webbesucher sperrst, die Friendica nicht kennt, kann das auch Freunde anderer Netzwerke blockieren. Das kann m\u00f6glicherweise ungewollte Ergebnisse produzieren, wenn du lange Statusbeitr\u00e4ge z.B. f\u00fcr Twitter oder Facebook schreibst. Wenn Friendica einen Beitrag an diese Netzwerke schickt und nur eine bestimmte Nachrichtenl\u00e4nge erlaubt ist, dann verk\u00fcrzen wir diesen und erstellen einen Link, der zum Originalbeitrag f\u00fchrt. Der Originallink f\u00fchrt zur\u00fcck zu deinem Friendica-Profil. Da Friendica nicht best\u00e4tigen kann, um wen es sich handelt, kann es passieren, dass diese Leute den Beitrag nicht komplett lesen k\u00f6nnen. F\u00fcr Leute, die davon betroffen sind, schlagen wir vor, eine Zusammenfassung in Twitter-L\u00e4nge zu erstellen mit mehr Details f\u00fcr Freunde, die den ganzen Beitrag sehen k\u00f6nnen. Dein Profil oder deine gesamte Friendica-Seite zu blockieren, hat au\u00dferdem ernsthafte Einfl\u00fcsse auf deine Kommunikation mit GNU Social-Nutzern. Diese Netzwerke kommunizieren mit anderen \u00fcber \u00f6ffentliche Protokolle, die nicht authentifiziert werden. Um deine Beitr\u00e4ge zu sehen, m\u00fcssen diese Netzwerke deine Beitr\u00e4ge als \"unbekannte Webbesucher\" ansehen. Wenn wir das erlauben, w\u00fcrde es dazu f\u00fchren, das absolut jeder deine Beitr\u00e4ge sehen. Und du hast Friendica so eingestellt, das nicht zuzulassen. Beachte also, dass das Blockieren von unbekannten Besuchern auch dazu f\u00fchren kann, dass \u00f6ffentliche Netzwerke (wie GNU Social) und Newsfeed-Reader auch geblockt werden.","title":"Gruppen & Privatsph\u00e4re"},{"location":"de/user/groups-and-privacy/#gruppen-und-privatsphare","text":"Gruppen sind nur eine Ansammlung von Freunden. Aber Friendica nutzt diese, um sehr m\u00e4chtige Features zur Verf\u00fcgung zu stellen.","title":"Gruppen und Privatsph\u00e4re"},{"location":"de/user/groups-and-privacy/#gruppen-erstellen","text":"Um eine Gruppe zu erstellen, besuche deine \"Kontakte\"-Seite und w\u00e4hle \"Neue Gruppe erstellen\" (je nach Design nur als Pluszeichen angezeigt). Gib deiner Gruppe einen Namen. Das f\u00fchrt dich zu einer Seite, auf der du die Gruppenmitglieder ausw\u00e4hlen kannst. Du hast zwei Boxen auf der Seite. Die obere Box ist die \u00dcbersicht der aktuellen Mitglieder. Die untere beinhaltet alle Freunde, die nicht Mitglied dieser Gruppe sind. Wenn du auf das Foto einer Person klickst, die nicht in der Gruppe ist, wird diese in die Gruppe verschoben. Wenn du auf das Foto einer Person klickst, die bereits in der Gruppe ist, dann wird diese Person daraus entfernt.","title":"Gruppen erstellen"},{"location":"de/user/groups-and-privacy/#zugriffskontrolle","text":"Sobald du eine Gruppe erstellt hast, kannst du diese auf jeder Zugriffsrechteliste nutzen. Damit ist das kleine Schloss neben deinem Statuseditor auf deiner Startseite gemeint. Wenn du darauf klickst, kannst du ausw\u00e4hlen, wer deinen Beitrag sehen kann und wer nicht . Dabei kann es sich um eine einzelne Person oder eine ganze Gruppe handeln. Auf deiner \"Netzwerk\"-Seite (\"Unterhaltungen deiner Kontakte\") findest du Beitr\u00e4ge und Gespr\u00e4che aller deiner Kontakte in deinem Netzwerk. Du kannst aber auch eine einzelne Gruppe ausw\u00e4hlen und nur Beitr\u00e4ge dieser Gruppenmitglieder anzeigen lassen. Aber stopp, es gibt noch mehr... Wenn du auf deiner \"Netzwerk\"-Seite eine bestimmte Gruppe ausgew\u00e4hlt hast, dann findest du im Statuseditor neben dem Schloss ein Ausrufezeichen. Dies dient dazu, deine Aufmerksamkeit auf das Schloss zu richten. Klicke auf das Schloss. Dort siehst du, dass dein Status-Update in dieser Ansicht standardm\u00e4\u00dfig nur f\u00fcr diese Gruppe freigegeben ist. Das hilft dir, deinen zuk\u00fcnftigen Mitarbeitern nicht das Gleiche zu schreiben wie deinen Trinkfreunden. Du kannst diese Einstellung nat\u00fcrlich auch \u00fcberschreiben.","title":"Zugriffskontrolle"},{"location":"de/user/groups-and-privacy/#standardmaige-zugriffsrechte-von-beitragen","text":"Standardm\u00e4\u00dfig geht Friendica davon aus, dass alle deine Beitr\u00e4ge privat sein sollen. Aus diesem Grund erstellt Friendica nach der Anmeldung eine Gruppe, in die automatisch alle deine Kontakte hinzugef\u00fcgt werden. Alle deine Beitr\u00e4ge sind nur auf diese Gruppe beschr\u00e4nkt. Beachte, dass diese Einstellung von deinem Seiten-Administrator \u00fcberschrieben werden kann, was bedeutet, dass alle deine Beitr\u00e4ge standardm\u00e4\u00dfig \"\u00f6ffentlich\" sind (beispielsweise f\u00fcr das gesamte Internet). Wenn du deine Beitr\u00e4ge standardm\u00e4\u00dfig \"\u00f6ffentlich\" haben willst, dann kannst du deine Standardzugriffsrechte auf deiner Einstellungsseite \u00e4ndern. Dort kannst du au\u00dferdem festlegen, welchen Gruppen standardm\u00e4\u00dfig deine Beitr\u00e4ge erhalten oder in welche Gruppe deine neuen Kontakte standardm\u00e4\u00dfig eingeordnet werden. Fragen der Privatsph\u00e4re, die zu beachten sind Diese privaten Gespr\u00e4che funktionieren am besten, wenn deine Freunde Friendica-Mitglieder sind. So wissen wir, wer sonst noch deine Gespr\u00e4che sehen kann - niemand, solange deine Freunde deine Nachrichten nicht kopieren und an andere verschicken. Dies ist eine Vertrauensfrage, die du beachten musst. Keine Software der Welt kann deine Freunde davon abhalten, die privaten Unterhaltungen zu ver\u00f6ffentlichen. Nur eine gute Auswahl deiner Freunde. Bei GNu Social und anderen Netzwerk-Anbietern ist es nicht so gesichert. Du musst sehr vorsichtig sein, wenn du Mitglieder anderer Netzwerke in einer deiner Gruppen hast, da es m\u00f6glich ist, dass deine privaten Nachrichten in einem \u00f6ffentlichen Stream enden. Wenn du auf die \"Kontakt bearbeiten\"-Seite einer Person gehst, zeigen wir dir, ob sie Mitglied eines unsicheren Netzwerks ist oder nicht. Sobald du einen Post erstellt hast, kannst du die Zugriffsrechte nicht mehr \u00e4ndern. Innerhalb von Sekunden ist dieser an viele verschiedene Personen verschickt worden - m\u00f6glicherweise bereits an alle Adressierten. Wenn du versehentlich eine Nachricht erstellt hast und sie zur\u00fccknehmen willst, dann ist es das beste, diese zu l\u00f6schen. Wir senden eine L\u00f6schmitteilung an jeden, der deine Nachricht erhalten hat - und das sollte die Nachricht genauso schnell l\u00f6schen, wie sie zun\u00e4chst erstellt wurde. In vielen F\u00e4llen wird sie in weniger als einer Minute aus dem Internet gel\u00f6scht. Nochmals: das gilt f\u00fcr Friendica-Netzwerke. Sobald eine Nachricht an ein anderes Netzwerk geschickt wurde, kann es nicht mehr so schnell gel\u00f6scht werden und in manchen F\u00e4llen auch gar nicht mehr. Wenn du das bisher noch nicht wusstest, dann empfehlen wir dir, deine Freunde dazu zu ermutigen, auch Friendica zu nutzen, da alle diese Privatsph\u00e4ren-Einstellungen innerhalb eines privatsph\u00e4renbewussten Netzwerks viel besser funktionieren. Viele andere Netzwerke, mit denen sich Friendica verbinden kann, bieten keine Kontrolle \u00fcber die Privatsph\u00e4re.","title":"Standardm\u00e4\u00dfige Zugriffsrechte von Beitr\u00e4gen"},{"location":"de/user/groups-and-privacy/#profile-fotos-und-die-privatsphare","text":"Die dezentralisierte Natur von Friendica (statt eine Webseite zu haben, die alles kontrolliert, gibt es viele Webseiten, die Information austauschen) hat in der Kommunikation mit anderen Seiten einige Konsequenzen. Du solltest dir \u00fcber einige Dinge bewusst sein, um am besten entscheiden zu k\u00f6nnen, wie du mit deiner Privatsph\u00e4re umgehst.","title":"Profile, Fotos und die Privatsph\u00e4re"},{"location":"de/user/groups-and-privacy/#fotos","text":"Fotos privat zu verteilen ist ein Problem. Wir k\u00f6nnen Fotos nur mit Friendica-Nutzern privat austauschen. Um mit anderen Leuten Fotos zu teilen, m\u00fcssen wir erkennen, wer sie sind. Wir k\u00f6nnen die Identit\u00e4t von Friendica-Nutzern pr\u00fcfen, da es hierf\u00fcr einen Mechanismus gibt. Deine Freunde anderer Netzwerke werden deine privaten Fotos nicht sehen k\u00f6nnen, da wir deren Identit\u00e4t nicht \u00fcberpr\u00fcfen k\u00f6nnen. Unsere Entwickler arbeiten an einer L\u00f6sung, um deinen Freunden den Zugriff zu erm\u00f6glichen - unabh\u00e4ngig, zu welchem Netzwerk sie geh\u00f6ren. Wir nehmen hingegen Privatsph\u00e4re ernst und agieren nicht wie andere Netzwerke, die nur so tun, als ob deine Fotos privat sind, sie aber trotzdem anderen ohne Identit\u00e4tspr\u00fcfung zeigen.","title":"Fotos"},{"location":"de/user/groups-and-privacy/#profile","text":"Dein Profil und deine \"Wall\" sollen vielleicht auch von Freunden anderer Netzwerke besucht werden k\u00f6nnen. Wenn du diese Seiten allerdings f\u00fcr Webbesucher sperrst, die Friendica nicht kennt, kann das auch Freunde anderer Netzwerke blockieren. Das kann m\u00f6glicherweise ungewollte Ergebnisse produzieren, wenn du lange Statusbeitr\u00e4ge z.B. f\u00fcr Twitter oder Facebook schreibst. Wenn Friendica einen Beitrag an diese Netzwerke schickt und nur eine bestimmte Nachrichtenl\u00e4nge erlaubt ist, dann verk\u00fcrzen wir diesen und erstellen einen Link, der zum Originalbeitrag f\u00fchrt. Der Originallink f\u00fchrt zur\u00fcck zu deinem Friendica-Profil. Da Friendica nicht best\u00e4tigen kann, um wen es sich handelt, kann es passieren, dass diese Leute den Beitrag nicht komplett lesen k\u00f6nnen. F\u00fcr Leute, die davon betroffen sind, schlagen wir vor, eine Zusammenfassung in Twitter-L\u00e4nge zu erstellen mit mehr Details f\u00fcr Freunde, die den ganzen Beitrag sehen k\u00f6nnen. Dein Profil oder deine gesamte Friendica-Seite zu blockieren, hat au\u00dferdem ernsthafte Einfl\u00fcsse auf deine Kommunikation mit GNU Social-Nutzern. Diese Netzwerke kommunizieren mit anderen \u00fcber \u00f6ffentliche Protokolle, die nicht authentifiziert werden. Um deine Beitr\u00e4ge zu sehen, m\u00fcssen diese Netzwerke deine Beitr\u00e4ge als \"unbekannte Webbesucher\" ansehen. Wenn wir das erlauben, w\u00fcrde es dazu f\u00fchren, das absolut jeder deine Beitr\u00e4ge sehen. Und du hast Friendica so eingestellt, das nicht zuzulassen. Beachte also, dass das Blockieren von unbekannten Besuchern auch dazu f\u00fchren kann, dass \u00f6ffentliche Netzwerke (wie GNU Social) und Newsfeed-Reader auch geblockt werden.","title":"Profile"},{"location":"de/user/making-friends/","tags":["user"],"text":"Freunde finden # Freundschaft kann in Friendica viele verschiedene Bedeutungen annehmen. Aber lasst es uns einfach halten, du willst einfach mit jemandem befreundet sein. Wie machst du das? Schau dir das Verzeichnis an. Das Verzeichnis ist in zwei Teile aufgeteilt. Wenn du auf den \"Verzeichnis\"-Button klickst, wirst du zun\u00e4chst alle Mitglieder deines Servers sehen, die sich dazu entschlossen haben, angezeigt zu werden. Au\u00dferdem siehst du dort einen Link zum globalen Verzeichnis. Wenn du dich durch das globale Verzeichnis klickst, siehst du alle Nutzer weltweit auf allen Servern, die sich entschlossen haben, im Verzeichnis zu erscheinen. Du wirst zudem den Link \"Show Community Forums\" sehen, welcher dich zu Gruppen, Foren und Fan-Seiten f\u00fchrt. Du verbindest dich mit Personen, Gruppen und Foren auf die gleiche Art, wobei Gruppen und Foren deine Anfrage automatisch annehmen, wohingegen ein Mensch dich erst manuell best\u00e4tigen muss. Mit anderen Friendica-Nutzern verbinden # Besuche ihr Profil. Direkt unter dem Profilfoto ist das Wort \"Verbinden\" (bzw. \"Connect\" in einem englischsprachigem Profil). Klicke darauf und du gelangst zur \"Verbinden\"-Seite. Dort wirst du nach deiner Identit\u00e4tsadresse gefragt. Das ist n\u00f6tig, damit die Seite dein Profil finden kann. Was kommt in die Box? # Wenn deine Friendica-Seite \"demo.friendica.com\" hei\u00dft und dein Nutzername/Spitzname auf der Seite \"bob\" ist, dann w\u00e4re es \"bob@demo.friendica.com\". Wie du siehst, sieht es wie eine E-Mail-Adresse aus. Das ist beabsichtigt, da sich die Leute das so leichter merken k\u00f6nnen. Du kannst auch die URL deiner Startseite eintragen, wie z.B. \"http://demo.friendica.com/profile/bob\", aber der Email-Adressen-Stil ist einfacher. Wenn du die \"Verbinden\"-Seite best\u00e4tigt hast, kommst du zur\u00fcck zu deiner Seite, um dort die Anfrage zu best\u00e4tigen. Wenn du das gemacht hast, k\u00f6nnen beide Seiten miteinander kommunizieren, um den Prozess abzuschlie\u00dfen (sobald dein neuer Freund die Anfrage best\u00e4tigt hat). Wenn du bereits die Identit\u00e4ts-Adresse einer Person kennst, kannst du diese auch direkt in das \"Verbinden\"-Feld auf deiner \"Kontakte\"-Seite eintragen. Dies wird dich durch einen \u00e4hnlichen Prozess leiten. Alternative Netzwerke # Du kannst deine oder andere Identit\u00e4ts-Adressen ebenfalls nutzen, um \u00fcber verschiedene Netzwerke hinweg Freundschaften aufzubauen. Die Liste m\u00f6glicher Netzwerke steigt immer weiter. Wenn du z.B. \"bob\" auf quitter.se (eine GNU Social-Seite) kennst, dann kannst du bob@quitter.se auf deiner \"Kontakt\"-Seite verbinden. (Oder du kannst die URL von Bobs quitter.se-Seite eintragen, wenn du es w\u00fcnscht). Tats\u00e4chlich kannst du jedem und jeder Website folgen, der/die einen Syndication-Feed (RSS/Atom etc.) zur Verf\u00fcgung stellt. Wenn wir einen Informationsstrom und einen Namen dazu finden, k\u00f6nnen wir auch versuchen, uns damit zu verbinden. Wenn du deine E-Mail-Postfachverbindung auf deiner Einstellungsseite konfiguriert hast, dann kannst du die E-Mail-Adresse jeder Person eintragen, die dir schon eine Nachricht an dein Postfach geschickt hat und bereits in deinem sozialen Stream erscheint. Du kannst diesen Personen au\u00dferdem von Friendica aus antworten. Leute k\u00f6nnen sich ebenfalls von anderen Netzwerken aus mit dir befreunden. Ein Freund von dir hat einen GNU Social-Account und kann sich mit dir befreunden, indem er deine Identit\u00e4ts-Adresse in seine GNU Social-Verbinden-Dialogbox eintr\u00e4gt. Ein \u00e4hnlicher Mechanismus ist f\u00fcr Diaspora-Nutzer vorhanden, indem deine Identit\u00e4ts-Adresse in ihre Suchleiste eingegeben wird. Beachte: Manche GNU Social-Versionen ben\u00f6tigen die volle URL deines Profils und funktionieren m\u00f6glicherweise nicht mit der Identit\u00e4ts-Adresse. Wenn jemand eine Freundschaftsanfrage schickt, erh\u00e4ltst du eine Benachrichtigung. Du musst dann diese Anfrage best\u00e4tigen, um die Freundschaftsanfrage abzuschlie\u00dfen. Einige Netzwerke erlauben es, Nachrichten zu schicken, ohne befreundet zu sein oder deine Best\u00e4tigung zu ben\u00f6tigen. Friendica erlaubt dies in der Standardeinstellung nicht, da es zu Spam f\u00fchren kann. Wenn du eine Freundschaftsanfrage von einem anderen Friendica-Nutzer erh\u00e4ltst, dann hast du die M\u00f6glichkeit, diesen als \"Fan\" oder \"Freund\" einzutragen. Ein Fan kann sehen, was du schreibst und auch private Kommunikation sehen, die du zu diesen sendest, aber nicht umgekehrt. Als Freund kannst du in beide Richtungen kommunizieren. Diaspora nutzt eine andere Terminologie mit der Unterteilung in \"mit dir teilen\" und \"Freund\". Sobald ihr Freunde geworden seid, dir die Person aber permanent Spam oder sinnlose Informationen schickt, dann kannst du diese \"ignorieren\" - ohne die Freundschaft komplett zu beenden oder denjenigen zu zeigen, dass du nicht daran interessiert bist, was diese Person sagt. In verschiedener Hinsicht sind diese Personen wie \"Fans\", aber sie wissen es nicht. Sie denken, sie sind als Freunde eingetragen. Du kannst auch eine Person \"blocken\". Das blockt die komplette Kommunikation mit dieser Person. Sie k\u00f6nnen zwar weiterhin \u00f6ffentliche Beitr\u00e4ge sehen, wie auch jeder andere in der Welt, allerdings k\u00f6nnen sie nicht direkt mit dir kommunizieren. Du kannst Freunde l\u00f6schen, egal wie der Freundschaftsstatus ist, was dazu f\u00fchrt, dass alles, was mit dieser Person verbunden ist, von deiner Webseite gel\u00f6scht wird.","title":"Freunde finden"},{"location":"de/user/making-friends/#freunde-finden","text":"Freundschaft kann in Friendica viele verschiedene Bedeutungen annehmen. Aber lasst es uns einfach halten, du willst einfach mit jemandem befreundet sein. Wie machst du das? Schau dir das Verzeichnis an. Das Verzeichnis ist in zwei Teile aufgeteilt. Wenn du auf den \"Verzeichnis\"-Button klickst, wirst du zun\u00e4chst alle Mitglieder deines Servers sehen, die sich dazu entschlossen haben, angezeigt zu werden. Au\u00dferdem siehst du dort einen Link zum globalen Verzeichnis. Wenn du dich durch das globale Verzeichnis klickst, siehst du alle Nutzer weltweit auf allen Servern, die sich entschlossen haben, im Verzeichnis zu erscheinen. Du wirst zudem den Link \"Show Community Forums\" sehen, welcher dich zu Gruppen, Foren und Fan-Seiten f\u00fchrt. Du verbindest dich mit Personen, Gruppen und Foren auf die gleiche Art, wobei Gruppen und Foren deine Anfrage automatisch annehmen, wohingegen ein Mensch dich erst manuell best\u00e4tigen muss.","title":"Freunde finden"},{"location":"de/user/making-friends/#mit-anderen-friendica-nutzern-verbinden","text":"Besuche ihr Profil. Direkt unter dem Profilfoto ist das Wort \"Verbinden\" (bzw. \"Connect\" in einem englischsprachigem Profil). Klicke darauf und du gelangst zur \"Verbinden\"-Seite. Dort wirst du nach deiner Identit\u00e4tsadresse gefragt. Das ist n\u00f6tig, damit die Seite dein Profil finden kann.","title":"Mit anderen Friendica-Nutzern verbinden"},{"location":"de/user/making-friends/#was-kommt-in-die-box","text":"Wenn deine Friendica-Seite \"demo.friendica.com\" hei\u00dft und dein Nutzername/Spitzname auf der Seite \"bob\" ist, dann w\u00e4re es \"bob@demo.friendica.com\". Wie du siehst, sieht es wie eine E-Mail-Adresse aus. Das ist beabsichtigt, da sich die Leute das so leichter merken k\u00f6nnen. Du kannst auch die URL deiner Startseite eintragen, wie z.B. \"http://demo.friendica.com/profile/bob\", aber der Email-Adressen-Stil ist einfacher. Wenn du die \"Verbinden\"-Seite best\u00e4tigt hast, kommst du zur\u00fcck zu deiner Seite, um dort die Anfrage zu best\u00e4tigen. Wenn du das gemacht hast, k\u00f6nnen beide Seiten miteinander kommunizieren, um den Prozess abzuschlie\u00dfen (sobald dein neuer Freund die Anfrage best\u00e4tigt hat). Wenn du bereits die Identit\u00e4ts-Adresse einer Person kennst, kannst du diese auch direkt in das \"Verbinden\"-Feld auf deiner \"Kontakte\"-Seite eintragen. Dies wird dich durch einen \u00e4hnlichen Prozess leiten.","title":"Was kommt in die Box?"},{"location":"de/user/making-friends/#alternative-netzwerke","text":"Du kannst deine oder andere Identit\u00e4ts-Adressen ebenfalls nutzen, um \u00fcber verschiedene Netzwerke hinweg Freundschaften aufzubauen. Die Liste m\u00f6glicher Netzwerke steigt immer weiter. Wenn du z.B. \"bob\" auf quitter.se (eine GNU Social-Seite) kennst, dann kannst du bob@quitter.se auf deiner \"Kontakt\"-Seite verbinden. (Oder du kannst die URL von Bobs quitter.se-Seite eintragen, wenn du es w\u00fcnscht). Tats\u00e4chlich kannst du jedem und jeder Website folgen, der/die einen Syndication-Feed (RSS/Atom etc.) zur Verf\u00fcgung stellt. Wenn wir einen Informationsstrom und einen Namen dazu finden, k\u00f6nnen wir auch versuchen, uns damit zu verbinden. Wenn du deine E-Mail-Postfachverbindung auf deiner Einstellungsseite konfiguriert hast, dann kannst du die E-Mail-Adresse jeder Person eintragen, die dir schon eine Nachricht an dein Postfach geschickt hat und bereits in deinem sozialen Stream erscheint. Du kannst diesen Personen au\u00dferdem von Friendica aus antworten. Leute k\u00f6nnen sich ebenfalls von anderen Netzwerken aus mit dir befreunden. Ein Freund von dir hat einen GNU Social-Account und kann sich mit dir befreunden, indem er deine Identit\u00e4ts-Adresse in seine GNU Social-Verbinden-Dialogbox eintr\u00e4gt. Ein \u00e4hnlicher Mechanismus ist f\u00fcr Diaspora-Nutzer vorhanden, indem deine Identit\u00e4ts-Adresse in ihre Suchleiste eingegeben wird. Beachte: Manche GNU Social-Versionen ben\u00f6tigen die volle URL deines Profils und funktionieren m\u00f6glicherweise nicht mit der Identit\u00e4ts-Adresse. Wenn jemand eine Freundschaftsanfrage schickt, erh\u00e4ltst du eine Benachrichtigung. Du musst dann diese Anfrage best\u00e4tigen, um die Freundschaftsanfrage abzuschlie\u00dfen. Einige Netzwerke erlauben es, Nachrichten zu schicken, ohne befreundet zu sein oder deine Best\u00e4tigung zu ben\u00f6tigen. Friendica erlaubt dies in der Standardeinstellung nicht, da es zu Spam f\u00fchren kann. Wenn du eine Freundschaftsanfrage von einem anderen Friendica-Nutzer erh\u00e4ltst, dann hast du die M\u00f6glichkeit, diesen als \"Fan\" oder \"Freund\" einzutragen. Ein Fan kann sehen, was du schreibst und auch private Kommunikation sehen, die du zu diesen sendest, aber nicht umgekehrt. Als Freund kannst du in beide Richtungen kommunizieren. Diaspora nutzt eine andere Terminologie mit der Unterteilung in \"mit dir teilen\" und \"Freund\". Sobald ihr Freunde geworden seid, dir die Person aber permanent Spam oder sinnlose Informationen schickt, dann kannst du diese \"ignorieren\" - ohne die Freundschaft komplett zu beenden oder denjenigen zu zeigen, dass du nicht daran interessiert bist, was diese Person sagt. In verschiedener Hinsicht sind diese Personen wie \"Fans\", aber sie wissen es nicht. Sie denken, sie sind als Freunde eingetragen. Du kannst auch eine Person \"blocken\". Das blockt die komplette Kommunikation mit dieser Person. Sie k\u00f6nnen zwar weiterhin \u00f6ffentliche Beitr\u00e4ge sehen, wie auch jeder andere in der Welt, allerdings k\u00f6nnen sie nicht direkt mit dir kommunizieren. Du kannst Freunde l\u00f6schen, egal wie der Freundschaftsstatus ist, was dazu f\u00fchrt, dass alles, was mit dieser Person verbunden ist, von deiner Webseite gel\u00f6scht wird.","title":"Alternative Netzwerke"},{"location":"de/user/move-account/","tags":["user"],"text":"Accounts Umziehen # ! Dies ist ein experimentelles Feature Wie man einen Account von einem Server zu einem anderen umzieht. # Unter \"Einstellungen\" -> \"Pers\u00f6nliche Daten exportieren\" aufrufen. \"Account exportieren\" anklicken und die Daten speichern. Diese Datei enth\u00e4lt Details \u00fcber dich, deine Kontakte, Gruppen und pers\u00f6nliche Einstellungen. Au\u00dferdem enth\u00e4lt sie deinen geheimen Schl\u00fcssel, mit dem du dich deinen Kontakten gegen\u00fcber ausweist. Speichere diese Datei an einem sicheren Ort ! Rufe nun dem neuen Server die Seite http://newserver.com/uimport auf (es gibt derzeit keinen direkten Link auf diese Seite). Bitte beachte, dass dies nur auf Servern m\u00f6glich ist, an denen man sich offen anmelden kann. Bei Servern, bei denen der Administrator Accounts freigeben muss, ist das Hochladen nicht m\u00f6glich. Hier kann dies nur der Administrator selber durchf\u00fchren. Lege auf dem neuen Server auf keinen Fall einen gleichnamigen Account an! uimport muss anstelle des Registrierens verwendet werden. W\u00e4hle die gesicherte Account-Datei aus und klicke \"Importieren\". Friendica wird nun deinen Account auf dem neuen Server wiederherstellen, mit all deinen Friendica Kontakten und Gruppen. An deine Friendica Kontakte wird au\u00dferdem eine Nachricht gesendet um sie \u00fcber deine neue Adresse zu informieren. Wenn deine Kontakte ihren Account auf einem aktuellen Server haben, werden deine Kontaktdetails automatisch aktualisiert. Neuere Diaspora Server unterst\u00fctzen ebenfalls eine Umzugsbenachrichtigung. Kontakte auf GNU Social werden archiviert, da wir ihnen keine Information \u00fcber deinen Umzug zukommen lassen k\u00f6nnen. Du solltest sie pers\u00f6nlich anschreiben deinen Eintrag aus ihren Kontaktlisten zu entfernen und dich neu hinzuzuf\u00fcgen, anschlie\u00dfend solltest du da gleiche mit ihren Accounts tun. Nach dem Umzug wird dein Account auf dem alten Server nicht mehr zuverl\u00e4ssig funktionieren und sollte deshalb gel\u00f6scht werden.","title":"Accounts umziehen"},{"location":"de/user/move-account/#accounts-umziehen","text":"! Dies ist ein experimentelles Feature","title":"Accounts Umziehen"},{"location":"de/user/move-account/#wie-man-einen-account-von-einem-server-zu-einem-anderen-umzieht","text":"Unter \"Einstellungen\" -> \"Pers\u00f6nliche Daten exportieren\" aufrufen. \"Account exportieren\" anklicken und die Daten speichern. Diese Datei enth\u00e4lt Details \u00fcber dich, deine Kontakte, Gruppen und pers\u00f6nliche Einstellungen. Au\u00dferdem enth\u00e4lt sie deinen geheimen Schl\u00fcssel, mit dem du dich deinen Kontakten gegen\u00fcber ausweist. Speichere diese Datei an einem sicheren Ort ! Rufe nun dem neuen Server die Seite http://newserver.com/uimport auf (es gibt derzeit keinen direkten Link auf diese Seite). Bitte beachte, dass dies nur auf Servern m\u00f6glich ist, an denen man sich offen anmelden kann. Bei Servern, bei denen der Administrator Accounts freigeben muss, ist das Hochladen nicht m\u00f6glich. Hier kann dies nur der Administrator selber durchf\u00fchren. Lege auf dem neuen Server auf keinen Fall einen gleichnamigen Account an! uimport muss anstelle des Registrierens verwendet werden. W\u00e4hle die gesicherte Account-Datei aus und klicke \"Importieren\". Friendica wird nun deinen Account auf dem neuen Server wiederherstellen, mit all deinen Friendica Kontakten und Gruppen. An deine Friendica Kontakte wird au\u00dferdem eine Nachricht gesendet um sie \u00fcber deine neue Adresse zu informieren. Wenn deine Kontakte ihren Account auf einem aktuellen Server haben, werden deine Kontaktdetails automatisch aktualisiert. Neuere Diaspora Server unterst\u00fctzen ebenfalls eine Umzugsbenachrichtigung. Kontakte auf GNU Social werden archiviert, da wir ihnen keine Information \u00fcber deinen Umzug zukommen lassen k\u00f6nnen. Du solltest sie pers\u00f6nlich anschreiben deinen Eintrag aus ihren Kontaktlisten zu entfernen und dich neu hinzuzuf\u00fcgen, anschlie\u00dfend solltest du da gleiche mit ihren Accounts tun. Nach dem Umzug wird dein Account auf dem alten Server nicht mehr zuverl\u00e4ssig funktionieren und sollte deshalb gel\u00f6scht werden.","title":"Wie man einen Account von einem Server zu einem anderen umzieht."},{"location":"de/user/remove-account/","tags":["user"],"text":"Accounts l\u00f6schen # Wir freuen uns nicht, wenn Leute Friendica verlassen, aber wenn du deinen Account l\u00f6schen willst, dann besuche die folgende URL L\u00f6sche mich -> http://NamederSeite/removeme in deinem Webbrowser. Du musst dabei eingeloggt sein. Du wirst nach deinem Passwort gefragt, um die Anfrage zu best\u00e4tigen. Wenn dieses mit deinem gespeichertem Passwort \u00fcbereinstimmt, dann wird dein Account als \"gel\u00f6scht\" markiert. Dies passiert sofort und kann nicht r\u00fcckg\u00e4ngig gemacht werden. Die meisten deiner Inhalte und Benutzerdaten werden kurzfristig danach durch Hintergrundprozesse gel\u00f6scht. Parallel dazu senden wir eine Mitteilung an die Server deiner Kontakte, damit sie deine dort vorliegenden Daten ebenfalls l\u00f6schen. Wir haben keinen Einfluss darauf, wie sorgf\u00e4ltig und ob \u00fcberhaupt diese Systeme der L\u00f6schaufforderung nachgehen. Aus technischen Gr\u00fcnden ben\u00f6tigen wir f\u00fcr die \u00dcbertragung dieser Mitteilung ein paar Benutzerdaten. Diese Daten werden dann nach einer Frist von etwa sieben Tagen ebenfalls gel\u00f6scht. Wir speichern deinen Benutzernamen dauerhaft, damit sich niemand einen Account unter deinem Spitznamen anlegen kann.","title":"Accounts l\u00f6schen"},{"location":"de/user/remove-account/#accounts-loschen","text":"Wir freuen uns nicht, wenn Leute Friendica verlassen, aber wenn du deinen Account l\u00f6schen willst, dann besuche die folgende URL L\u00f6sche mich -> http://NamederSeite/removeme in deinem Webbrowser. Du musst dabei eingeloggt sein. Du wirst nach deinem Passwort gefragt, um die Anfrage zu best\u00e4tigen. Wenn dieses mit deinem gespeichertem Passwort \u00fcbereinstimmt, dann wird dein Account als \"gel\u00f6scht\" markiert. Dies passiert sofort und kann nicht r\u00fcckg\u00e4ngig gemacht werden. Die meisten deiner Inhalte und Benutzerdaten werden kurzfristig danach durch Hintergrundprozesse gel\u00f6scht. Parallel dazu senden wir eine Mitteilung an die Server deiner Kontakte, damit sie deine dort vorliegenden Daten ebenfalls l\u00f6schen. Wir haben keinen Einfluss darauf, wie sorgf\u00e4ltig und ob \u00fcberhaupt diese Systeme der L\u00f6schaufforderung nachgehen. Aus technischen Gr\u00fcnden ben\u00f6tigen wir f\u00fcr die \u00dcbertragung dieser Mitteilung ein paar Benutzerdaten. Diese Daten werden dann nach einer Frist von etwa sieben Tagen ebenfalls gel\u00f6scht. Wir speichern deinen Benutzernamen dauerhaft, damit sich niemand einen Account unter deinem Spitznamen anlegen kann.","title":"Accounts l\u00f6schen"},{"location":"de/user/tags-and-mentions/","tags":["user"],"text":"Tags und Erw\u00e4hnungen # Wie viele andere soziale Netzwerke benutzt auch Friendica eine spezielle Schreibweise in seinen Nachrichten, um Tags oder kontextbezogene Links zu anderen Beitr\u00e4gen hervorzuheben. Erw\u00e4hnungen # Personen werden \"getaggt\", indem du das @ -Zeichen vor den Namen schreibst. Personen in deiner Kontaktliste werden \u201egetaggt\u201c, indem du das @ -Zeichen vor den Namen schreibst. @mike - deutet auf eine Person hin, die im Netzwerk den Namen \"mike\" nutzt @mike_macgirvin - deutet auf eine Person hin, die sich im Netzwerk \"Mike Macgirvin\" nennt. Beachte, dass Leerzeichen in Tags nicht genutzt werden k\u00f6nnen. @mike+151 - diese Schreibweise deutet auf eine Person hin, die \"mike\" hei\u00dft und deren Kontakt-Identit\u00e4ts-Nummer 151 ist. Bei der Eingabe erscheint direkt ein Auswahlmen\u00fc, sodass du diese Nummer nicht selbst kennen musst. Personen, die in einem anderen Netzwerk sind oder die sich NICHT in deiner Kontaktliste befinden, werden wie folgt getaggt: @mike@macgirvin.com - diese Schreibweise wird \"Fernerw\u00e4hnung\" (remote mention)genannt und kann nur im E-Mail-Stil geschrieben werden, nicht als Internetadresse/URL. Wenn das System ungewollte Erw\u00e4hnungen nicht blockiert, erh\u00e4lt diese Person eine Mitteilung oder nimmt direkt an der Diskussion teil, wenn es sich um einen \u00f6ffentlichen Beitrag handelt. Bitte beachte, dass Friendica eingehende \"Erw\u00e4hnungs\"-Nachrichten von Personen blockt, die du nicht zu deinem Profil hinzugef\u00fcgt hast. Diese Ma\u00dfnahme dient dazu, Spam zu vermeiden. \"Fernerw\u00e4hnungen\" werden durch das OStatus-Protokoll \u00fcbermittelt. Dieses Protokoll wird von Friendica, GNU Social und anderen Systemen genutzt, ist allerdings derzeit nicht in Diaspora eingebaut. Friendica unterscheidet bei Tags nicht zwischen Personen und Gruppen (einige andere Netzwerke nutzen \"!gruppe\", um solche zu markieren). Thematische Tags # Thematische Tags werden durch eine \"#\" gekennzeichnet. Dieses Zeichen erstellen einen Link zur allgemeinen Seitensuche mit dem ausgew\u00e4hlten Begriff. So wird z.B. #Autos zu einer Suche f\u00fchren, die alle Beitr\u00e4ge deiner Seite umfasst, die dieses Wort erw\u00e4hnen. Thematische Tags haben generell eine Mindestl\u00e4nge von 3 Stellen. K\u00fcrzere Suchbegriffe finden meist keine Suchergebnisse, wobei dieses abh\u00e4ngig von der Datenbankeinstellung ist. Tags mit einem Leerzeichen werden, wie es auch bei Namen der Fall ist, durch einen Unterstrich gekennzeichnet. Es ist hingegen nicht m\u00f6glich, Tags zu erstellen, deren gesuchtes Wort einen Unterstrich enth\u00e4lt. Thematische Tags werden auch dann nicht verlinkt, wenn sie nur aus Nummern bestehen, wie z.B. #1. Wenn du einen numerischen Tag nutzen willst, f\u00fcge bitte einen Beschreibungstext hinzu wie z.B. #2012_Wahl.","title":"Tags & Erw\u00e4hnungen"},{"location":"de/user/tags-and-mentions/#tags-und-erwahnungen","text":"Wie viele andere soziale Netzwerke benutzt auch Friendica eine spezielle Schreibweise in seinen Nachrichten, um Tags oder kontextbezogene Links zu anderen Beitr\u00e4gen hervorzuheben.","title":"Tags und Erw\u00e4hnungen"},{"location":"de/user/tags-and-mentions/#erwahnungen","text":"Personen werden \"getaggt\", indem du das @ -Zeichen vor den Namen schreibst. Personen in deiner Kontaktliste werden \u201egetaggt\u201c, indem du das @ -Zeichen vor den Namen schreibst. @mike - deutet auf eine Person hin, die im Netzwerk den Namen \"mike\" nutzt @mike_macgirvin - deutet auf eine Person hin, die sich im Netzwerk \"Mike Macgirvin\" nennt. Beachte, dass Leerzeichen in Tags nicht genutzt werden k\u00f6nnen. @mike+151 - diese Schreibweise deutet auf eine Person hin, die \"mike\" hei\u00dft und deren Kontakt-Identit\u00e4ts-Nummer 151 ist. Bei der Eingabe erscheint direkt ein Auswahlmen\u00fc, sodass du diese Nummer nicht selbst kennen musst. Personen, die in einem anderen Netzwerk sind oder die sich NICHT in deiner Kontaktliste befinden, werden wie folgt getaggt: @mike@macgirvin.com - diese Schreibweise wird \"Fernerw\u00e4hnung\" (remote mention)genannt und kann nur im E-Mail-Stil geschrieben werden, nicht als Internetadresse/URL. Wenn das System ungewollte Erw\u00e4hnungen nicht blockiert, erh\u00e4lt diese Person eine Mitteilung oder nimmt direkt an der Diskussion teil, wenn es sich um einen \u00f6ffentlichen Beitrag handelt. Bitte beachte, dass Friendica eingehende \"Erw\u00e4hnungs\"-Nachrichten von Personen blockt, die du nicht zu deinem Profil hinzugef\u00fcgt hast. Diese Ma\u00dfnahme dient dazu, Spam zu vermeiden. \"Fernerw\u00e4hnungen\" werden durch das OStatus-Protokoll \u00fcbermittelt. Dieses Protokoll wird von Friendica, GNU Social und anderen Systemen genutzt, ist allerdings derzeit nicht in Diaspora eingebaut. Friendica unterscheidet bei Tags nicht zwischen Personen und Gruppen (einige andere Netzwerke nutzen \"!gruppe\", um solche zu markieren).","title":"Erw\u00e4hnungen"},{"location":"de/user/tags-and-mentions/#thematische-tags","text":"Thematische Tags werden durch eine \"#\" gekennzeichnet. Dieses Zeichen erstellen einen Link zur allgemeinen Seitensuche mit dem ausgew\u00e4hlten Begriff. So wird z.B. #Autos zu einer Suche f\u00fchren, die alle Beitr\u00e4ge deiner Seite umfasst, die dieses Wort erw\u00e4hnen. Thematische Tags haben generell eine Mindestl\u00e4nge von 3 Stellen. K\u00fcrzere Suchbegriffe finden meist keine Suchergebnisse, wobei dieses abh\u00e4ngig von der Datenbankeinstellung ist. Tags mit einem Leerzeichen werden, wie es auch bei Namen der Fall ist, durch einen Unterstrich gekennzeichnet. Es ist hingegen nicht m\u00f6glich, Tags zu erstellen, deren gesuchtes Wort einen Unterstrich enth\u00e4lt. Thematische Tags werden auch dann nicht verlinkt, wenn sie nur aus Nummern bestehen, wie z.B. #1. Wenn du einen numerischen Tag nutzen willst, f\u00fcge bitte einen Beschreibungstext hinzu wie z.B. #2012_Wahl.","title":"Thematische Tags"},{"location":"de/user/text-comment/","tags":["user"],"text":"Beitr\u00e4ge kommentieren, einordnen und l\u00f6schen # Hier findest du eine \u00dcbersicht \u00fcber die verschiedenen M\u00f6glichkeiten, bestehende Beitr\u00e4ge einzuordnen und zu kommentieren. Achtung: f\u00fcr dieses Beispiel wurde das Thema \"Diabook\" genutzt. Wenn du ein anderes Design benutzt, wirst du manche dieser Symbole gar nicht oder in anderer Form vorfinden. Die einzelnen Symbole Mit diesem Symbol kannst du zeigen, dass dir ein Beitrag gef\u00e4llt. Falls du diese Eingabe zur\u00fccknehmen willst, klicke einfach ein zweites Mal auf das Symbol. Mit diesem Symbol kannst du zeigen, dass dir ein Beitrag nicht gef\u00e4llt. Falls du diese Eingabe zur\u00fccknehmen willst, klicke einfach ein zweites Mal auf das Symbol. Mit diesem Symbol kannst du einen Beitrag weiter verteilen. Einfach anklicken und sofort erscheint der Beitrag in deinem Beitragseditor. Am Ende des eingef\u00fcgten Beitrags erscheint ein Link zum Originalbeitrag. Mit diesem Symbol kannst du einen Beitrag f\u00fcr dich markieren. Markierte Beitr\u00e4ge erscheinen in deiner Netzwerk-Seite unter \"Markierte\". Wenn du die Markierung entfernen willst, klicke einfach ein zweites Mal auf das Symbol. Mit diesem Symbol kannst du einen tag zum Beitrag hinzuf\u00fcgen und diesen so einem bestimmten Schlagwort zuzuordnen. Anschlie\u00dfend kannst du auf diesen tag klicken und alle Beitr\u00e4ge mit diesem tag ansehen. ACHTUNG: tags k\u00f6nnen nicht mehr entfernt werden. Mit diesem Symbol ist es m\u00f6glich, die Beitr\u00e4ge in bestimmte Gruppen einzuordnen. Dies dient dazu, gew\u00e4hlte Beitr\u00e4ge nach eigenen Vorstellungen zu sortieren und wiederzufinden. W\u00e4hle eine vorhandene Gruppe oder gib einen neuen Namen ein. Die erstellten Gruppen findest du unter \"Gespeicherte Ordner\" in der Netzwerk-Ansicht. Mit diesem Symbol l\u00f6schst du deinen eigenen Beitrag bzw. entfernst einen Beitrag einer anderen Person aus deinem Stream. Mit diesem Symbol kannst du mehrere Beitr\u00e4ge ausw\u00e4hlen und gesammelt l\u00f6schen. Hierf\u00fcr gehst du nach dem Markieren aller gew\u00fcnschten Beitr\u00e4ge auf \"L\u00f6sche die markierten Beitr\u00e4ge\" am Ende der Seite mit allen Beitr\u00e4gen. Im Folgenden findest du Symbole weiterer Themen # Darkbubble Darkzero (inklusive weiterer \"zero\"-Themen, slackr, comix, easterbunny, facepark) Dispy (inklusive smoothly, testbubble)","title":"Kommentare"},{"location":"de/user/text-comment/#beitrage-kommentieren-einordnen-und-loschen","text":"Hier findest du eine \u00dcbersicht \u00fcber die verschiedenen M\u00f6glichkeiten, bestehende Beitr\u00e4ge einzuordnen und zu kommentieren. Achtung: f\u00fcr dieses Beispiel wurde das Thema \"Diabook\" genutzt. Wenn du ein anderes Design benutzt, wirst du manche dieser Symbole gar nicht oder in anderer Form vorfinden. Die einzelnen Symbole Mit diesem Symbol kannst du zeigen, dass dir ein Beitrag gef\u00e4llt. Falls du diese Eingabe zur\u00fccknehmen willst, klicke einfach ein zweites Mal auf das Symbol. Mit diesem Symbol kannst du zeigen, dass dir ein Beitrag nicht gef\u00e4llt. Falls du diese Eingabe zur\u00fccknehmen willst, klicke einfach ein zweites Mal auf das Symbol. Mit diesem Symbol kannst du einen Beitrag weiter verteilen. Einfach anklicken und sofort erscheint der Beitrag in deinem Beitragseditor. Am Ende des eingef\u00fcgten Beitrags erscheint ein Link zum Originalbeitrag. Mit diesem Symbol kannst du einen Beitrag f\u00fcr dich markieren. Markierte Beitr\u00e4ge erscheinen in deiner Netzwerk-Seite unter \"Markierte\". Wenn du die Markierung entfernen willst, klicke einfach ein zweites Mal auf das Symbol. Mit diesem Symbol kannst du einen tag zum Beitrag hinzuf\u00fcgen und diesen so einem bestimmten Schlagwort zuzuordnen. Anschlie\u00dfend kannst du auf diesen tag klicken und alle Beitr\u00e4ge mit diesem tag ansehen. ACHTUNG: tags k\u00f6nnen nicht mehr entfernt werden. Mit diesem Symbol ist es m\u00f6glich, die Beitr\u00e4ge in bestimmte Gruppen einzuordnen. Dies dient dazu, gew\u00e4hlte Beitr\u00e4ge nach eigenen Vorstellungen zu sortieren und wiederzufinden. W\u00e4hle eine vorhandene Gruppe oder gib einen neuen Namen ein. Die erstellten Gruppen findest du unter \"Gespeicherte Ordner\" in der Netzwerk-Ansicht. Mit diesem Symbol l\u00f6schst du deinen eigenen Beitrag bzw. entfernst einen Beitrag einer anderen Person aus deinem Stream. Mit diesem Symbol kannst du mehrere Beitr\u00e4ge ausw\u00e4hlen und gesammelt l\u00f6schen. Hierf\u00fcr gehst du nach dem Markieren aller gew\u00fcnschten Beitr\u00e4ge auf \"L\u00f6sche die markierten Beitr\u00e4ge\" am Ende der Seite mit allen Beitr\u00e4gen.","title":"Beitr\u00e4ge kommentieren, einordnen und l\u00f6schen"},{"location":"de/user/text-comment/#im-folgenden-findest-du-symbole-weiterer-themen","text":"Darkbubble Darkzero (inklusive weiterer \"zero\"-Themen, slackr, comix, easterbunny, facepark) Dispy (inklusive smoothly, testbubble)","title":"Im Folgenden findest du Symbole weiterer Themen"},{"location":"de/user/text-editor/","tags":["user"],"text":"Beitr\u00e4ge erstellen # Hier findest du eine \u00dcbersicht \u00fcber die verschiedenen M\u00f6glichkeiten, deinen Beitrag zu bearbeiten. Achtung: f\u00fcr dieses Beispiel wurde das Thema \"Diabook\" genutzt. Wenn du ein anderes Design benutzt, wirst du manche dieser Symbole gar nicht oder in anderer Form vorfinden. Die einzelnen Symbole # Wenn du auf dieses Symbol klickst, dann kannst du ein Bild von deinem Computer hinzuf\u00fcgen. Wenn du eine Internetadresse (URL) eingeben willst, dann kannst du das \"Baum\"-Symbol im oberen Teil des Editors nutzen. Wenn du ein Bild ausgew\u00e4hlt hast, dann erscheint eine Miniaturdarstellung des Bildes im Editor.* Wenn du dieses Symbol anklickst, dann kannst du weitere Dateien von deinem Computer einf\u00fcgen. Eine Vorschau des Dateiinhalts erfolgt nicht.* Wenn du die Kette anklickst, dann kannst du eine Internetadresse (URL) einf\u00fcgen. Im Editor erscheint automatisch eine kurze Information zum eingef\u00fcgten Link.* Mit dieser Funktion kannst du die Internetadresse (URL) einer Videodatei einf\u00fcgen. Das Video erscheint dann mit einem Player in deinem Beitrag. Da Friendica zur Einbindung HTML5 verwendet, werden je nach Browser verschiedene Videoformate unterst\u00fctzt (z.B. WebM oder MP4). Au\u00dferdem kannst du hier die URLs von Videos auf Youtube, Vimeo und manchen anderen Videohostern eingeben. Die Videos werden dann mit Vorschaubild angezeigt, nach einem Klick \u00f6ffnet sich ein eingebetteter Player.* Mit dieser Funktion kannst du die Internetadresse (URL) einer Sound-Datei einf\u00fcgen. Da Friendica zur Einbindung HTML5 verwendet, werden je nach Browser und Betriebssystem MP3, Ogg oder AAC unterst\u00fctzt. Au\u00dferdem kannst du hier auch URLs von manchen Audiohostern wie Soundcloud eingeben, um eine dort gespeicherte Audiodatei mit Player in deinem Beitrag anzuzeigen.* Wenn du dieses Symbol w\u00e4hlst, dann kannst du deinen Standort festlegen. Hier reicht schon eine Angabe wie \"Berlin\" oder \"10775\". Dieser Eintrag f\u00fchrt anschlie\u00dfend zu einer Suchanfrage bei Google Maps. wie du Dateien hochladen kannst, erf\u00e4hrst du hier Im Folgenden findest du Symbole weiterer Themen # Cleanzero (inkl. weiterer \"zero\"-Themen, comix, easterbunny, facepark, slackr Darkbubble (inkl. smoothly, testbubble) Frio Vier (inkl. dispy)","title":"Beitr\u00e4ge erstellen"},{"location":"de/user/text-editor/#beitrage-erstellen","text":"Hier findest du eine \u00dcbersicht \u00fcber die verschiedenen M\u00f6glichkeiten, deinen Beitrag zu bearbeiten. Achtung: f\u00fcr dieses Beispiel wurde das Thema \"Diabook\" genutzt. Wenn du ein anderes Design benutzt, wirst du manche dieser Symbole gar nicht oder in anderer Form vorfinden.","title":"Beitr\u00e4ge erstellen"},{"location":"de/user/text-editor/#die-einzelnen-symbole","text":"Wenn du auf dieses Symbol klickst, dann kannst du ein Bild von deinem Computer hinzuf\u00fcgen. Wenn du eine Internetadresse (URL) eingeben willst, dann kannst du das \"Baum\"-Symbol im oberen Teil des Editors nutzen. Wenn du ein Bild ausgew\u00e4hlt hast, dann erscheint eine Miniaturdarstellung des Bildes im Editor.* Wenn du dieses Symbol anklickst, dann kannst du weitere Dateien von deinem Computer einf\u00fcgen. Eine Vorschau des Dateiinhalts erfolgt nicht.* Wenn du die Kette anklickst, dann kannst du eine Internetadresse (URL) einf\u00fcgen. Im Editor erscheint automatisch eine kurze Information zum eingef\u00fcgten Link.* Mit dieser Funktion kannst du die Internetadresse (URL) einer Videodatei einf\u00fcgen. Das Video erscheint dann mit einem Player in deinem Beitrag. Da Friendica zur Einbindung HTML5 verwendet, werden je nach Browser verschiedene Videoformate unterst\u00fctzt (z.B. WebM oder MP4). Au\u00dferdem kannst du hier die URLs von Videos auf Youtube, Vimeo und manchen anderen Videohostern eingeben. Die Videos werden dann mit Vorschaubild angezeigt, nach einem Klick \u00f6ffnet sich ein eingebetteter Player.* Mit dieser Funktion kannst du die Internetadresse (URL) einer Sound-Datei einf\u00fcgen. Da Friendica zur Einbindung HTML5 verwendet, werden je nach Browser und Betriebssystem MP3, Ogg oder AAC unterst\u00fctzt. Au\u00dferdem kannst du hier auch URLs von manchen Audiohostern wie Soundcloud eingeben, um eine dort gespeicherte Audiodatei mit Player in deinem Beitrag anzuzeigen.* Wenn du dieses Symbol w\u00e4hlst, dann kannst du deinen Standort festlegen. Hier reicht schon eine Angabe wie \"Berlin\" oder \"10775\". Dieser Eintrag f\u00fchrt anschlie\u00dfend zu einer Suchanfrage bei Google Maps. wie du Dateien hochladen kannst, erf\u00e4hrst du hier","title":"Die einzelnen Symbole"},{"location":"de/user/text-editor/#im-folgenden-findest-du-symbole-weiterer-themen","text":"Cleanzero (inkl. weiterer \"zero\"-Themen, comix, easterbunny, facepark, slackr Darkbubble (inkl. smoothly, testbubble) Frio Vier (inkl. dispy)","title":"Im Folgenden findest du Symbole weiterer Themen"},{"location":"de/user/quick-start/finally/","tags":["user","quick-start"],"text":"... und zuletzt # Und damit sind wir auch schon am Ende der Schnellstartanleitung. Hier sind noch einige weitere Dinge, die Dir den Start vereinfachen k\u00f6nnen. Gruppen # Friendica Support - Probleme? Dann ist das der Platz, um zu fragen! Dokumentation # Zu weiteren Netzwerken verbinden Zur Startseite der Hilfe","title":"Zuletzt"},{"location":"de/user/quick-start/finally/#und-zuletzt","text":"Und damit sind wir auch schon am Ende der Schnellstartanleitung. Hier sind noch einige weitere Dinge, die Dir den Start vereinfachen k\u00f6nnen.","title":"... und zuletzt"},{"location":"de/user/quick-start/finally/#gruppen","text":"Friendica Support - Probleme? Dann ist das der Platz, um zu fragen!","title":"Gruppen"},{"location":"de/user/quick-start/finally/#dokumentation","text":"Zu weiteren Netzwerken verbinden Zur Startseite der Hilfe","title":"Dokumentation"},{"location":"de/user/quick-start/groups-and-pages/","tags":["quick-start","user","gruppen","seiten"],"text":"Gruppen und Seiten # Hier siehst du das globale Verzeichnis. Wenn du dich mal verirrt hast, kannst du diesen Link klicken und wieder hierherkommen. Auf dieser Seite findest du eine Zusammenstellung von Gruppen, Foren und Promi-Seiten. Gruppen sind keine realen Personen. Sich mit diesen zu verbinden ist, als wenn man jemanden auf Facebook \"liked\" (\"gef\u00e4llt mir\") oder wenn man sich in einem Forum anmeldet. du musst nicht unsicher sein, ob du jemandem zu nahe trittst, wenn du dich so ohne weiteres mit einer Gruppe verbindest; es handelt sich eben nicht um reale Personen. Wenn du dich mit einer Gruppe verbindest, erscheinen alle Nachrichten der Gruppe in deinem \"Netzwerk\"-Tab. du kannst diese Beitr\u00e4ge kommentieren oder selbst in der Gruppe schreiben, ohne eines der Gruppenmitglieder pers\u00f6nlich hinzuzuf\u00fcgen. Das ist ein gro\u00dfartiger Weg, dynamisch neue Freunde zu gewinnen. du findest Personen deines Interesses, anstatt Fremde hinzuzuf\u00fcgen. Suche dir einfach eine Gruppe und f\u00fcge sie so hinzu, wie du auch normale Freunde hinzuf\u00fcgst. Es gibt eine Menge Gruppen. Solltest du beim St\u00f6bern durch die vielen Gruppen nicht wieder hierher zur\u00fcckfinden, so nutze einfach den Link oben auf dieser Seite. Wenn du einige Gruppen hinzugef\u00fcgt hast, gehe weiter zum n\u00e4chsten Schritt .","title":"Gruppen & Seiten"},{"location":"de/user/quick-start/groups-and-pages/#gruppen-und-seiten","text":"Hier siehst du das globale Verzeichnis. Wenn du dich mal verirrt hast, kannst du diesen Link klicken und wieder hierherkommen. Auf dieser Seite findest du eine Zusammenstellung von Gruppen, Foren und Promi-Seiten. Gruppen sind keine realen Personen. Sich mit diesen zu verbinden ist, als wenn man jemanden auf Facebook \"liked\" (\"gef\u00e4llt mir\") oder wenn man sich in einem Forum anmeldet. du musst nicht unsicher sein, ob du jemandem zu nahe trittst, wenn du dich so ohne weiteres mit einer Gruppe verbindest; es handelt sich eben nicht um reale Personen. Wenn du dich mit einer Gruppe verbindest, erscheinen alle Nachrichten der Gruppe in deinem \"Netzwerk\"-Tab. du kannst diese Beitr\u00e4ge kommentieren oder selbst in der Gruppe schreiben, ohne eines der Gruppenmitglieder pers\u00f6nlich hinzuzuf\u00fcgen. Das ist ein gro\u00dfartiger Weg, dynamisch neue Freunde zu gewinnen. du findest Personen deines Interesses, anstatt Fremde hinzuzuf\u00fcgen. Suche dir einfach eine Gruppe und f\u00fcge sie so hinzu, wie du auch normale Freunde hinzuf\u00fcgst. Es gibt eine Menge Gruppen. Solltest du beim St\u00f6bern durch die vielen Gruppen nicht wieder hierher zur\u00fcckfinden, so nutze einfach den Link oben auf dieser Seite. Wenn du einige Gruppen hinzugef\u00fcgt hast, gehe weiter zum n\u00e4chsten Schritt .","title":"Gruppen und Seiten"},{"location":"de/user/quick-start/guide/","tags":["user","quick-start","guide"],"text":"Erste Schritte... # Als Erstes: Gehe sicher, dass du eingeloggt bist. Wenn du noch nicht eingeloggt bist, kannst du das in dem Fenster unten machen. Sobald dies geschehen ist, schaust du auf die Netzwerkseite deines Profils. Klicke auf den Reiter \"Pinnwand\". Hier sieht es ein wenig wie auf (D)einer Facebook-Seite aus. du findest hier alle deine Statusmeldungen und Nachrichten deiner Freunde, die direkt auf deine \"Pinnwand\" (\"Wall\") geschrieben haben. Um deinen Status einzutragen, klicke einfach auf die Box oben, in der \"Teilen\" steht. Wenn du das machst, vergr\u00f6\u00dfert sich die Box, und du kannst nun deinen Text eintragen, mithilfe einiger Formatierungsoptionen wie fett, kursiv, unterstrichen formatieren und ebenfalls Bilder und Links hinzuf\u00fcgen. Unten findest du in diesem Feld weitere Kn\u00f6pfe, mit denen du Bilder und Dateien von deinem Computer hochladen, Webseiten mit einem Kurztext teilen und Video- und Audiodateien aus dem Internet einf\u00fcgen kannst. Au\u00dferdem kannst du hier eintragen, wo du gerade bist. Wenn du deinen Beitrag (\"Post\") geschrieben hast, kannst du auf das \"Schloss\"-Symbol klicken und festlegen, wer deinen Beitrag sehen kann. Wenn du dieses Symbol nicht anklickst, ist dein Beitrag \u00f6ffentlich, bzw. es werden deine Grundeinstellungen verwendet, wenn diese nicht \u00f6ffentlich sind. Ein \u00f6ffentlicher Beitrag ist sichtbar f\u00fcr Besucher deines Profils Besucher deiner \"Gemeinschafts\"-Seite Besucher der Profile deiner Kontakte Suchmaschinen Auch wenn du deinen Server so konfiguriert hast, dass der Zugriff von au\u00dferhalb des Friendica-Netzwerks theoretisch nicht m\u00f6glich ist, so ist dein Beitrag \u00fcber die Profile deiner Kontakte sichtbar, wenn deren Knoten solche Zugriffe zulassen. Probiere es doch einfach mal aus. Wenn du fertig bist, schauen wir uns den \"Netzwerk\"-Tab an.","title":"Start"},{"location":"de/user/quick-start/guide/#erste-schritte","text":"Als Erstes: Gehe sicher, dass du eingeloggt bist. Wenn du noch nicht eingeloggt bist, kannst du das in dem Fenster unten machen. Sobald dies geschehen ist, schaust du auf die Netzwerkseite deines Profils. Klicke auf den Reiter \"Pinnwand\". Hier sieht es ein wenig wie auf (D)einer Facebook-Seite aus. du findest hier alle deine Statusmeldungen und Nachrichten deiner Freunde, die direkt auf deine \"Pinnwand\" (\"Wall\") geschrieben haben. Um deinen Status einzutragen, klicke einfach auf die Box oben, in der \"Teilen\" steht. Wenn du das machst, vergr\u00f6\u00dfert sich die Box, und du kannst nun deinen Text eintragen, mithilfe einiger Formatierungsoptionen wie fett, kursiv, unterstrichen formatieren und ebenfalls Bilder und Links hinzuf\u00fcgen. Unten findest du in diesem Feld weitere Kn\u00f6pfe, mit denen du Bilder und Dateien von deinem Computer hochladen, Webseiten mit einem Kurztext teilen und Video- und Audiodateien aus dem Internet einf\u00fcgen kannst. Au\u00dferdem kannst du hier eintragen, wo du gerade bist. Wenn du deinen Beitrag (\"Post\") geschrieben hast, kannst du auf das \"Schloss\"-Symbol klicken und festlegen, wer deinen Beitrag sehen kann. Wenn du dieses Symbol nicht anklickst, ist dein Beitrag \u00f6ffentlich, bzw. es werden deine Grundeinstellungen verwendet, wenn diese nicht \u00f6ffentlich sind. Ein \u00f6ffentlicher Beitrag ist sichtbar f\u00fcr Besucher deines Profils Besucher deiner \"Gemeinschafts\"-Seite Besucher der Profile deiner Kontakte Suchmaschinen Auch wenn du deinen Server so konfiguriert hast, dass der Zugriff von au\u00dferhalb des Friendica-Netzwerks theoretisch nicht m\u00f6glich ist, so ist dein Beitrag \u00fcber die Profile deiner Kontakte sichtbar, wenn deren Knoten solche Zugriffe zulassen. Probiere es doch einfach mal aus. Wenn du fertig bist, schauen wir uns den \"Netzwerk\"-Tab an.","title":"Erste Schritte..."},{"location":"de/user/quick-start/making-new-friends/","tags":["user","quick-start","guide"],"text":"Neue Freunde finden # Hier siehst du die Kontaktvorschl\u00e4ge. Wenn du dich mal verirrt hast, kannst du diesen Link klicken und wieder hierherkommen. Diese Seite funktioniert in etwa wie die Seite f\u00fcr Kontaktvorschl\u00e4ge in Facebook. Jeder auf dieser Liste hat zugestimmt, als Kontaktvorschlag zu erscheinen. Das bedeutet, das sie Anfragen meist nicht ablehnen, da sie neue Leute kennenlernen wollen. Siehst du jemanden, der dir interessant erscheint? Klicke auf den \"Verbinden\"-Knopf beim Foto. Als N\u00e4chstes kommst du zur Seite \"Freundschafts-/Kontaktanfrage\". F\u00fclle das Formular wie vorgegeben aus und trage optional eine kleine Notiz ein. Nun musst du nur noch auf die Best\u00e4tigung warten. Beachte dabei, dass es sich um reale Personen handelt und es somit etwas dauern kann. Jetzt, nachdem du jemanden hinzugef\u00fcgt hast, wei\u00dft du vielleicht nicht mehr, wie du zur\u00fcckkommst. Klicke einfach auf den Link oben auf dieser Seite und du gelangst zur Seite mit den Kontaktvorschl\u00e4gen zur\u00fcck, um weitere Personen hinzuzuf\u00fcgen. du willst nicht einfach Personen hinzuf\u00fcgen, die du nicht kennst? Kein Problem - an dieser Stelle kommen wir zu den Gruppen und Seiten .","title":"Neue Freunde"},{"location":"de/user/quick-start/making-new-friends/#neue-freunde-finden","text":"Hier siehst du die Kontaktvorschl\u00e4ge. Wenn du dich mal verirrt hast, kannst du diesen Link klicken und wieder hierherkommen. Diese Seite funktioniert in etwa wie die Seite f\u00fcr Kontaktvorschl\u00e4ge in Facebook. Jeder auf dieser Liste hat zugestimmt, als Kontaktvorschlag zu erscheinen. Das bedeutet, das sie Anfragen meist nicht ablehnen, da sie neue Leute kennenlernen wollen. Siehst du jemanden, der dir interessant erscheint? Klicke auf den \"Verbinden\"-Knopf beim Foto. Als N\u00e4chstes kommst du zur Seite \"Freundschafts-/Kontaktanfrage\". F\u00fclle das Formular wie vorgegeben aus und trage optional eine kleine Notiz ein. Nun musst du nur noch auf die Best\u00e4tigung warten. Beachte dabei, dass es sich um reale Personen handelt und es somit etwas dauern kann. Jetzt, nachdem du jemanden hinzugef\u00fcgt hast, wei\u00dft du vielleicht nicht mehr, wie du zur\u00fcckkommst. Klicke einfach auf den Link oben auf dieser Seite und du gelangst zur Seite mit den Kontaktvorschl\u00e4gen zur\u00fcck, um weitere Personen hinzuzuf\u00fcgen. du willst nicht einfach Personen hinzuf\u00fcgen, die du nicht kennst? Kein Problem - an dieser Stelle kommen wir zu den Gruppen und Seiten .","title":"Neue Freunde finden"},{"location":"de/user/quick-start/network/","tags":["user","quick-start","guide"],"text":"deine \"Netzwerk\"-Seite # Dies ist dein \"Netzwerk\"-Tab. Wenn du dich mal verirrt hast, kannst du diesen Link klicken, um wieder hierherzukommen. Diese Seite ist ein wenig wie die News-Seite in Facebook oder der Stream in Diaspora. Hier findest du alle Beitr\u00e4ge deiner Kontakte, Gruppen und Feeds, die du eingetragen hast. Wenn du neu bist, siehst du hier noch nichts, falls du an deinem Status im letzten Schritt noch nichts ge\u00e4ndert haben solltest. Wenn du bereits ein paar Freunde gefunden hast, so findest du hier ihre Beitr\u00e4ge. du kannst ihre Beitr\u00e4ge von hier aus kommentieren, mitteilen, dass du den Beitrag magst oder ablehnst (Daumen hoch, Daumen runter) oder die Profile durch einen Klick auf deren Namen besuchen und dort auf deren \"Pinnwand\" (\"Wall\") Nachrichten schreiben. Nun wollen wir diese Seite mit Inhalt f\u00fcllen. Der erste Schritt ist es, Leute zu deinem Account hinzuzuf\u00fcgen .","title":"Netzwerk"},{"location":"de/user/quick-start/network/#deine-netzwerk-seite","text":"Dies ist dein \"Netzwerk\"-Tab. Wenn du dich mal verirrt hast, kannst du diesen Link klicken, um wieder hierherzukommen. Diese Seite ist ein wenig wie die News-Seite in Facebook oder der Stream in Diaspora. Hier findest du alle Beitr\u00e4ge deiner Kontakte, Gruppen und Feeds, die du eingetragen hast. Wenn du neu bist, siehst du hier noch nichts, falls du an deinem Status im letzten Schritt noch nichts ge\u00e4ndert haben solltest. Wenn du bereits ein paar Freunde gefunden hast, so findest du hier ihre Beitr\u00e4ge. du kannst ihre Beitr\u00e4ge von hier aus kommentieren, mitteilen, dass du den Beitrag magst oder ablehnst (Daumen hoch, Daumen runter) oder die Profile durch einen Klick auf deren Namen besuchen und dort auf deren \"Pinnwand\" (\"Wall\") Nachrichten schreiben. Nun wollen wir diese Seite mit Inhalt f\u00fcllen. Der erste Schritt ist es, Leute zu deinem Account hinzuzuf\u00fcgen .","title":"deine \"Netzwerk\"-Seite"},{"location":"de/developer/addon-storage-backend/","tags":["addon","developer"],"text":"Friendica Storage Backend Addon development # Storage backends can be added via addons. A storage backend is implemented as a class, and the plugin register the class to make it available to the system. The Storage Backend Class # The class must live in Friendica\\Addon\\youraddonname namespace, where youraddonname the folder name of your addon. There are two different interfaces you need to implement. ICanWriteToStorage # The class must implement Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage interface. All method in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; interface ICanWriteToStorage { public function get ( string $reference ); public function put ( string $data , string $reference = '' ); public function delete ( string $reference ); public function __toString (); public static function getName (); } get(string $reference) returns data pointed by $reference put(string $data, string $reference) saves data in $data to position $reference , or a new position if $reference is empty. delete(string $reference) delete data pointed by $reference ICanConfigureStorage # Each storage backend can have options the admin can set in admin page. To make the options possible, you need to implement the Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage interface. All methods in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; interface ICanConfigureStorage { public function getOptions (); public function saveOptions ( array $data ); } getOptions() returns an array with details about each option to build the interface. saveOptions(array $data) get $data from admin page, validate it and save it. The array returned by getOptions() is defined as: [ 'option1name' => [ ..info.. ], 'option2name' => [ ..info.. ], ... ] An empty array can be returned if backend doesn't have any options. The info array for each option is defined as: [ 'type', define the field used in form, and the type of data. one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea' 'label', Translatable label of the field. This label will be shown in admin page value, Current value of the option 'help text', Translatable description for the field. Will be shown in admin page extra data Optional. Depends on which 'type' this option is: 'select': array [ value => label ] of choices 'intcheckbox': value of input element 'select_raw': prebuild html string of <option > tags Each label should be translatable ]; See doxygen documentation of IWritableStorage interface for details about each method. Register a storage backend class # Each backend must be registered in the system when the plugin is installed, to be aviable. DI::facStorage()->register(string $class) is used to register the backend class. When the plugin is uninstalled, registered backends must be unregistered using DI::facStorage()->unregister(string $class) . You have to register a new hook in your addon, listening on storage_instance(App $a, array $data) . In case $data['name'] is your storage class name, you have to instance a new instance of your Friendica\\Core\\Storage\\Capability\\ICanReadFromStorage class. Set the instance of your class as $data['storage'] to pass it back to the backend. This is necessary because it isn't always clear, if you need further construction arguments. Adding tests # Currently testing is limited to core Friendica only, this shows theoretically how tests should work in the future Each new Storage class should be added to the test-environment at Storage Tests . Add a new test class which's naming convention is StorageClassTest , which extend the StorageTest in the same directory. Override the two necessary instances: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; abstract class StorageTest { // returns an instance of your newly created storage class abstract protected function getInstance(); // Assertion for the option array you return for your new StorageClass abstract protected function assertOption(ICanWriteToStorage $storage); } Exception handling # There are two intended types of exceptions for storages ReferenceStorageExecption # This storage exception should be used in case the caller tries to use an invalid references. This could happen in case the caller tries to delete or update an unknown reference. The implementation of the storage backend must not ignore invalid references. Avoid throwing the common StorageExecption instead of the ReferenceStorageException at this particular situation! StorageException # This is the common exception in case unexpected errors happen using the storage backend. If there's a predecessor to this exception (e.g. you caught an exception and are throwing this execption), you should add the predecessor for transparency reasons. Example: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; class ExampleStorage implements ICanWriteToStorage { public function get(string $reference) : string { try { throw new Exception('a real bad exception'); } catch (Exception $exception) { throw new \\Friendica\\Core\\Storage\\Exception\\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception); } } } Example # Here is a hypothetical addon which register a useless storage backend. Let's call it samplestorage . This backend will discard all data we try to save and will return always the same image when we ask for some data. The image returned can be set by the administrator in admin page. First, the backend class. The file will be addon/samplestorage/SampleStorageBackend.php : <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackend implements ICanWriteToStorage { const NAME = 'Sample Storage' ; /** @var string */ private $filename ; /** * SampleStorageBackend constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( string $filename ) { $this -> filename = $filename ; } public function get ( string $reference ) { // we return always the same image data. Which file we load is defined by // a config key return file_get_contents ( $this -> filename ); } public function put ( string $data , string $reference = '' ) { if ( $reference === '' ) { $reference = 'sample' ; } // we don't save $data ! return $reference ; } public function delete ( string $reference ) { // we pretend to delete the data return true ; } public function __toString () { return self :: NAME ; } public static function getName () { return self :: NAME ; } } <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackendConfig implements ICanConfigureStorage { /** @var \\Friendica\\Core\\Config\\Capability\\IManageConfigValues */ private $config ; /** @var L10n */ private $l10n ; /** * SampleStorageBackendConfig constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( IManageConfigValues $config , L10n $l10n ) { $this -> config = $config ; $this -> l10n = $l10n ; } public function getFileName () : string { return $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); } public function getOptions () { $filename = $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); return [ 'filename' => [ 'input' , // will use a simple text input $this -> l10n -> t ( 'The file to return' ), // the label $filename , // the current value $this -> l10n -> t ( 'Enter the path to a file' ), // the help text // no extra data for 'input' type.. ], ]; } public function saveOptions ( array $data ) { // the keys in $data are the same keys we defined in getOptions() $newfilename = trim ( $data [ 'filename' ]); // this function should always validate the data. // in this example we check if file exists if ( ! file_exists ( $newfilename )) { // in case of error we return an array with // ['optionname' => 'error message'] return [ 'filename' => 'The file doesn\\'t exists' ]; } $this -> config -> set ( 'storage' , 'samplestorage' , $newfilename ); // no errors, return empty array return []; } } Now the plugin main file. Here we register and unregister the backend class. The file is addon/samplestorage/samplestorage.php <?php /** * Name: Sample Storage Addon * Description: A sample addon which implements an unusefull storage backend * Version: 1.0.0 * Author: Alice <https://alice.social/~alice> */ use Friendica\\Addon\\samplestorage\\SampleStorageBackend ; use Friendica\\Addon\\samplestorage\\SampleStorageBackendConfig ; use Friendica\\DI ; function samplestorage_install () { Hook :: register ( 'storage_instance' , __FILE__ , 'samplestorage_storage_instance' ); Hook :: register ( 'storage_config' , __FILE__ , 'samplestorage_storage_config' ); DI :: storageManager () -> register ( SampleStorageBackend :: class ); } function samplestorage_storage_uninstall () { DI :: storageManager () -> unregister ( SampleStorageBackend :: class ); } function samplestorage_storage_instance ( App $a , array & $data ) { $config = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); $data [ 'storage' ] = new SampleStorageBackendConfig ( $config -> getFileName ()); } function samplestorage_storage_config ( App $a , array & $data ) { $data [ 'storage_config' ] = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); } **Theoretically - until tests for Addons are enabled too - create a test class with the name addon/tests/SampleStorageTest.php : use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; use Friendica\\Test\\src\\Core\\Storage\\StorageTest; class SampleStorageTest extends StorageTest { // returns an instance of your newly created storage class protected function getInstance() { // create a new SampleStorageBackend instance with all it's dependencies // Have a look at DatabaseStorageTest or FilesystemStorageTest for further insights return new SampleStorageBackend(); } // Assertion for the option array you return for your new StorageClass protected function assertOption(ICanWriteToStorage $storage) { $this->assertEquals([ 'filename' => [ 'input', 'The file to return', 'sample.jpg', 'Enter the path to a file' ], ], $storage->getOptions()); } }","title":"Addon Storage Backend"},{"location":"de/developer/addon-storage-backend/#friendica-storage-backend-addon-development","text":"Storage backends can be added via addons. A storage backend is implemented as a class, and the plugin register the class to make it available to the system.","title":"Friendica Storage Backend Addon development"},{"location":"de/developer/addon-storage-backend/#the-storage-backend-class","text":"The class must live in Friendica\\Addon\\youraddonname namespace, where youraddonname the folder name of your addon. There are two different interfaces you need to implement.","title":"The Storage Backend Class"},{"location":"de/developer/addon-storage-backend/#icanwritetostorage","text":"The class must implement Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage interface. All method in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; interface ICanWriteToStorage { public function get ( string $reference ); public function put ( string $data , string $reference = '' ); public function delete ( string $reference ); public function __toString (); public static function getName (); } get(string $reference) returns data pointed by $reference put(string $data, string $reference) saves data in $data to position $reference , or a new position if $reference is empty. delete(string $reference) delete data pointed by $reference","title":"ICanWriteToStorage"},{"location":"de/developer/addon-storage-backend/#icanconfigurestorage","text":"Each storage backend can have options the admin can set in admin page. To make the options possible, you need to implement the Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage interface. All methods in the interface must be implemented: <?php namespace Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; interface ICanConfigureStorage { public function getOptions (); public function saveOptions ( array $data ); } getOptions() returns an array with details about each option to build the interface. saveOptions(array $data) get $data from admin page, validate it and save it. The array returned by getOptions() is defined as: [ 'option1name' => [ ..info.. ], 'option2name' => [ ..info.. ], ... ] An empty array can be returned if backend doesn't have any options. The info array for each option is defined as: [ 'type', define the field used in form, and the type of data. one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea' 'label', Translatable label of the field. This label will be shown in admin page value, Current value of the option 'help text', Translatable description for the field. Will be shown in admin page extra data Optional. Depends on which 'type' this option is: 'select': array [ value => label ] of choices 'intcheckbox': value of input element 'select_raw': prebuild html string of <option > tags Each label should be translatable ]; See doxygen documentation of IWritableStorage interface for details about each method.","title":"ICanConfigureStorage"},{"location":"de/developer/addon-storage-backend/#register-a-storage-backend-class","text":"Each backend must be registered in the system when the plugin is installed, to be aviable. DI::facStorage()->register(string $class) is used to register the backend class. When the plugin is uninstalled, registered backends must be unregistered using DI::facStorage()->unregister(string $class) . You have to register a new hook in your addon, listening on storage_instance(App $a, array $data) . In case $data['name'] is your storage class name, you have to instance a new instance of your Friendica\\Core\\Storage\\Capability\\ICanReadFromStorage class. Set the instance of your class as $data['storage'] to pass it back to the backend. This is necessary because it isn't always clear, if you need further construction arguments.","title":"Register a storage backend class"},{"location":"de/developer/addon-storage-backend/#adding-tests","text":"Currently testing is limited to core Friendica only, this shows theoretically how tests should work in the future Each new Storage class should be added to the test-environment at Storage Tests . Add a new test class which's naming convention is StorageClassTest , which extend the StorageTest in the same directory. Override the two necessary instances: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; abstract class StorageTest { // returns an instance of your newly created storage class abstract protected function getInstance(); // Assertion for the option array you return for your new StorageClass abstract protected function assertOption(ICanWriteToStorage $storage); }","title":"Adding tests"},{"location":"de/developer/addon-storage-backend/#exception-handling","text":"There are two intended types of exceptions for storages","title":"Exception handling"},{"location":"de/developer/addon-storage-backend/#referencestorageexecption","text":"This storage exception should be used in case the caller tries to use an invalid references. This could happen in case the caller tries to delete or update an unknown reference. The implementation of the storage backend must not ignore invalid references. Avoid throwing the common StorageExecption instead of the ReferenceStorageException at this particular situation!","title":"ReferenceStorageExecption"},{"location":"de/developer/addon-storage-backend/#storageexception","text":"This is the common exception in case unexpected errors happen using the storage backend. If there's a predecessor to this exception (e.g. you caught an exception and are throwing this execption), you should add the predecessor for transparency reasons. Example: use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; class ExampleStorage implements ICanWriteToStorage { public function get(string $reference) : string { try { throw new Exception('a real bad exception'); } catch (Exception $exception) { throw new \\Friendica\\Core\\Storage\\Exception\\StorageException(sprintf('The Example Storage throws an exception for reference %s', $reference), 500, $exception); } } }","title":"StorageException"},{"location":"de/developer/addon-storage-backend/#example","text":"Here is a hypothetical addon which register a useless storage backend. Let's call it samplestorage . This backend will discard all data we try to save and will return always the same image when we ask for some data. The image returned can be set by the administrator in admin page. First, the backend class. The file will be addon/samplestorage/SampleStorageBackend.php : <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackend implements ICanWriteToStorage { const NAME = 'Sample Storage' ; /** @var string */ private $filename ; /** * SampleStorageBackend constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( string $filename ) { $this -> filename = $filename ; } public function get ( string $reference ) { // we return always the same image data. Which file we load is defined by // a config key return file_get_contents ( $this -> filename ); } public function put ( string $data , string $reference = '' ) { if ( $reference === '' ) { $reference = 'sample' ; } // we don't save $data ! return $reference ; } public function delete ( string $reference ) { // we pretend to delete the data return true ; } public function __toString () { return self :: NAME ; } public static function getName () { return self :: NAME ; } } <?php namespace Friendica\\Addon\\samplestorage ; use Friendica\\Core\\Storage\\Capability\\ICanConfigureStorage ; use Friendica\\Core\\Config\\Capability\\IManageConfigValues ; use Friendica\\Core\\L10n ; class SampleStorageBackendConfig implements ICanConfigureStorage { /** @var \\Friendica\\Core\\Config\\Capability\\IManageConfigValues */ private $config ; /** @var L10n */ private $l10n ; /** * SampleStorageBackendConfig constructor. * * You can add here every dynamic class as dependency you like and add them to a private field * Friendica automatically creates these classes and passes them as argument to the constructor */ public function __construct ( IManageConfigValues $config , L10n $l10n ) { $this -> config = $config ; $this -> l10n = $l10n ; } public function getFileName () : string { return $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); } public function getOptions () { $filename = $this -> config -> get ( 'storage' , 'samplestorage' , 'sample.jpg' ); return [ 'filename' => [ 'input' , // will use a simple text input $this -> l10n -> t ( 'The file to return' ), // the label $filename , // the current value $this -> l10n -> t ( 'Enter the path to a file' ), // the help text // no extra data for 'input' type.. ], ]; } public function saveOptions ( array $data ) { // the keys in $data are the same keys we defined in getOptions() $newfilename = trim ( $data [ 'filename' ]); // this function should always validate the data. // in this example we check if file exists if ( ! file_exists ( $newfilename )) { // in case of error we return an array with // ['optionname' => 'error message'] return [ 'filename' => 'The file doesn\\'t exists' ]; } $this -> config -> set ( 'storage' , 'samplestorage' , $newfilename ); // no errors, return empty array return []; } } Now the plugin main file. Here we register and unregister the backend class. The file is addon/samplestorage/samplestorage.php <?php /** * Name: Sample Storage Addon * Description: A sample addon which implements an unusefull storage backend * Version: 1.0.0 * Author: Alice <https://alice.social/~alice> */ use Friendica\\Addon\\samplestorage\\SampleStorageBackend ; use Friendica\\Addon\\samplestorage\\SampleStorageBackendConfig ; use Friendica\\DI ; function samplestorage_install () { Hook :: register ( 'storage_instance' , __FILE__ , 'samplestorage_storage_instance' ); Hook :: register ( 'storage_config' , __FILE__ , 'samplestorage_storage_config' ); DI :: storageManager () -> register ( SampleStorageBackend :: class ); } function samplestorage_storage_uninstall () { DI :: storageManager () -> unregister ( SampleStorageBackend :: class ); } function samplestorage_storage_instance ( App $a , array & $data ) { $config = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); $data [ 'storage' ] = new SampleStorageBackendConfig ( $config -> getFileName ()); } function samplestorage_storage_config ( App $a , array & $data ) { $data [ 'storage_config' ] = new SampleStorageBackendConfig ( DI :: l10n (), DI :: config ()); } **Theoretically - until tests for Addons are enabled too - create a test class with the name addon/tests/SampleStorageTest.php : use Friendica\\Core\\Storage\\Capability\\ICanWriteToStorage; use Friendica\\Test\\src\\Core\\Storage\\StorageTest; class SampleStorageTest extends StorageTest { // returns an instance of your newly created storage class protected function getInstance() { // create a new SampleStorageBackend instance with all it's dependencies // Have a look at DatabaseStorageTest or FilesystemStorageTest for further insights return new SampleStorageBackend(); } // Assertion for the option array you return for your new StorageClass protected function assertOption(ICanWriteToStorage $storage) { $this->assertEquals([ 'filename' => [ 'input', 'The file to return', 'sample.jpg', 'Enter the path to a file' ], ], $storage->getOptions()); } }","title":"Example"},{"location":"de/developer/autoloader/","tags":["developer","composer"],"text":"Autoloader with Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Using Composer A quick introduction to class auto-loading # The autoloader dynamically includes the file defining a class when it is first referenced, either by instantiating an object or simply making sure that it is available, without the need to explicitly use \"require_once\". Once it is set up you don't have to directly use it, you can directly use any class that is covered by the autoloader (currently vendor and src ) Under the hood, Composer registers a callback with spl_autoload_register() that receives a class name as an argument and includes the corresponding class definition file. For more info about PHP autoloading, please refer to the official PHP documentation . Example # Let's say you have a PHP file in src/ that define a very useful class: // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager { public function getAll () { ... } public function getByID ( $id ) { ... } } The class ItemsManager has been declared in the Friendica namespace. Namespaces are useful to keep classes separated and avoid names conflicts (could be that a library you want to use also defines a class named ItemsManager , but as long as it is in another namespace, you don't have any problem) Let's say now that you need to load some items in a view, maybe in a fictional mod/network.php . In order for the Composer autoloader to work, it must first be included. In Friendica this is already done at the top of boot.php , with require_once('vendor/autoload.php'); . The code will be something like: // mod/network.php <?php use Friendica\\App ; function network_content ( App $a ) { $itemsmanager = new \\Friendica\\ItemsManager (); $items = $itemsmanager -> getAll (); // pass $items to template // return result } That's a quite simple example, but look: no require() ! If you need to use a class, you can simply use it, and you don't need to do anything else. Going further: now we have a bunch of *Manager classes that cause some code duplication. Let's define a BaseManager class, where we move all common code between all managers: // src/BaseManager.php <?php namespace Friendica ; class BaseManager { public function thatFunctionEveryManagerUses () { ... } } and then let's change the ItemsManager class to use this code // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager extends BaseManager { public function getAll () { ... } public function getByID ( $id ) { ... } } Even though we didn't explicitly include the src/BaseManager.php file, the autoloader will when this class is first defined, because it is referenced as a parent class. It works with the \"BaseManager\" example here, and it works when we need to call static methods: // src/Dfrn.php <?php namespace Friendica ; class Dfrn { public static function mail ( $item , $owner ) { ... } } // mod/mail.php <?php mail_post ( $a ){ ... Friendica\\Protocol\\DFRN :: mail ( $item , $owner ); ... } If your code is in same namespace as the class you need, you don't need to prepend it: // include/delivery.php <?php namespace Friendica ; use Friendica\\Protocol\\DFRN ; // this is the same content of current include/delivery.php, // but has been declared to be in \"Friendica\" namespace [ ... ] switch ( $contact [ 'network' ]) { case NETWORK_DFRN : if ( $mail ) { $item [ 'body' ] = ... $atom = DFRN :: mail ( $item , $owner ); } elseif ( $fsuggest ) { $atom = DFRN :: fsuggest ( $item , $owner ); q ( \"DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1\" , intval ( $item [ 'id' ])); } elseif ( $relocate ) $atom = DFRN :: relocate ( $owner , $uid ); [ ... ] This is the current code of include/delivery.php , and since the code is declared to be in the \"Friendica\" namespace, you don't need to write it when you need to use the \"Dfrn\" class. But if you want to use classes from another library, you need to use the full namespace, e.g. // src/Diaspora.php <?php namespace Friendica ; class Diaspora { public function md2bbcode () { $html = \\Michelf\\MarkdownExtra :: defaultTransform ( $text ); } } if you use that class in many places of the code, and you don't want to write the full path to the class every time, you can use the \"use\" PHP keyword // src/Diaspora.php <?php namespace Friendica ; use \\Michelf\\MarkdownExtra ; class Diaspora { public function md2bbcode () { $html = MarkdownExtra :: defaultTransform ( $text ); } } Note that namespaces are like paths in filesystem, separated by \"\\\", with the first \"\\\" being the global scope. You can go deeper if you want to, like: // src/Network/Dfrn.php <?php namespace Friendica\\Network ; class Dfrn { } Please note that the location of the file defining the class must be placed in the appropriate sub-folders of src if the namespace isn't plain Friendica . or // src/Dba/Mysql <?php namespace Friendica\\Dba ; class Mysql { } So you can think of namespaces as folders in a Unix file system, with global scope as the root (\"\\\"). Related # Using Composer How To Move Classes to src","title":"Autoloader"},{"location":"de/developer/autoloader/#autoloader-with-composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Using Composer","title":"Autoloader with Composer"},{"location":"de/developer/autoloader/#a-quick-introduction-to-class-auto-loading","text":"The autoloader dynamically includes the file defining a class when it is first referenced, either by instantiating an object or simply making sure that it is available, without the need to explicitly use \"require_once\". Once it is set up you don't have to directly use it, you can directly use any class that is covered by the autoloader (currently vendor and src ) Under the hood, Composer registers a callback with spl_autoload_register() that receives a class name as an argument and includes the corresponding class definition file. For more info about PHP autoloading, please refer to the official PHP documentation .","title":"A quick introduction to class auto-loading"},{"location":"de/developer/autoloader/#example","text":"Let's say you have a PHP file in src/ that define a very useful class: // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager { public function getAll () { ... } public function getByID ( $id ) { ... } } The class ItemsManager has been declared in the Friendica namespace. Namespaces are useful to keep classes separated and avoid names conflicts (could be that a library you want to use also defines a class named ItemsManager , but as long as it is in another namespace, you don't have any problem) Let's say now that you need to load some items in a view, maybe in a fictional mod/network.php . In order for the Composer autoloader to work, it must first be included. In Friendica this is already done at the top of boot.php , with require_once('vendor/autoload.php'); . The code will be something like: // mod/network.php <?php use Friendica\\App ; function network_content ( App $a ) { $itemsmanager = new \\Friendica\\ItemsManager (); $items = $itemsmanager -> getAll (); // pass $items to template // return result } That's a quite simple example, but look: no require() ! If you need to use a class, you can simply use it, and you don't need to do anything else. Going further: now we have a bunch of *Manager classes that cause some code duplication. Let's define a BaseManager class, where we move all common code between all managers: // src/BaseManager.php <?php namespace Friendica ; class BaseManager { public function thatFunctionEveryManagerUses () { ... } } and then let's change the ItemsManager class to use this code // src/ItemsManager.php <?php namespace Friendica ; class ItemsManager extends BaseManager { public function getAll () { ... } public function getByID ( $id ) { ... } } Even though we didn't explicitly include the src/BaseManager.php file, the autoloader will when this class is first defined, because it is referenced as a parent class. It works with the \"BaseManager\" example here, and it works when we need to call static methods: // src/Dfrn.php <?php namespace Friendica ; class Dfrn { public static function mail ( $item , $owner ) { ... } } // mod/mail.php <?php mail_post ( $a ){ ... Friendica\\Protocol\\DFRN :: mail ( $item , $owner ); ... } If your code is in same namespace as the class you need, you don't need to prepend it: // include/delivery.php <?php namespace Friendica ; use Friendica\\Protocol\\DFRN ; // this is the same content of current include/delivery.php, // but has been declared to be in \"Friendica\" namespace [ ... ] switch ( $contact [ 'network' ]) { case NETWORK_DFRN : if ( $mail ) { $item [ 'body' ] = ... $atom = DFRN :: mail ( $item , $owner ); } elseif ( $fsuggest ) { $atom = DFRN :: fsuggest ( $item , $owner ); q ( \"DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1\" , intval ( $item [ 'id' ])); } elseif ( $relocate ) $atom = DFRN :: relocate ( $owner , $uid ); [ ... ] This is the current code of include/delivery.php , and since the code is declared to be in the \"Friendica\" namespace, you don't need to write it when you need to use the \"Dfrn\" class. But if you want to use classes from another library, you need to use the full namespace, e.g. // src/Diaspora.php <?php namespace Friendica ; class Diaspora { public function md2bbcode () { $html = \\Michelf\\MarkdownExtra :: defaultTransform ( $text ); } } if you use that class in many places of the code, and you don't want to write the full path to the class every time, you can use the \"use\" PHP keyword // src/Diaspora.php <?php namespace Friendica ; use \\Michelf\\MarkdownExtra ; class Diaspora { public function md2bbcode () { $html = MarkdownExtra :: defaultTransform ( $text ); } } Note that namespaces are like paths in filesystem, separated by \"\\\", with the first \"\\\" being the global scope. You can go deeper if you want to, like: // src/Network/Dfrn.php <?php namespace Friendica\\Network ; class Dfrn { } Please note that the location of the file defining the class must be placed in the appropriate sub-folders of src if the namespace isn't plain Friendica . or // src/Dba/Mysql <?php namespace Friendica\\Dba ; class Mysql { } So you can think of namespaces as folders in a Unix file system, with global scope as the root (\"\\\").","title":"Example"},{"location":"de/developer/autoloader/#related","text":"Using Composer How To Move Classes to src","title":"Related"},{"location":"de/developer/composer/","tags":["developer","composer"],"text":"Using Composer # Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Class autoloading How to use Composer # If you don't have Composer installed on your system, Friendica ships with a copy of it at bin/composer.phar . For the purpose of this help, all examples will use this path to run Composer commands, however feel free to replace them with your own way of calling Composer. Composer requires PHP CLI and the following examples assume it's available system-wide. Installing/Updating Friendica # From Archive # If you just unpacked a Friendica release archive, you don't have to use Composer at all, all the required libraries are already bundled in the archive. Installing with Git # If you prefer to use git , you will have to run Composer to fetch the required libraries and build the autoloader before you can run Friendica. Here are the typical commands you will have to run to do so: ~> git clone https://github.com/friendica/friendica.git friendica ~/friendica> cd friendica ~/friendica> bin/composer.phar install That's it! Composer will take care of fetching all the required libraries in the vendor folder and build the autoloader to make those libraries available to Friendica. Updating with Git # Updating Friendica to the current stable or the latest develop version is easy with Git, just remember to run Composer after every branch pull. ~> cd friendica ~/friendica> git pull ~/friendica> bin/composer.phar install And that's it. If any library used by Friendica has been upgraded, Composer will fetch the version currently used by Friendica and refresh the autoloader to ensure the best performances. Developing Friendica # First, thanks for contributing to Friendica! Composer is meant to be used by developers to maintain third-party libraries required by Friendica. If you don't need to use any third-party library, then you don't need to use Composer beyond what is above to install/update Friendica. Adding a third-party library to Friendica # Does your shiny new Addon need to rely on a third-party library not required by Friendica yet? First, this library should be available on Packagist so that Composer knows how to fetch it directly just by mentioning its name in composer.json . This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version. Here's a simplified version of the one we currently use on Friendica: { \"name\" : \"friendica/friendica\" , \"description\" : \"A decentralized social network part of The Federation\" , \"type\" : \"project\" , [ ... ] \"require\" : { \"ezyang/htmlpurifier\" : \"~4.7.0\" , \"mobiledetect/mobiledetectlib\" : \"2.8.*\" }, [ ... ] } The important part is under the require key, this is a list of all the libraries Friendica may need to run. As you can see, at the moment we only require two, HTMLPurifier and MobileDetect. Each library has a different target version, and per Composer documentation about version constraints , this means that: We will update HTMLPurifier up to version 4.8.0 excluded We will update MobileDetect up to version 2.9.0 excluded There are other operators you can use to allow Composer to update the package up to the next major version excluded. Or you can specify the exact version of the library if you code requires it, and Composer will never update it, although it isn't recommended. To add a library, just add its Packagist identifier to the require list and set a target version string. Then you should run bin/composer.phar update to add it to your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Updating an existing dependency # If a package needs to be updated, whether to the next minor version or to the next major version provided you changed the adequate code in Friendica, simply edit composer.json to update the target version string of the relevant library. Then you should run bin/composer.phar update to update it in your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Please note that you should commit both composer.json and composer.lock with your work every time you make a change to the former. Composer FAQ # I used the composer command and got a warning about not to run it as root. # See https://getcomposer.org/root . Composer should be run as the web server user, usually www-data with Apache or http with nginx. If you can't switch to the web server user using su - [web user] , you can directly run the Composer command with sudo -u [web user] . Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer # This is because sudo doesn't always change the HOME environment variable, which means that the command is run as the web server user but the system still uses root home directory. However, you can temporarily change environment variable for the execution of a single command. For Composer, this would be: $> COMPOSER_HOME = /var/tmp/composer sudo -u [ web user ] bin/composer.phar [ mode ] Related # Class autoloading How To Move Classes to src","title":"Composer"},{"location":"de/developer/composer/#using-composer","text":"Friendica uses Composer to manage dependencies libraries and the class autoloader both for libraries and namespaced Friendica classes. It's a command-line tool that downloads required libraries into the vendor folder and makes any namespaced class in src available through the whole application through boot.php . Class autoloading","title":"Using Composer"},{"location":"de/developer/composer/#how-to-use-composer","text":"If you don't have Composer installed on your system, Friendica ships with a copy of it at bin/composer.phar . For the purpose of this help, all examples will use this path to run Composer commands, however feel free to replace them with your own way of calling Composer. Composer requires PHP CLI and the following examples assume it's available system-wide.","title":"How to use Composer"},{"location":"de/developer/composer/#installingupdating-friendica","text":"","title":"Installing/Updating Friendica"},{"location":"de/developer/composer/#from-archive","text":"If you just unpacked a Friendica release archive, you don't have to use Composer at all, all the required libraries are already bundled in the archive.","title":"From Archive"},{"location":"de/developer/composer/#installing-with-git","text":"If you prefer to use git , you will have to run Composer to fetch the required libraries and build the autoloader before you can run Friendica. Here are the typical commands you will have to run to do so: ~> git clone https://github.com/friendica/friendica.git friendica ~/friendica> cd friendica ~/friendica> bin/composer.phar install That's it! Composer will take care of fetching all the required libraries in the vendor folder and build the autoloader to make those libraries available to Friendica.","title":"Installing with Git"},{"location":"de/developer/composer/#updating-with-git","text":"Updating Friendica to the current stable or the latest develop version is easy with Git, just remember to run Composer after every branch pull. ~> cd friendica ~/friendica> git pull ~/friendica> bin/composer.phar install And that's it. If any library used by Friendica has been upgraded, Composer will fetch the version currently used by Friendica and refresh the autoloader to ensure the best performances.","title":"Updating with Git"},{"location":"de/developer/composer/#developing-friendica","text":"First, thanks for contributing to Friendica! Composer is meant to be used by developers to maintain third-party libraries required by Friendica. If you don't need to use any third-party library, then you don't need to use Composer beyond what is above to install/update Friendica.","title":"Developing Friendica"},{"location":"de/developer/composer/#adding-a-third-party-library-to-friendica","text":"Does your shiny new Addon need to rely on a third-party library not required by Friendica yet? First, this library should be available on Packagist so that Composer knows how to fetch it directly just by mentioning its name in composer.json . This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version. Here's a simplified version of the one we currently use on Friendica: { \"name\" : \"friendica/friendica\" , \"description\" : \"A decentralized social network part of The Federation\" , \"type\" : \"project\" , [ ... ] \"require\" : { \"ezyang/htmlpurifier\" : \"~4.7.0\" , \"mobiledetect/mobiledetectlib\" : \"2.8.*\" }, [ ... ] } The important part is under the require key, this is a list of all the libraries Friendica may need to run. As you can see, at the moment we only require two, HTMLPurifier and MobileDetect. Each library has a different target version, and per Composer documentation about version constraints , this means that: We will update HTMLPurifier up to version 4.8.0 excluded We will update MobileDetect up to version 2.9.0 excluded There are other operators you can use to allow Composer to update the package up to the next major version excluded. Or you can specify the exact version of the library if you code requires it, and Composer will never update it, although it isn't recommended. To add a library, just add its Packagist identifier to the require list and set a target version string. Then you should run bin/composer.phar update to add it to your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies.","title":"Adding a third-party library to Friendica"},{"location":"de/developer/composer/#updating-an-existing-dependency","text":"If a package needs to be updated, whether to the next minor version or to the next major version provided you changed the adequate code in Friendica, simply edit composer.json to update the target version string of the relevant library. Then you should run bin/composer.phar update to update it in your local vendor folder and update the composer.lock file that specifies the current versions of the dependencies. Please note that you should commit both composer.json and composer.lock with your work every time you make a change to the former.","title":"Updating an existing dependency"},{"location":"de/developer/composer/#composer-faq","text":"","title":"Composer FAQ"},{"location":"de/developer/composer/#i-used-the-composer-command-and-got-a-warning-about-not-to-run-it-as-root","text":"See https://getcomposer.org/root . Composer should be run as the web server user, usually www-data with Apache or http with nginx. If you can't switch to the web server user using su - [web user] , you can directly run the Composer command with sudo -u [web user] .","title":"I used the composer command and got a warning about not to run it as root."},{"location":"de/developer/composer/#running-composer-with-sudo-complains-about-not-being-able-to-create-the-composer-cache-directory-in-rootcomposer","text":"This is because sudo doesn't always change the HOME environment variable, which means that the command is run as the web server user but the system still uses root home directory. However, you can temporarily change environment variable for the execution of a single command. For Composer, this would be: $> COMPOSER_HOME = /var/tmp/composer sudo -u [ web user ] bin/composer.phar [ mode ]","title":"Running Composer with sudo complains about not being able to create the composer cache directory in /root/.composer"},{"location":"de/developer/composer/#related","text":"Class autoloading How To Move Classes to src","title":"Related"},{"location":"de/developer/domain-driven-design/","tags":["developer","pattern"],"text":"Domain-Driven-Design # Friendica uses class structures inspired by Domain-Driven-Design programming patterns. This page is meant to explain what it means in practical terms for Friendica development. Inspiration # https://designpatternsphp.readthedocs.io/en/latest/Structural/DependencyInjection/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html https://designpatternsphp.readthedocs.io/en/latest/More/Repository/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/FactoryMethod/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/Prototype/README.html Core concepts # Models and Collections # Instead of anonymous arrays of database field values, we have Models and collections to take full advantage of PHP type hints. Before: <?php function doSomething ( array $intros ) { foreach ( $intros as $intro ) { $introId = $intro [ 'id' ]; } } $intros = \\Friendica\\Database\\DBA :: selectToArray ( 'intros' , [], [ 'uid' => local_user ()]); doSomething ( $intros ); After: <?php function doSomething ( \\Friendica\\Contact\\Introductions\\Collection\\Introductions $intros ) { foreach ( $intros as $intro ) { /** @var $intro \\Friendica\\Contact\\Introductions\\Entity\\Introduction */ $introId = $intro -> id ; } } /** @var $intros \\Friendica\\Contact\\Introductions\\Collection\\Introductions */ $intros = \\Friendica\\DI :: intro () -> selecForUser ( local_user ()); doSomething ( $intros ); Dependency Injection # Under this concept, we want class objects to carry with them the dependencies they will use. Instead of calling global/static function/methods, objects use their own class members. Before: <?php class Model { public $id ; function save () { return \\Friendica\\Database\\DBA :: update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } After: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } The main advantage is testability. Another one is avoiding dependency circles and avoid implicit initializing. In the first example the method save() has to be tested with the DBA::update() method, which may or may not have dependencies itself. In the second example we can mock \\Friendica\\Database\\Database , e.g. overload the class by replacing its methods by placeholders, which allows us to test only Model::save() and nothing else implicitly. The main drawback is lengthy constructors for dependency-heavy classes. To alleviate this issue we are using DiCe to simplify the instantiation of the higher level objects Friendica uses. We also added a convenience factory named \\Friendica\\DI that creates some of the most common objects used in modules. Factories # Since we added a bunch of parameters to class constructors, instantiating objects has become cumbersome. To keep it simple, we are using Factories. Factories are classes used to generate other objects, centralizing the dependencies required in their constructor. Factories encapsulate more or less complex creation of objects and create them redundancy free. Before: <?php $model = new Model ( \\Friendica\\DI :: dba ()); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); Here, DI::factory() returns an instance of Factory that can then be used to create a Model object without having to care about its dependencies. Repositories # Last building block of our code architecture, repositories are meant as the interface between models and how they are stored. In Friendica they are stored in a relational database but repositories allow models not to have to care about it. Repositories also act as factories for the Model they are managing. Before: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Model { public $id ; } class Repository extends Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } public function save ( Model $model ) { return $this -> dba -> update ( 'table' , get_object_vars ( $model ), [ 'id' => $model -> id ]); } } $model = \\Friendica\\DI :: repository () -> create (); $model -> id = 1 ; $model -> key = 'value' ; \\Friendica\\DI :: repository () -> save ( $model );","title":"DDD"},{"location":"de/developer/domain-driven-design/#domain-driven-design","text":"Friendica uses class structures inspired by Domain-Driven-Design programming patterns. This page is meant to explain what it means in practical terms for Friendica development.","title":"Domain-Driven-Design"},{"location":"de/developer/domain-driven-design/#inspiration","text":"https://designpatternsphp.readthedocs.io/en/latest/Structural/DependencyInjection/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/SimpleFactory/README.html https://designpatternsphp.readthedocs.io/en/latest/More/Repository/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/FactoryMethod/README.html https://designpatternsphp.readthedocs.io/en/latest/Creational/Prototype/README.html","title":"Inspiration"},{"location":"de/developer/domain-driven-design/#core-concepts","text":"","title":"Core concepts"},{"location":"de/developer/domain-driven-design/#models-and-collections","text":"Instead of anonymous arrays of database field values, we have Models and collections to take full advantage of PHP type hints. Before: <?php function doSomething ( array $intros ) { foreach ( $intros as $intro ) { $introId = $intro [ 'id' ]; } } $intros = \\Friendica\\Database\\DBA :: selectToArray ( 'intros' , [], [ 'uid' => local_user ()]); doSomething ( $intros ); After: <?php function doSomething ( \\Friendica\\Contact\\Introductions\\Collection\\Introductions $intros ) { foreach ( $intros as $intro ) { /** @var $intro \\Friendica\\Contact\\Introductions\\Entity\\Introduction */ $introId = $intro -> id ; } } /** @var $intros \\Friendica\\Contact\\Introductions\\Collection\\Introductions */ $intros = \\Friendica\\DI :: intro () -> selecForUser ( local_user ()); doSomething ( $intros );","title":"Models and Collections"},{"location":"de/developer/domain-driven-design/#dependency-injection","text":"Under this concept, we want class objects to carry with them the dependencies they will use. Instead of calling global/static function/methods, objects use their own class members. Before: <?php class Model { public $id ; function save () { return \\Friendica\\Database\\DBA :: update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } After: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } The main advantage is testability. Another one is avoiding dependency circles and avoid implicit initializing. In the first example the method save() has to be tested with the DBA::update() method, which may or may not have dependencies itself. In the second example we can mock \\Friendica\\Database\\Database , e.g. overload the class by replacing its methods by placeholders, which allows us to test only Model::save() and nothing else implicitly. The main drawback is lengthy constructors for dependency-heavy classes. To alleviate this issue we are using DiCe to simplify the instantiation of the higher level objects Friendica uses. We also added a convenience factory named \\Friendica\\DI that creates some of the most common objects used in modules.","title":"Dependency Injection"},{"location":"de/developer/domain-driven-design/#factories","text":"Since we added a bunch of parameters to class constructors, instantiating objects has become cumbersome. To keep it simple, we are using Factories. Factories are classes used to generate other objects, centralizing the dependencies required in their constructor. Factories encapsulate more or less complex creation of objects and create them redundancy free. Before: <?php $model = new Model ( \\Friendica\\DI :: dba ()); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); Here, DI::factory() returns an instance of Factory that can then be used to create a Model object without having to care about its dependencies.","title":"Factories"},{"location":"de/developer/domain-driven-design/#repositories","text":"Last building block of our code architecture, repositories are meant as the interface between models and how they are stored. In Friendica they are stored in a relational database but repositories allow models not to have to care about it. Repositories also act as factories for the Model they are managing. Before: <?php class Model { /** * @var \\Friendica\\Database\\Database */ protected $dba ; public $id ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba = $dba ; } function save () { return $this -> dba -> update ( 'table' , get_object_vars ( $this ), [ 'id' => $this -> id ]); } } class Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } } $model = \\Friendica\\DI :: factory () -> create (); $model -> id = 1 ; $model -> key = 'value' ; $model -> save (); After: <?php class Model { public $id ; } class Repository extends Factory { /** * @var \\Friendica\\Database\\Database */ protected $dba ; function __construct ( \\Friendica\\Database\\Database $dba ) { $this -> dba ; } public function create () { return new Model ( $this -> dba ); } public function save ( Model $model ) { return $this -> dba -> update ( 'table' , get_object_vars ( $model ), [ 'id' => $model -> id ]); } } $model = \\Friendica\\DI :: repository () -> create (); $model -> id = 1 ; $model -> key = 'value' ; \\Friendica\\DI :: repository () -> save ( $model );","title":"Repositories"},{"location":"de/developer/github/","tags":["developer","upstream","git"],"text":"Friendica on GitHub # Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum. Introduction to the workflow with our GitHub repository # Install git on the system you will be developing on. Create your own GitHub account. Fork the Friendica repository from https://github.com/friendica/friendica.git . Clone your fork from your GitHub account to your machine. Follow the instructions provided here: http://help.github.com/fork-a-repo/ to create and use your own tracking fork on GitHub Run bin/composer.phar install in Friendica's folder. Commit your changes to your fork. Then go to your GitHub page and create a \"Pull request\" to notify us to merge your work. Our Git Branches # There are two relevant branches in the main repo on GitHub: stable: This branch contains stable releases only. develop: This branch contains the latest code. This is what you want to work with. Fast-forwarding # Fast forwarding is enabled by default in git. When you merge with fast-forwarding it does not add a new commit to mark when you've performed the merge and how. This means in your commit history you can't know exactly what happened in terms of merges. It's best to turn off fast-forwarding. This is done by running \"git merge --no-ff\". Here is an explanation on how to configure git to turn off fast-forwarding by default. You can find some more background reading here . Release branches # A release branch is created when the develop branch contains all features it should have. A release branch is used for a few things. It allows last-minute bug fixing before the release goes to stable branch. It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes. It makes sure the develop branch can receive new features that are not part of this release. That last point is important because... The moment a release branch is created, develop is now intended for the version after this release . So please don't ever merge develop into a release! An example: If a release branch \"release-3.4\" is created, \"develop\" becomes either 3.5 or 4.0. If you were to merge develop into release-3.4 at this point, features and bug-fixes intended for 3.5 or 4.0 might leak into this release branch. This might introduce new bugs, too. Which defeats the purpose of the release branch. Some important reminders # 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. Test your changes . Don't assume that a simple fix won't break anything else. If possible get an experienced Friendica developer to review the code. Don't hesitate to ask us in case of doubt. Check your code for typos. There is a console command called typo for this. $> php bin/console.php typo Check out how to work with our Vagrant to save a lot of setup time!","title":"GitHub"},{"location":"de/developer/github/#friendica-on-github","text":"Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum.","title":"Friendica on GitHub"},{"location":"de/developer/github/#introduction-to-the-workflow-with-our-github-repository","text":"Install git on the system you will be developing on. Create your own GitHub account. Fork the Friendica repository from https://github.com/friendica/friendica.git . Clone your fork from your GitHub account to your machine. Follow the instructions provided here: http://help.github.com/fork-a-repo/ to create and use your own tracking fork on GitHub Run bin/composer.phar install in Friendica's folder. Commit your changes to your fork. Then go to your GitHub page and create a \"Pull request\" to notify us to merge your work.","title":"Introduction to the workflow with our GitHub repository"},{"location":"de/developer/github/#our-git-branches","text":"There are two relevant branches in the main repo on GitHub: stable: This branch contains stable releases only. develop: This branch contains the latest code. This is what you want to work with.","title":"Our Git Branches"},{"location":"de/developer/github/#fast-forwarding","text":"Fast forwarding is enabled by default in git. When you merge with fast-forwarding it does not add a new commit to mark when you've performed the merge and how. This means in your commit history you can't know exactly what happened in terms of merges. It's best to turn off fast-forwarding. This is done by running \"git merge --no-ff\". Here is an explanation on how to configure git to turn off fast-forwarding by default. You can find some more background reading here .","title":"Fast-forwarding"},{"location":"de/developer/github/#release-branches","text":"A release branch is created when the develop branch contains all features it should have. A release branch is used for a few things. It allows last-minute bug fixing before the release goes to stable branch. It allows meta-data changes (README, CHANGELOG, etc.) for version bumps and documentation changes. It makes sure the develop branch can receive new features that are not part of this release. That last point is important because... The moment a release branch is created, develop is now intended for the version after this release . So please don't ever merge develop into a release! An example: If a release branch \"release-3.4\" is created, \"develop\" becomes either 3.5 or 4.0. If you were to merge develop into release-3.4 at this point, features and bug-fixes intended for 3.5 or 4.0 might leak into this release branch. This might introduce new bugs, too. Which defeats the purpose of the release branch.","title":"Release branches"},{"location":"de/developer/github/#some-important-reminders","text":"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. Test your changes . Don't assume that a simple fix won't break anything else. If possible get an experienced Friendica developer to review the code. Don't hesitate to ask us in case of doubt. Check your code for typos. There is a console command called typo for this. $> php bin/console.php typo Check out how to work with our Vagrant to save a lot of setup time!","title":"Some important reminders"},{"location":"de/developer/how-to-move-classes-to-src/","tags":["developer","refactoring"],"text":"How To Move Classes to src # Friendica uses Composer to manage autoloading. This means that all the PHP class files moved to the src folder will be automatically included when the class it defines is first used in the flow. This is an improvement over the current require usage since files will be included on an actual usage basis instead of the presence of a require call. However, there are a significant number of items to check when moving a class file from the include folder to the src folder, and this page is there to list them. Decide the namespace # This isn't the most technical decision of them all, but it has long-lasting consequences as it will be the name that will be used to refer to this class from now on. There is a shared Ethercalc sheet to suggest namespace/class names that lists all the already moved class files for inspiration. A few pointers though: * Friendica is the base namespace for all classes in the src folder * Namespaces match the directory structure, with Friendica namespace being the base src directory. The Config class set in the Friendica\\Core namespace is expected to be found at src/Core/Config.php . * Namespaces can help group classes with a similar purpose or relevant to a particular feature When you're done deciding the namespace, it's time to use it. Let's say we choose Friendica\\Core for the Config class. Use the namespace # To declare the namespace, the file src/Core/Config.php must start with the following statement: namespace Friendica\\Core; From now on, the Config class can be referred to as Friendica\\Core\\Config , however it isn't very practical, especially when the class was previously used as Config . Thankfully, PHP provides namespace shortcuts through use . This language construct just provides a different naming scheme for a namespace or a class, but doesn't trigger the autoload-mechanism on its own. Here are the different ways you can use use : // No use $config = new Friendica\\Core\\Config(); // Namespace shortcut use Friendica\\Core; $config = new Core\\Config(); // Class name shortcut use Friendica\\Core\\Config; $config = new Config(); // Aliasing use Friendica\\Core\\Config as Cfg; $config = new Cfg(); Whatever the style chosen, a repository-wide search has to be done to find all the class name usage and either use the fully-qualified class name (including the namespace) or add a use statement at the start of each relevant file. Escape non-namespace classes # The class file you just moved is now in the Friendica namespace, but it probably isn't the case for all the classes referenced in this file. Since we added a namespace Friendica\\Core; to the file, all the class names still declared in include will be implicitly understood as Friendica\\Core\\ClassName , which is rarely what we expect. To avoid Class Friendica\\Core\\ClassName not found errors, all the include -declared class names have to be prepended with a \\ , it tells the autoloader not to look for the class in the namespace but in the global space where non-namespaced classes are set. If there are only a handful of references to a single non-namespaced class, just prepending \\ is enough. However, if there are many instance, we can use use again. namespace Friendica\\Core; ... if (\\DBM::is_result($r)) { ... } namespace Friendica\\Core; use Friendica\\Database\\DBM; if (DBM::is_result($r)) { ... } Remove any useless require # Now that you successfully moved your class to the autoloaded src folder, there's no need to include this file anywhere in the app ever again. Please remove all the require_once mentions of the former file, as they will provoke a Fatal Error even if the class isn't used. Miscellaneous tips # When you are done with moving the class, please run php bin/console.php typo from the Friendica base directory to check for obvious mistakes. However, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one. Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica. Check the class file for any magic constant __FILE__ or __DIR__ , as their value changed since you moved the class in the file tree. Most of the time it's used for debugging purposes but there can be instances where it's used to create cache folders for example. Related # Class autoloading Using Composer","title":"src Migration"},{"location":"de/developer/how-to-move-classes-to-src/#how-to-move-classes-to-src","text":"Friendica uses Composer to manage autoloading. This means that all the PHP class files moved to the src folder will be automatically included when the class it defines is first used in the flow. This is an improvement over the current require usage since files will be included on an actual usage basis instead of the presence of a require call. However, there are a significant number of items to check when moving a class file from the include folder to the src folder, and this page is there to list them.","title":"How To Move Classes to src"},{"location":"de/developer/how-to-move-classes-to-src/#decide-the-namespace","text":"This isn't the most technical decision of them all, but it has long-lasting consequences as it will be the name that will be used to refer to this class from now on. There is a shared Ethercalc sheet to suggest namespace/class names that lists all the already moved class files for inspiration. A few pointers though: * Friendica is the base namespace for all classes in the src folder * Namespaces match the directory structure, with Friendica namespace being the base src directory. The Config class set in the Friendica\\Core namespace is expected to be found at src/Core/Config.php . * Namespaces can help group classes with a similar purpose or relevant to a particular feature When you're done deciding the namespace, it's time to use it. Let's say we choose Friendica\\Core for the Config class.","title":"Decide the namespace"},{"location":"de/developer/how-to-move-classes-to-src/#use-the-namespace","text":"To declare the namespace, the file src/Core/Config.php must start with the following statement: namespace Friendica\\Core; From now on, the Config class can be referred to as Friendica\\Core\\Config , however it isn't very practical, especially when the class was previously used as Config . Thankfully, PHP provides namespace shortcuts through use . This language construct just provides a different naming scheme for a namespace or a class, but doesn't trigger the autoload-mechanism on its own. Here are the different ways you can use use : // No use $config = new Friendica\\Core\\Config(); // Namespace shortcut use Friendica\\Core; $config = new Core\\Config(); // Class name shortcut use Friendica\\Core\\Config; $config = new Config(); // Aliasing use Friendica\\Core\\Config as Cfg; $config = new Cfg(); Whatever the style chosen, a repository-wide search has to be done to find all the class name usage and either use the fully-qualified class name (including the namespace) or add a use statement at the start of each relevant file.","title":"Use the namespace"},{"location":"de/developer/how-to-move-classes-to-src/#escape-non-namespace-classes","text":"The class file you just moved is now in the Friendica namespace, but it probably isn't the case for all the classes referenced in this file. Since we added a namespace Friendica\\Core; to the file, all the class names still declared in include will be implicitly understood as Friendica\\Core\\ClassName , which is rarely what we expect. To avoid Class Friendica\\Core\\ClassName not found errors, all the include -declared class names have to be prepended with a \\ , it tells the autoloader not to look for the class in the namespace but in the global space where non-namespaced classes are set. If there are only a handful of references to a single non-namespaced class, just prepending \\ is enough. However, if there are many instance, we can use use again. namespace Friendica\\Core; ... if (\\DBM::is_result($r)) { ... } namespace Friendica\\Core; use Friendica\\Database\\DBM; if (DBM::is_result($r)) { ... }","title":"Escape non-namespace classes"},{"location":"de/developer/how-to-move-classes-to-src/#remove-any-useless-require","text":"Now that you successfully moved your class to the autoloaded src folder, there's no need to include this file anywhere in the app ever again. Please remove all the require_once mentions of the former file, as they will provoke a Fatal Error even if the class isn't used.","title":"Remove any useless require"},{"location":"de/developer/how-to-move-classes-to-src/#miscellaneous-tips","text":"When you are done with moving the class, please run php bin/console.php typo from the Friendica base directory to check for obvious mistakes. However, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one. Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica. Check the class file for any magic constant __FILE__ or __DIR__ , as their value changed since you moved the class in the file tree. Most of the time it's used for debugging purposes but there can be instances where it's used to create cache folders for example.","title":"Miscellaneous tips"},{"location":"de/developer/how-to-move-classes-to-src/#related","text":"Class autoloading Using Composer","title":"Related"},{"location":"de/developer/smarty3-templates/","tags":["developer","templates","themes"],"text":"Friendica Templating Documentation # Friendica uses Smarty 3 as PHP templating engine. The main templates are found in /view/templates theme authors may overwrite the default templates by putting a files with the same name into the /view/themes/$themename/templates directory. Templates that are only used by addons shall be placed in the /addon/$addonname/templates directory. To render a template use the function getMarkupTemplate to load the template and replaceMacros to replace the macros/variables in the just loaded template file. $tpl = Renderer::getMarkupTemplate('install_settings.tpl'); $o .= Renderer::replaceMacros($tpl, array( ... )); the array consists of an association of an identifier and the value for that identifier, i.e. '$title' => $install_title, where the value may as well be an array by its own. Form Templates # To guarantee a consistent look and feel for input forms, i.e. in the settings sections, there are templates for the basic form fields. They are initialized with an array of data, depending on the style of the field. All of these take an array holding the values, e.g. for a one line text input field, which is required and should be used to type email addresses use something along the lines of: '$adminmail' => array('adminmail', DI::l10n()->t('Site administrator email address'), $adminmail, DI::l10n()->t('Your account email address must match this in order to use the web admin panel.'), 'required', '', 'email'), To evaluate the input value, you can then use the $_POST array, more precisely the $_POST['adminemail'] variable. Listed below are the template file names, the general purpose of the template and their field parameters. field_checkbox.tpl # A checkbox. If the checkbox is checked its value is 1 . Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Help text for the checkbox. field_combobox.tpl # A combobox, combining a pull down selection and a textual input field. Field parameter: Name of the combobox, Label for the combobox, Current value of the variable, Help text for the combobox, Array holding the possible values for the textual input, Array holding the possible values for the pull down selection. field_custom.tpl # A customizable template to include a custom element in the form with the usual surroundings, Field parameter: Name of the field, Label for the field, the field, Help text for the field. field_input.tpl # A single line input field for any type of input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor into this box once the page is loaded, if set, it will be used for the input type, default is text (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types). field_intcheckbox.tpl # A checkbox (see above) but you can define the value of it. Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Value of the checkbox, Help text for the checkbox. field_openid.tpl # An input box (see above) but prepared for special CSS styling for openID input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input field. field_password.tpl # A single line input field (see above) for textual input. The characters typed in will not be shown by the browser. Field parameter: Name of the field, Label for the field, Value for the field, e.g. the old password, Help text for the input field, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor automatically into this input field. field_radio.tpl # A radio button. Field parameter: Name of the radio button, Label for the radio button, Current value of the variable, Help text for the button, if set, the radio button will be checked. field_richtext.tpl # A multi-line input field for rich textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box. field_select.tpl # A drop-down selection box. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Array holding the possible values of the selection drop-down. field_select_raw.tpl # A drop-down selection box (see above) but you have to prepare the values yourself. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Possible values of the selection drop-down. field_textarea.tpl # A multi-line input field for (plain) textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required.","title":"Smarty3"},{"location":"de/developer/smarty3-templates/#friendica-templating-documentation","text":"Friendica uses Smarty 3 as PHP templating engine. The main templates are found in /view/templates theme authors may overwrite the default templates by putting a files with the same name into the /view/themes/$themename/templates directory. Templates that are only used by addons shall be placed in the /addon/$addonname/templates directory. To render a template use the function getMarkupTemplate to load the template and replaceMacros to replace the macros/variables in the just loaded template file. $tpl = Renderer::getMarkupTemplate('install_settings.tpl'); $o .= Renderer::replaceMacros($tpl, array( ... )); the array consists of an association of an identifier and the value for that identifier, i.e. '$title' => $install_title, where the value may as well be an array by its own.","title":"Friendica Templating Documentation"},{"location":"de/developer/smarty3-templates/#form-templates","text":"To guarantee a consistent look and feel for input forms, i.e. in the settings sections, there are templates for the basic form fields. They are initialized with an array of data, depending on the style of the field. All of these take an array holding the values, e.g. for a one line text input field, which is required and should be used to type email addresses use something along the lines of: '$adminmail' => array('adminmail', DI::l10n()->t('Site administrator email address'), $adminmail, DI::l10n()->t('Your account email address must match this in order to use the web admin panel.'), 'required', '', 'email'), To evaluate the input value, you can then use the $_POST array, more precisely the $_POST['adminemail'] variable. Listed below are the template file names, the general purpose of the template and their field parameters.","title":"Form Templates"},{"location":"de/developer/smarty3-templates/#field_checkboxtpl","text":"A checkbox. If the checkbox is checked its value is 1 . Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Help text for the checkbox.","title":"field_checkbox.tpl"},{"location":"de/developer/smarty3-templates/#field_comboboxtpl","text":"A combobox, combining a pull down selection and a textual input field. Field parameter: Name of the combobox, Label for the combobox, Current value of the variable, Help text for the combobox, Array holding the possible values for the textual input, Array holding the possible values for the pull down selection.","title":"field_combobox.tpl"},{"location":"de/developer/smarty3-templates/#field_customtpl","text":"A customizable template to include a custom element in the form with the usual surroundings, Field parameter: Name of the field, Label for the field, the field, Help text for the field.","title":"field_custom.tpl"},{"location":"de/developer/smarty3-templates/#field_inputtpl","text":"A single line input field for any type of input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor into this box once the page is loaded, if set, it will be used for the input type, default is text (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types).","title":"field_input.tpl"},{"location":"de/developer/smarty3-templates/#field_intcheckboxtpl","text":"A checkbox (see above) but you can define the value of it. Field parameter: Name of the checkbox, Label for the checkbox, State checked? if true then the checkbox will be marked as checked, Value of the checkbox, Help text for the checkbox.","title":"field_intcheckbox.tpl"},{"location":"de/developer/smarty3-templates/#field_openidtpl","text":"An input box (see above) but prepared for special CSS styling for openID input. Field parameter: Name of the field, Label for the input box, Current value of the variable, Help text for the input field.","title":"field_openid.tpl"},{"location":"de/developer/smarty3-templates/#field_passwordtpl","text":"A single line input field (see above) for textual input. The characters typed in will not be shown by the browser. Field parameter: Name of the field, Label for the field, Value for the field, e.g. the old password, Help text for the input field, Should be set to the translation of \"Required\" to mark this field as required, if set to \"autofocus\" modern browser will put the cursor automatically into this input field.","title":"field_password.tpl"},{"location":"de/developer/smarty3-templates/#field_radiotpl","text":"A radio button. Field parameter: Name of the radio button, Label for the radio button, Current value of the variable, Help text for the button, if set, the radio button will be checked.","title":"field_radio.tpl"},{"location":"de/developer/smarty3-templates/#field_richtexttpl","text":"A multi-line input field for rich textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box.","title":"field_richtext.tpl"},{"location":"de/developer/smarty3-templates/#field_selecttpl","text":"A drop-down selection box. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Array holding the possible values of the selection drop-down.","title":"field_select.tpl"},{"location":"de/developer/smarty3-templates/#field_select_rawtpl","text":"A drop-down selection box (see above) but you have to prepare the values yourself. Field parameter: Name of the field, Label of the selection box, Current selected value, Help text for the selection box, Possible values of the selection drop-down.","title":"field_select_raw.tpl"},{"location":"de/developer/smarty3-templates/#field_textareatpl","text":"A multi-line input field for (plain) textual content. Field parameter: Name of the input field, Label for the input box, Current text for the box, Help text for the input box, Should be set to the translation of \"Required\" to mark this field as required.","title":"field_textarea.tpl"},{"location":"de/developer/tests/","tags":["developer","testing"],"text":"Tests # You can run unit tests with PHPUnit : phpunit Some tests require access to a MySQL database. You can specify the database credentials in environment variables: USER = database_user PASS = database_password DB = database_name phpunit Warning : This will empty all the tables! Never use this on a production database.","title":"Tests"},{"location":"de/developer/tests/#tests","text":"You can run unit tests with PHPUnit : phpunit Some tests require access to a MySQL database. You can specify the database credentials in environment variables: USER = database_user PASS = database_password DB = database_name phpunit Warning : This will empty all the tables! Never use this on a production database.","title":"Tests"},{"location":"de/developer/themes/","tags":["developer","themes","templates"],"text":"Themes # To change the look of friendica you have to touch the themes. The current default theme is Vier but there are numerous others. Have a look at github.com/bkil/friendica-themes for an overview of the existing themes. In case none of them suits your needs, there are several ways to change a theme. So, how to work on the UI of friendica. You can either directly edit an existing theme. But you might lose your changes when the theme is updated by the friendica team. If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheritance most of the properties of the parent theme and change just minor stuff. The below for a more detailed description of theme heritage. Some themes also allow users to select variants of the theme. Those theme variants most often contain an additional CSS file to override some styling of the default theme values. From the themes in the main repository duepunto zero and vier are using these methods for variations. Quattro is using a slightly different approach. Third you can start your theme from scratch. Which is the most complex way to change friendicas look. But it leaves you the most freedom. So below for a detailed description and the meaning of some special files. Styling # If you want to change the styling of a theme, have a look at the themes CSS file. In most cases, you can find these in /view/theme/**your-theme-name**/style.css sometimes, there is also a file called style.php in the theme directory. This is only needed if the theme allows the user to change certain things of the theme dynamically. Say the font size or set a background image. Templates # If you want to change the structure of the theme, you need to change the templates used by the theme. Friendica themes are using SMARTY3 for templating. The default template can be found in /view/templates if you want to override any template within your theme create your version of the template in /view/theme/**your-theme-name**/templates any template that exists there will be used instead of the default one. Javascript # The same rule applies to the JavaScript files found in /js they will be overwritten by files in /view/theme/**your-theme-name**/js. Expand an existing Theme # Theme Variations # Many themes are more theme families than only one theme. duepunto zero and vier allow easily to add new theme variation. We will go through the process of creating a new variation for duepunto zero . The same (well almost, some names change) procedure applies to the vier theme. And similar steps are needed for quattro but this theme is using lesscss to maintain the CSS files. In /view/theme/duepuntozero/deriv you find a couple of CSS files that define color derivations from the duepunto theme. These resemble some now as unsupported marked themes, that were inherited by the duepunto theme. Darkzero and Easter Bunny for example. The selection of the colorset is done in a combination of a template for a new form in the settings and some functions in the theme.php file. The template (theme_settings.tpl) {{ '{{include file=\"field_select.tpl\" field=$colorset}}' }} < div class = \"settings-submit-wrapper\" > {{ ' < input type = \"submit\" value = \"{{$submit}}\" class = \"settings-submit\" name = \"duepuntozero-settings-submit\" /> ' }} </ div > defines a formular consisting of a select pull-down which contains all available variants and s submit button. See the documentation about SMARTY3 templates for a summary of friendica specific blocks other than the select element. But we don't really need to change anything at the template itself. The template alone won't work though. You make friendica aware of its existence and tell it how to use the template file, by defining a config.php file. It needs to define at least the following functions theme_content theme_post and may also define functions for the admin interface theme_admin theme_admin_post. theme_content and theme_admin are used to make the form available in the settings, respectively the admin panel. The _post functions handle the processing of the send-form, in this case they save to selected variant in friendicas database. To make your own variation appear in the menu, all you need to do is to create a new CSS file in the deriv-directory and include it in the array in the config.php: $colorset = array( 'default'=>DI::l10n()->t('default'), 'greenzero'=>DI::l10n()->t('greenzero'), 'purplezero'=>DI::l10n()->t('purplezero'), 'easterbunny'=>DI::l10n()->t('easterbunny'), 'darkzero'=>DI::l10n()->t('darkzero'), 'comix'=>DI::l10n()->t('comix'), 'slackr'=>DI::l10n()->t('slackr'), ); ``` the 1st part of the line is the name of the CSS file (without the .css) the 2nd part is the common name of the variant. Calling the DI::l10n()->t() function with the common name makes the string translatable. The selected 1st part will be saved in the database by the theme_post function. ```php <?php function theme_post ( App $a ){ // non-local users shall not pass if ( ! local_user ()) { return ; } // if the one specific submit button was pressed then proceed if ( isset ( $_POST [ 'duepuntozero-settings-submit' ])){ // and save the selection key into the personal config of the user DI :: pConfig () -> set ( local_user (), 'duepuntozero' , 'colorset' , $_POST [ 'duepuntozero_colorset' ]); } } Now that this information is set in the database, what should friendica do with it? For this, have a look at the theme.php file of the duepunto zero . There you'll find something alike <?php $colorset = DI :: pConfig () -> get ( local_user (), 'duepuntozero' , 'colorset' ); if ( ! $colorset ) $colorset = DI :: config () -> get ( 'duepuntozero' , 'colorset' ); if ( $colorset ) { if ( $colorset == 'greenzero' ) DI :: page ()[ 'htmlhead' ] .= '<link rel=\"stylesheet\" href=\"view/theme/duepuntozero/deriv/greenzero.css\" type=\"text/css\" media=\"screen\" />' . \" \\n \" ; /* some more variants */ } which tells friendica to get the personal config of a user. Check if it is set and if not look for the global config. And finally if a config for the colorset was found, apply it by adding a link to the CSS file into the HTML header of the page. So you'll just need to add an if selection, fitting your variant keyword and link to the CSS file of it. Done. Now you can use the variant on your system. But remember once the theme.php or the config.php you have to re-add your variant to them. If you think your color variation could be beneficial for other friendica users as well, feel free to generate a pull request at GitHub, so we can include your work into the repository. Inheritance # Say, you like the duepuntozero, but you want to have the content of the outer columns left and right exchanged. That would be not a color variation as shown above. Instead, we will create a new theme, duepuntozero_lr, inherit the properties of duepuntozero and make small changes to the underlying php files. So create a directory called duepunto_lr and create a file called theme.php with your favorite text editor. The content of this file should be something like <?php /* meta information for the theme, see below */ use Friendica\\App ; function duepuntozero_lr_init ( App $a ) { $a -> setThemeInfoValue ( 'extends' , 'duepuntozero' ); $a -> set_template_engine ( 'smarty3' ); /* and more stuff e.g. the JavaScript function for the header */ } Next take the default.php file found in the /view directory and exchange the aside and right_aside elements. So the central part of the file now looks like this: < body > <?php if(!empty($page['nav'])) echo $page['nav']; ?> < aside > <?php if(!empty($page['right_aside'])) echo $page['right_aside']; ?> </ aside > < section > <?php if(!empty($page['content'])) echo $page['content']; ?> < div id = \"page-footer\" ></ div > </ section > < right_aside > <?php if(!empty($page['aside'])) echo $page['aside']; ?> </ right_aside > < footer > <?php if(!empty($page['footer'])) echo $page['footer']; ?> </ footer > </ body > Finally, we need a style.css file, inheriting the definitions from the parent theme and containing out changes for the new theme. Note :You need to create the style.css and at lest import the base CSS file from the parent theme. @import url('../duepuntozero/style.css'); Done. But I agree it is not really useful at this state. Nevertheless, to use it, you just need to activate in the admin panel. That done, you can select it in the settings like any other activated theme. Creating a Theme from Scratch # Keep patient. Basically what you have to do is identify which template you have to change, so it looks more like what you want. Adopt the CSS of the theme accordingly. And iterate the process until you have the theme the way you want it. Use the source Luke. and don't hesitate to ask in @ developers or @ helpers . Special Files # unsupported # If a file with this name (which might be empty) exists in the theme directory, the theme is marked as unsupported . An unsupported theme may not be selected by a user in the settings. Users who are already using it won't notice anything. README(.md) # The contents of this file, with or without the .md which indicates Markdown syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica. This file should contain information you want to let others know about your theme. screenshot.[png|jpg] # If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name. Supported formats are PNG and JPEG. theme.php # This is the main definition file of the theme. In the header of that file, some meta information is stored. For example, have a look at the theme.php of the quattro theme: <?php /** * Name: Quattro * Version: 0.6 * Author: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Tobias <https://f.diekershoff.de/profile/tobias> */ ``` You see the definition of the theme's name, it's version and the initial author of the theme. These three pieces of information should be listed. If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well. The information from the theme header will be displayed in the admin panel. The first thing in file is to import the ` App ` class from ` \\Friendica\\ ` namespace. ``` php use Friendica\\App ; This will make our job a little easier, as we don't have to specify the full name every time we need to use the App class. The next crucial part of the theme.php file is a definition of an init function. The name of the function is _init. So in the case of quattro it is <?php function quattro_init ( App $a ) { $a -> theme_info = array (); $a -> set_template_engine ( 'smarty3' ); } Here we have set the basic theme information, in this case they are empty. But the array needs to be set. And we have set the template engine that should be used by friendica for this theme. At the moment you should use the smarty3 engine. There once was a friendica specific templating engine as well but that is not used anymore. If you like to use another templating engine, please implement it. When you want to inherit stuff from another theme you have to announce this in the theme_info: $a->setThemeInfoValue('extends', 'duepuntozero'); which declares duepuntozero as parent of the theme. If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file. To do so, add something alike DI::page()['htmlhead'] .= <<< EOT /* stuff you want to add to the header */ EOT; The $a variable holds the friendica application. So you can access the properties of this friendica session from the theme.php file as well. default.php # This file covers the structure of the underlying HTML layout. The default file is in /view/default.php if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory. As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.","title":"Themes"},{"location":"de/developer/themes/#themes","text":"To change the look of friendica you have to touch the themes. The current default theme is Vier but there are numerous others. Have a look at github.com/bkil/friendica-themes for an overview of the existing themes. In case none of them suits your needs, there are several ways to change a theme. So, how to work on the UI of friendica. You can either directly edit an existing theme. But you might lose your changes when the theme is updated by the friendica team. If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheritance most of the properties of the parent theme and change just minor stuff. The below for a more detailed description of theme heritage. Some themes also allow users to select variants of the theme. Those theme variants most often contain an additional CSS file to override some styling of the default theme values. From the themes in the main repository duepunto zero and vier are using these methods for variations. Quattro is using a slightly different approach. Third you can start your theme from scratch. Which is the most complex way to change friendicas look. But it leaves you the most freedom. So below for a detailed description and the meaning of some special files.","title":"Themes"},{"location":"de/developer/themes/#styling","text":"If you want to change the styling of a theme, have a look at the themes CSS file. In most cases, you can find these in /view/theme/**your-theme-name**/style.css sometimes, there is also a file called style.php in the theme directory. This is only needed if the theme allows the user to change certain things of the theme dynamically. Say the font size or set a background image.","title":"Styling"},{"location":"de/developer/themes/#templates","text":"If you want to change the structure of the theme, you need to change the templates used by the theme. Friendica themes are using SMARTY3 for templating. The default template can be found in /view/templates if you want to override any template within your theme create your version of the template in /view/theme/**your-theme-name**/templates any template that exists there will be used instead of the default one.","title":"Templates"},{"location":"de/developer/themes/#javascript","text":"The same rule applies to the JavaScript files found in /js they will be overwritten by files in /view/theme/**your-theme-name**/js.","title":"Javascript"},{"location":"de/developer/themes/#expand-an-existing-theme","text":"","title":"Expand an existing Theme"},{"location":"de/developer/themes/#theme-variations","text":"Many themes are more theme families than only one theme. duepunto zero and vier allow easily to add new theme variation. We will go through the process of creating a new variation for duepunto zero . The same (well almost, some names change) procedure applies to the vier theme. And similar steps are needed for quattro but this theme is using lesscss to maintain the CSS files. In /view/theme/duepuntozero/deriv you find a couple of CSS files that define color derivations from the duepunto theme. These resemble some now as unsupported marked themes, that were inherited by the duepunto theme. Darkzero and Easter Bunny for example. The selection of the colorset is done in a combination of a template for a new form in the settings and some functions in the theme.php file. The template (theme_settings.tpl) {{ '{{include file=\"field_select.tpl\" field=$colorset}}' }} < div class = \"settings-submit-wrapper\" > {{ ' < input type = \"submit\" value = \"{{$submit}}\" class = \"settings-submit\" name = \"duepuntozero-settings-submit\" /> ' }} </ div > defines a formular consisting of a select pull-down which contains all available variants and s submit button. See the documentation about SMARTY3 templates for a summary of friendica specific blocks other than the select element. But we don't really need to change anything at the template itself. The template alone won't work though. You make friendica aware of its existence and tell it how to use the template file, by defining a config.php file. It needs to define at least the following functions theme_content theme_post and may also define functions for the admin interface theme_admin theme_admin_post. theme_content and theme_admin are used to make the form available in the settings, respectively the admin panel. The _post functions handle the processing of the send-form, in this case they save to selected variant in friendicas database. To make your own variation appear in the menu, all you need to do is to create a new CSS file in the deriv-directory and include it in the array in the config.php: $colorset = array( 'default'=>DI::l10n()->t('default'), 'greenzero'=>DI::l10n()->t('greenzero'), 'purplezero'=>DI::l10n()->t('purplezero'), 'easterbunny'=>DI::l10n()->t('easterbunny'), 'darkzero'=>DI::l10n()->t('darkzero'), 'comix'=>DI::l10n()->t('comix'), 'slackr'=>DI::l10n()->t('slackr'), ); ``` the 1st part of the line is the name of the CSS file (without the .css) the 2nd part is the common name of the variant. Calling the DI::l10n()->t() function with the common name makes the string translatable. The selected 1st part will be saved in the database by the theme_post function. ```php <?php function theme_post ( App $a ){ // non-local users shall not pass if ( ! local_user ()) { return ; } // if the one specific submit button was pressed then proceed if ( isset ( $_POST [ 'duepuntozero-settings-submit' ])){ // and save the selection key into the personal config of the user DI :: pConfig () -> set ( local_user (), 'duepuntozero' , 'colorset' , $_POST [ 'duepuntozero_colorset' ]); } } Now that this information is set in the database, what should friendica do with it? For this, have a look at the theme.php file of the duepunto zero . There you'll find something alike <?php $colorset = DI :: pConfig () -> get ( local_user (), 'duepuntozero' , 'colorset' ); if ( ! $colorset ) $colorset = DI :: config () -> get ( 'duepuntozero' , 'colorset' ); if ( $colorset ) { if ( $colorset == 'greenzero' ) DI :: page ()[ 'htmlhead' ] .= '<link rel=\"stylesheet\" href=\"view/theme/duepuntozero/deriv/greenzero.css\" type=\"text/css\" media=\"screen\" />' . \" \\n \" ; /* some more variants */ } which tells friendica to get the personal config of a user. Check if it is set and if not look for the global config. And finally if a config for the colorset was found, apply it by adding a link to the CSS file into the HTML header of the page. So you'll just need to add an if selection, fitting your variant keyword and link to the CSS file of it. Done. Now you can use the variant on your system. But remember once the theme.php or the config.php you have to re-add your variant to them. If you think your color variation could be beneficial for other friendica users as well, feel free to generate a pull request at GitHub, so we can include your work into the repository.","title":"Theme Variations"},{"location":"de/developer/themes/#inheritance","text":"Say, you like the duepuntozero, but you want to have the content of the outer columns left and right exchanged. That would be not a color variation as shown above. Instead, we will create a new theme, duepuntozero_lr, inherit the properties of duepuntozero and make small changes to the underlying php files. So create a directory called duepunto_lr and create a file called theme.php with your favorite text editor. The content of this file should be something like <?php /* meta information for the theme, see below */ use Friendica\\App ; function duepuntozero_lr_init ( App $a ) { $a -> setThemeInfoValue ( 'extends' , 'duepuntozero' ); $a -> set_template_engine ( 'smarty3' ); /* and more stuff e.g. the JavaScript function for the header */ } Next take the default.php file found in the /view directory and exchange the aside and right_aside elements. So the central part of the file now looks like this: < body > <?php if(!empty($page['nav'])) echo $page['nav']; ?> < aside > <?php if(!empty($page['right_aside'])) echo $page['right_aside']; ?> </ aside > < section > <?php if(!empty($page['content'])) echo $page['content']; ?> < div id = \"page-footer\" ></ div > </ section > < right_aside > <?php if(!empty($page['aside'])) echo $page['aside']; ?> </ right_aside > < footer > <?php if(!empty($page['footer'])) echo $page['footer']; ?> </ footer > </ body > Finally, we need a style.css file, inheriting the definitions from the parent theme and containing out changes for the new theme. Note :You need to create the style.css and at lest import the base CSS file from the parent theme. @import url('../duepuntozero/style.css'); Done. But I agree it is not really useful at this state. Nevertheless, to use it, you just need to activate in the admin panel. That done, you can select it in the settings like any other activated theme.","title":"Inheritance"},{"location":"de/developer/themes/#creating-a-theme-from-scratch","text":"Keep patient. Basically what you have to do is identify which template you have to change, so it looks more like what you want. Adopt the CSS of the theme accordingly. And iterate the process until you have the theme the way you want it. Use the source Luke. and don't hesitate to ask in @ developers or @ helpers .","title":"Creating a Theme from Scratch"},{"location":"de/developer/themes/#special-files","text":"","title":"Special Files"},{"location":"de/developer/themes/#unsupported","text":"If a file with this name (which might be empty) exists in the theme directory, the theme is marked as unsupported . An unsupported theme may not be selected by a user in the settings. Users who are already using it won't notice anything.","title":"unsupported"},{"location":"de/developer/themes/#readmemd","text":"The contents of this file, with or without the .md which indicates Markdown syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica. This file should contain information you want to let others know about your theme.","title":"README(.md)"},{"location":"de/developer/themes/#screenshotpngjpg","text":"If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name. Supported formats are PNG and JPEG.","title":"screenshot.[png|jpg]"},{"location":"de/developer/themes/#themephp","text":"This is the main definition file of the theme. In the header of that file, some meta information is stored. For example, have a look at the theme.php of the quattro theme: <?php /** * Name: Quattro * Version: 0.6 * Author: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Fabio <https://kirgroup.com/profile/fabrixxm> * Maintainer: Tobias <https://f.diekershoff.de/profile/tobias> */ ``` You see the definition of the theme's name, it's version and the initial author of the theme. These three pieces of information should be listed. If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well. The information from the theme header will be displayed in the admin panel. The first thing in file is to import the ` App ` class from ` \\Friendica\\ ` namespace. ``` php use Friendica\\App ; This will make our job a little easier, as we don't have to specify the full name every time we need to use the App class. The next crucial part of the theme.php file is a definition of an init function. The name of the function is _init. So in the case of quattro it is <?php function quattro_init ( App $a ) { $a -> theme_info = array (); $a -> set_template_engine ( 'smarty3' ); } Here we have set the basic theme information, in this case they are empty. But the array needs to be set. And we have set the template engine that should be used by friendica for this theme. At the moment you should use the smarty3 engine. There once was a friendica specific templating engine as well but that is not used anymore. If you like to use another templating engine, please implement it. When you want to inherit stuff from another theme you have to announce this in the theme_info: $a->setThemeInfoValue('extends', 'duepuntozero'); which declares duepuntozero as parent of the theme. If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file. To do so, add something alike DI::page()['htmlhead'] .= <<< EOT /* stuff you want to add to the header */ EOT; The $a variable holds the friendica application. So you can access the properties of this friendica session from the theme.php file as well.","title":"theme.php"},{"location":"de/developer/themes/#defaultphp","text":"This file covers the structure of the underlying HTML layout. The default file is in /view/default.php if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory. As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.","title":"default.php"},{"location":"de/developer/translations/","tags":["developer","translations"],"text":"Friendica translations # Overview # The Friendica translation process is based on gettext PO files. Basic workflow: 1. xgettext is used to collect translation strings across the project in the authoritative PO file located in view/lang/C/messages.po . 2. This file makes translations strings available at the Transifex Friendica page . 3. The translation itself is done at Transifex by volunteers. 4. The resulting PO files by languages are manually updated in view/lang/<language>/messages.po . 5. PO files are converted to PHP arrays in view/lang/<language>/strings.php that are ultimately used by Friendica to display the translations. Translate Friendica in your favorite language # Thank you for your interest in improving Friendica's translation! Please register a free Transifex account and ask over at the Transifex Friendica page to join the translation team for your favorite language. As a rule of thumb, we add support for a language in Friendica when at least 50% of the strings have been translated to avoid a scattered experience. For addons, we add support for a language when if we already support the language in Friendica. Add new translation strings # Core # Once you have added new translation strings in your code changes, please run bin/run_xgettext.sh from the base Friendica directory and commit the updated view/lang/C/messages.po to your branch. Addon # If you have the friendica-addons repository in the addon directory of your Friendica cloned repository, just run bin/run_xgettext.sh -a <addon_name> from the base Friendica directory. Otherwise: cd /path/to/friendica-addons/<addon_name> /path/to/friendica/bin/run_xgettext.sh -s In either case, you need to commit the updated <addon_name>/lang/C/messages.po to your working branch. Update translations from Transifex # Please download the Transifex file \"for use\" in view/lang/<language>/messages.po . Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch. Using the Transifex client # Transifex has a client program which allows you to sync files between your cloned Friendica repository and Transifex. Help for the client can be found at the Transifex Help Center . Here we will only cover basic usage. After installation of the client, you should have a tx command available on your system. To use it, first create a configuration file with your credentials. On Linux this file should be placed into your home directory ~/.transifexrc . The content of the file should be something like the following: [https://www.transifex.com] username = user token = password = p@ssw0rd hostname = https://www.transifex.com Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository in .tx/config . To update the PO files after you have translated strings of e.g. Esperanto on the Transifex website you can use tx to download the updated PO-file in the right location. tx pull -l eo Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch. Translation functions usage # Basic usage # Friendica\\DI::l10n()->t('Label') => Label Friendica\\DI::l10n()->t('Label %s', 'test') => Label test Plural # Friendica\\DI::l10n()->tt('Label', 'Labels', 1) => Label Friendica\\DI::l10n()->tt('Label', 'Labels', 3) => Labels Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 1) => 1 Label Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 3) => 3 Labels Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 1, 'test', 'test2') => Label test test2 Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 3, 'test', 'test2') => Labels test test2","title":"Translations"},{"location":"de/developer/translations/#friendica-translations","text":"","title":"Friendica translations"},{"location":"de/developer/translations/#overview","text":"The Friendica translation process is based on gettext PO files. Basic workflow: 1. xgettext is used to collect translation strings across the project in the authoritative PO file located in view/lang/C/messages.po . 2. This file makes translations strings available at the Transifex Friendica page . 3. The translation itself is done at Transifex by volunteers. 4. The resulting PO files by languages are manually updated in view/lang/<language>/messages.po . 5. PO files are converted to PHP arrays in view/lang/<language>/strings.php that are ultimately used by Friendica to display the translations.","title":"Overview"},{"location":"de/developer/translations/#translate-friendica-in-your-favorite-language","text":"Thank you for your interest in improving Friendica's translation! Please register a free Transifex account and ask over at the Transifex Friendica page to join the translation team for your favorite language. As a rule of thumb, we add support for a language in Friendica when at least 50% of the strings have been translated to avoid a scattered experience. For addons, we add support for a language when if we already support the language in Friendica.","title":"Translate Friendica in your favorite language"},{"location":"de/developer/translations/#add-new-translation-strings","text":"","title":"Add new translation strings"},{"location":"de/developer/translations/#core","text":"Once you have added new translation strings in your code changes, please run bin/run_xgettext.sh from the base Friendica directory and commit the updated view/lang/C/messages.po to your branch.","title":"Core"},{"location":"de/developer/translations/#addon","text":"If you have the friendica-addons repository in the addon directory of your Friendica cloned repository, just run bin/run_xgettext.sh -a <addon_name> from the base Friendica directory. Otherwise: cd /path/to/friendica-addons/<addon_name> /path/to/friendica/bin/run_xgettext.sh -s In either case, you need to commit the updated <addon_name>/lang/C/messages.po to your working branch.","title":"Addon"},{"location":"de/developer/translations/#update-translations-from-transifex","text":"Please download the Transifex file \"for use\" in view/lang/<language>/messages.po . Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch.","title":"Update translations from Transifex"},{"location":"de/developer/translations/#using-the-transifex-client","text":"Transifex has a client program which allows you to sync files between your cloned Friendica repository and Transifex. Help for the client can be found at the Transifex Help Center . Here we will only cover basic usage. After installation of the client, you should have a tx command available on your system. To use it, first create a configuration file with your credentials. On Linux this file should be placed into your home directory ~/.transifexrc . The content of the file should be something like the following: [https://www.transifex.com] username = user token = password = p@ssw0rd hostname = https://www.transifex.com Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository in .tx/config . To update the PO files after you have translated strings of e.g. Esperanto on the Transifex website you can use tx to download the updated PO-file in the right location. tx pull -l eo Then run bin/console po2php view/lang/<language>/messages.po to update the related strings.php file and commit both files to your working branch.","title":"Using the Transifex client"},{"location":"de/developer/translations/#translation-functions-usage","text":"","title":"Translation functions usage"},{"location":"de/developer/translations/#basic-usage","text":"Friendica\\DI::l10n()->t('Label') => Label Friendica\\DI::l10n()->t('Label %s', 'test') => Label test","title":"Basic usage"},{"location":"de/developer/translations/#plural","text":"Friendica\\DI::l10n()->tt('Label', 'Labels', 1) => Label Friendica\\DI::l10n()->tt('Label', 'Labels', 3) => Labels Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 1) => 1 Label Friendica\\DI::l10n()->tt('%d Label', '%d Labels', 3) => 3 Labels Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 1, 'test', 'test2') => Label test test2 Friendica\\DI::l10n()->tt('%d Label', 'Labels %2%s %3%s', 3, 'test', 'test2') => Labels test test2","title":"Plural"},{"location":"de/developer/vagrant/","tags":["developer","testing"],"text":"Vagrant for Friendica Developers # Getting started # Vagrant is a virtualization solution for developers. No need to set up a webserver, database etc. before actually starting. Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica. It brings a Debian Bullseye with PHP 7.4 and MariaDB 10.5.11. What you need to do: Install VirtualBox and vagrant. Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. Git clone your Friendica repository. Inside, you'll find a Vagrantfile and some scripts in the bin/dev folder. Pull the PHP requirements with bin/composer install . Run vagrant up from inside the friendica clone. This will start the virtual machine. Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. Run vagrant ssh to log into the virtual machine to log in to the VM in case you need to debug something on the server. Open you test installation in a browser. Go to friendica.local (or 192.168.22.10). friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page. The mysql database is called \"friendica\", the mysql user and password both are \"friendica\". Work on Friendica's code in your git clone on your machine (not in the VM). Your local working directory is set up as a shared directory with the VM (/vagrant). Check the changes in your browser in the VM. Find the Friendica log file /vagrant/logfile.out on the VM or in the logfile.out in you local Friendica directory. Commit and push your changes directly back to GitHub. If you want to stop vagrant after finishing your work, run the following command vagrant halt in the development directory. This will not delete the virtual machine. 9. To ultimately delete the virtual machine run vagrant destroy rm /vagrant/config/local.config.php to make sure that you can start from scratch with another \"vagrant up\". Default User Accounts # By default, the provision script will set up two user accounts. admin, password admin friendica, password friendica Trouble Shooting # If you see a version mismatch for the VirtualBox Guest Additions between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. Stack Overflow ). Stop the Vagrant VM and run the following command: vagrant plugin install vagrant-vbguest On the next Vagrant up, the version problem should be fixed. If friendica.local is not resolved, you may need to add an entry to the /etc/hosts file (or similar configuration depending on the OS you are using). For further documentation of vagrant, please see the vagrant docs .","title":"Vagrant"},{"location":"de/developer/vagrant/#vagrant-for-friendica-developers","text":"","title":"Vagrant for Friendica Developers"},{"location":"de/developer/vagrant/#getting-started","text":"Vagrant is a virtualization solution for developers. No need to set up a webserver, database etc. before actually starting. Vagrant creates a virtual machine for you that you can just run inside VirtualBox and start to work directly on Friendica. It brings a Debian Bullseye with PHP 7.4 and MariaDB 10.5.11. What you need to do: Install VirtualBox and vagrant. Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html. Git clone your Friendica repository. Inside, you'll find a Vagrantfile and some scripts in the bin/dev folder. Pull the PHP requirements with bin/composer install . Run vagrant up from inside the friendica clone. This will start the virtual machine. Be patient: When it runs for the first time, it downloads a Debian Server image and installs Friendica. Run vagrant ssh to log into the virtual machine to log in to the VM in case you need to debug something on the server. Open you test installation in a browser. Go to friendica.local (or 192.168.22.10). friendica.local is using a self-signed TLS certificate, so you will need to add an exception to trust the certificate the first time you are visiting the page. The mysql database is called \"friendica\", the mysql user and password both are \"friendica\". Work on Friendica's code in your git clone on your machine (not in the VM). Your local working directory is set up as a shared directory with the VM (/vagrant). Check the changes in your browser in the VM. Find the Friendica log file /vagrant/logfile.out on the VM or in the logfile.out in you local Friendica directory. Commit and push your changes directly back to GitHub. If you want to stop vagrant after finishing your work, run the following command vagrant halt in the development directory. This will not delete the virtual machine. 9. To ultimately delete the virtual machine run vagrant destroy rm /vagrant/config/local.config.php to make sure that you can start from scratch with another \"vagrant up\".","title":"Getting started"},{"location":"de/developer/vagrant/#default-user-accounts","text":"By default, the provision script will set up two user accounts. admin, password admin friendica, password friendica","title":"Default User Accounts"},{"location":"de/developer/vagrant/#trouble-shooting","text":"If you see a version mismatch for the VirtualBox Guest Additions between host and guest during the initial setup of the Vagrant VM, you will need to install an addon to Vagrant (ref. Stack Overflow ). Stop the Vagrant VM and run the following command: vagrant plugin install vagrant-vbguest On the next Vagrant up, the version problem should be fixed. If friendica.local is not resolved, you may need to add an entry to the /etc/hosts file (or similar configuration depending on the OS you are using). For further documentation of vagrant, please see the vagrant docs .","title":"Trouble Shooting"},{"location":"de/spec/api/","tags":["specification","api"],"text":"Using the APIs # Friendica offers multiple API endpoints to interface with third-party applications: Twitter Mastodon Friendica-specific GNU Social Usage # HTTP Method # API endpoints can restrict the HTTP method used to request them. Using an invalid method results in HTTP error 405 \"Method Not Allowed\". Authentication # Friendica supports basic HTTP Auth and OAuth to authenticate the user to the APIs. Errors # When an error occurs in API call, an HTTP error code is returned, with an error message Usually: 400 Bad Request: if parameters are missing or items can't be found 403 Forbidden: if the authenticated user is missing 405 Method Not Allowed: if API was called with an invalid method, e.g. GET when API require POST 501 Not Implemented: if the requested API doesn't exist 500 Internal Server Error: on other error conditions Error body is json: { \"error\" : \"Specific error message\" , \"request\" : \"API path requested\" , \"code\" : \"HTTP error code\" } xml: <status> <error> Specific error message </error> <request> API path requested </request> <code> HTTP error code </code> </status> Usage Examples # BASH / cURL # /usr/bin/curl -u USER:PASS https://YOUR.FRIENDICA.TLD/api/statuses/update.xml -d source = \"some source id\" -d status = \"the status you want to post\" Python # The RSStoFriendika code can be used as an example of how to use the API with python. The lines for posting are located at line 21 and following. def tweet(server, message, group_allow=None): url = server + '/api/statuses/update' urllib2.urlopen(url, urllib.urlencode({'status': message,'group_allow[]':group_allow}, doseq=True)) There is also a module for python 3 for using the API.","title":"Usage"},{"location":"de/spec/api/#using-the-apis","text":"Friendica offers multiple API endpoints to interface with third-party applications: Twitter Mastodon Friendica-specific GNU Social","title":"Using the APIs"},{"location":"de/spec/api/#usage","text":"","title":"Usage"},{"location":"de/spec/api/#http-method","text":"API endpoints can restrict the HTTP method used to request them. Using an invalid method results in HTTP error 405 \"Method Not Allowed\".","title":"HTTP Method"},{"location":"de/spec/api/#authentication","text":"Friendica supports basic HTTP Auth and OAuth to authenticate the user to the APIs.","title":"Authentication"},{"location":"de/spec/api/#errors","text":"When an error occurs in API call, an HTTP error code is returned, with an error message Usually: 400 Bad Request: if parameters are missing or items can't be found 403 Forbidden: if the authenticated user is missing 405 Method Not Allowed: if API was called with an invalid method, e.g. GET when API require POST 501 Not Implemented: if the requested API doesn't exist 500 Internal Server Error: on other error conditions Error body is json: { \"error\" : \"Specific error message\" , \"request\" : \"API path requested\" , \"code\" : \"HTTP error code\" } xml: <status> <error> Specific error message </error> <request> API path requested </request> <code> HTTP error code </code> </status>","title":"Errors"},{"location":"de/spec/api/#usage-examples","text":"","title":"Usage Examples"},{"location":"de/spec/api/#bash-curl","text":"/usr/bin/curl -u USER:PASS https://YOUR.FRIENDICA.TLD/api/statuses/update.xml -d source = \"some source id\" -d status = \"the status you want to post\"","title":"BASH / cURL"},{"location":"de/spec/api/#python","text":"The RSStoFriendika code can be used as an example of how to use the API with python. The lines for posting are located at line 21 and following. def tweet(server, message, group_allow=None): url = server + '/api/statuses/update' urllib2.urlopen(url, urllib.urlencode({'status': message,'group_allow[]':group_allow}, doseq=True)) There is also a module for python 3 for using the API.","title":"Python"},{"location":"de/spec/api/entities/","tags":["specification","api","entities"],"text":"Friendica API entities # Activities # Attribute Type Nullable like List of [Contacts](./entities.md#contact) No dislike List of [Contacts](./entities.md#contact) No attendyes List of [Contacts](./entities.md#contact) No attendno List of [Contacts](./entities.md#contact) No attendmaybe List of [Contacts](./entities.md#contact) No Attachment # Attribute Type Nullable url String (URL) No mimetype String No size Integer (bytes) No Contact # Attribute Type Nullable id Integer No id_str String No name String No screen_name String No location String No description String No profile_image_url String (URL) No profile_image_url_https String (URL) No profile_image_url_profile_size String (URL) No profile_image_url_large String (URL) No url String (URL) No protected Boolean No followers_count Integer No friends_count Integer No listed_count Integer No favourites_count Integer No statuses_count Integer No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No utc_offset Integer No time_zone String No geo_enabled Boolean No verified Boolean No lang String No contributors_enabled Boolean No is_translator Boolean No is_translation_enabled Boolean No following Boolean No follow_request_sent Boolean No statusnet_blocking Boolean No notifications Boolean No statusnet_profile_url String (URL) No uid Integer No cid Integer No pid Integer No self Integer No network String No Entities # Attribute Type Nullable hashtags List of [Hashtags](./entities.md#hashtag) No symbols List of [Symbols](./entities.md#symbol) No urls List of [URLs](./entities.md#url) No user_mentions List of [User mentions](./entities.md#user+mention) No media List of [Medias](./entities.md#media) No Event # Attribute Type Description id Integer uid Integer Owner User Id cid Integer Target Contact Id uri String Item unique URI string name String (Plaintext) Title desc String (HTML) Description startTime String (UTC YYYY-MM-DD HH:II:SS) ) endTime String (UTC YYYY-MM-DD HH:II:SS) ) Optional (null date is 0001-01-01 00:00:00 type String ( event or birthday ) nofinish Boolean Ongoing event place String Optional. Location. ignore Boolean ??? allow_cid String (angle-brackets escaped integers) Optional. List of allowed contact ids allow_gid String (angle-brackets escaped integers) Optional. List of allowed group ids deny_cid String (angle-brackets escaped integers) Optional. List of disallowed contact ids deny_gid String (angle-brackets escaped integers) Optional. List of disallowed group ids Hashtag # Unused Item # Attribute Type Nullable text String (Plaintext) No truncated Boolean No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No in_reply_to_status_id Integer No in_reply_to_status_id_str String No source String No id Integer No id_str String No in_reply_to_user_id Integer No in_reply_to_user_id_str String No in_reply_to_screen_name String No geo String Yes favorited Boolean No user [Contact](./entities.md#contact) No friendica_author [Contact](./entities.md#contact) No friendica_owner [Contact](./entities.md#contact) No friendica_private Boolean No statusnet_html String (HTML) No statusnet_conversation_id Integer No external_url String (URL) No friendica_activities [Activities](./entities.md#activities) No friendica_title String (Plaintext) No friendica_html String (HTML) No attachments List of [Attachments](./entities.md#attachment) Yes entities [Entities](./entities.md#entities) Yes Media # Identical to the Twitter Media Object . Attribute Type Nullable id Integer No id_str String No indices List of Integer No media_url String (URL) No media_url_https String (URL) No url String (URL) No display_url String (URL) No expanded_url String (URL) No ext_alt_text String No type String No sizes [Sizes](./entities.md#sizes) No Notification # Attribute Type Description id Integer hash String type Integer 1: Inbound follow request 2: Outbound follow request confirmation 4: Wall-to-wall post 8: Reply 16: Private message 32: Friend suggestion 64: Unused 128: Mention 256: Tag added to a post 512: Poke 1024: New post 16384: System email 32768: System event name String Full name of the contact subject url String (URL) Profile page URL of the contact subject photo String (URL) Profile photo URL of the contact subject date String (Date) YYYY-MM-DD hh:mm:ss local server time msg String (BBCode) uid Integer Owner User Id link String (URL) Notification URL iid Integer Item Id parent Integer Parent Item Id seen Integer (Boolean) Whether the notification was read or not. verb String (URL) [Activity Streams](http://activitystrea.ms) Verb URL seen Integer (Boolean) Whether the notification was read or not. otype Enum Subject type (`item`, `intro` or `mail`) name_cache String (HTML) Full name of the contact subject msg_cache String (Plaintext) Plaintext version of the notification text with a placeholder (`{0}`) for the subject contact's name. timestamp Integer Unix timestamp date_rel String Time since the note was posted, eg \"1 hour ago\" msg_html String (HTML) msg_plain String (Plaintext) Photo # Attribute Type Description id String Resource ID (32 hex chars) created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS title String desc String (Plaintext) Picture caption album String Album name filename String Original image filename type String MIME Type height Integer Image height in pixels width Integer Image width in pixels profile Integer 1 if it is a profile photo allow_cid String (ACL) List of contact ids wrapped in angle brackets allowed to access the photo. allow_gid String (ACL) List of contact group ids wrapped in angle brackets allowed to access the photo. deny_cid String (ACL) List of contact ids wrapped in angle brackets forbidden to access the photo. deny_gid String (ACL) List of contact group ids wrapped in angle brackets forbidden to access the photo. link Array of Strings (URL) URLs to the different scales indexed by scale number if no specific scale was requested. Mutually exclusive with data datasize . datasize Integer Picture size in bytes if a single scale was requested. Mutually exclusive with link . data String Base64-encoded image data if a single scale was requested. Mutually exclusive with link . friendica_activities [Activities](./entities.md#activities) friendica_comments List of [Items](./entities.md#item) rights_mismatch Boolean True if the ACL differs between the picture and the associated item. Photo List Item # Attribute Type Description id String Resource ID (32 hex chars) album String Album name filename String Original image filename type String MIME Type created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS desc String (Plaintext) Picture caption thumb String (URL) URL of the smallest scale version of the picture. Private message # Attribute Type Description id Integer sender_id Integer Sender Contact Id text String Can be HTML or plaintext depending on the API call parameter `getText`. recipient_id Integer Recipient Contact Id created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 sender_screen_name String recipient_screen_name String sender [Contact](./entities.md#contact) recipient [Contact](./entities.md#contact) title String Empty if the API call parameter `getText` is empty or absent. friendica_seen Integer (Boolean) Whether the private message has been read or not. friendica_parent_uri String Profile # Attribute Type Description profile_id Integer profile_name String is_default Boolean hide_friends Boolean Whether the user chose to hide their contact list on their profile. profile_photo String (URL) Largest size profile picture URL. profile_thumb String (URL) Smallest size profile picture URL. publish Boolean Whether the user chose to publish their profile in the local directory. net_publish Boolean Whether the user chose to publish their profile in the global directory. description String date_of_birth String address String city String region String postal_code String country String public_keywords String Comma-separated list of words meant to be displayed as hashtags. private_keywords String Comma-separated list of words meant to be used for search only. homepage String (URL) Size # Attribute Type Nullable Attribute Type Nullable w Integer No h Integer No resize Enum (fit, crop) Yes ## Sizes Attribute Type Nullable medium [Size](./entities.md#size) No large [Size](./entities.md#size) Yes thumb [Size](./entities.md#size) Yes small [Size](./entities.md#size) Yes ## Symbol Unused ## URL Attribute Type Nullable url String (URL) No expanded_url String (URL) No display_url String (URL) No indices List of Integer No ## User Mention Unused","title":"Entities"},{"location":"de/spec/api/entities/#friendica-api-entities","text":"","title":"Friendica API entities"},{"location":"de/spec/api/entities/#activities","text":"Attribute Type Nullable like List of [Contacts](./entities.md#contact) No dislike List of [Contacts](./entities.md#contact) No attendyes List of [Contacts](./entities.md#contact) No attendno List of [Contacts](./entities.md#contact) No attendmaybe List of [Contacts](./entities.md#contact) No","title":"Activities"},{"location":"de/spec/api/entities/#attachment","text":"Attribute Type Nullable url String (URL) No mimetype String No size Integer (bytes) No","title":"Attachment"},{"location":"de/spec/api/entities/#contact","text":"Attribute Type Nullable id Integer No id_str String No name String No screen_name String No location String No description String No profile_image_url String (URL) No profile_image_url_https String (URL) No profile_image_url_profile_size String (URL) No profile_image_url_large String (URL) No url String (URL) No protected Boolean No followers_count Integer No friends_count Integer No listed_count Integer No favourites_count Integer No statuses_count Integer No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No utc_offset Integer No time_zone String No geo_enabled Boolean No verified Boolean No lang String No contributors_enabled Boolean No is_translator Boolean No is_translation_enabled Boolean No following Boolean No follow_request_sent Boolean No statusnet_blocking Boolean No notifications Boolean No statusnet_profile_url String (URL) No uid Integer No cid Integer No pid Integer No self Integer No network String No","title":"Contact"},{"location":"de/spec/api/entities/#entities","text":"Attribute Type Nullable hashtags List of [Hashtags](./entities.md#hashtag) No symbols List of [Symbols](./entities.md#symbol) No urls List of [URLs](./entities.md#url) No user_mentions List of [User mentions](./entities.md#user+mention) No media List of [Medias](./entities.md#media) No","title":"Entities"},{"location":"de/spec/api/entities/#event","text":"Attribute Type Description id Integer uid Integer Owner User Id cid Integer Target Contact Id uri String Item unique URI string name String (Plaintext) Title desc String (HTML) Description startTime String (UTC YYYY-MM-DD HH:II:SS) ) endTime String (UTC YYYY-MM-DD HH:II:SS) ) Optional (null date is 0001-01-01 00:00:00 type String ( event or birthday ) nofinish Boolean Ongoing event place String Optional. Location. ignore Boolean ??? allow_cid String (angle-brackets escaped integers) Optional. List of allowed contact ids allow_gid String (angle-brackets escaped integers) Optional. List of allowed group ids deny_cid String (angle-brackets escaped integers) Optional. List of disallowed contact ids deny_gid String (angle-brackets escaped integers) Optional. List of disallowed group ids","title":"Event"},{"location":"de/spec/api/entities/#hashtag","text":"Unused","title":"Hashtag"},{"location":"de/spec/api/entities/#item","text":"Attribute Type Nullable text String (Plaintext) No truncated Boolean No created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 No in_reply_to_status_id Integer No in_reply_to_status_id_str String No source String No id Integer No id_str String No in_reply_to_user_id Integer No in_reply_to_user_id_str String No in_reply_to_screen_name String No geo String Yes favorited Boolean No user [Contact](./entities.md#contact) No friendica_author [Contact](./entities.md#contact) No friendica_owner [Contact](./entities.md#contact) No friendica_private Boolean No statusnet_html String (HTML) No statusnet_conversation_id Integer No external_url String (URL) No friendica_activities [Activities](./entities.md#activities) No friendica_title String (Plaintext) No friendica_html String (HTML) No attachments List of [Attachments](./entities.md#attachment) Yes entities [Entities](./entities.md#entities) Yes","title":"Item"},{"location":"de/spec/api/entities/#media","text":"Identical to the Twitter Media Object . Attribute Type Nullable id Integer No id_str String No indices List of Integer No media_url String (URL) No media_url_https String (URL) No url String (URL) No display_url String (URL) No expanded_url String (URL) No ext_alt_text String No type String No sizes [Sizes](./entities.md#sizes) No","title":"Media"},{"location":"de/spec/api/entities/#notification","text":"Attribute Type Description id Integer hash String type Integer 1: Inbound follow request 2: Outbound follow request confirmation 4: Wall-to-wall post 8: Reply 16: Private message 32: Friend suggestion 64: Unused 128: Mention 256: Tag added to a post 512: Poke 1024: New post 16384: System email 32768: System event name String Full name of the contact subject url String (URL) Profile page URL of the contact subject photo String (URL) Profile photo URL of the contact subject date String (Date) YYYY-MM-DD hh:mm:ss local server time msg String (BBCode) uid Integer Owner User Id link String (URL) Notification URL iid Integer Item Id parent Integer Parent Item Id seen Integer (Boolean) Whether the notification was read or not. verb String (URL) [Activity Streams](http://activitystrea.ms) Verb URL seen Integer (Boolean) Whether the notification was read or not. otype Enum Subject type (`item`, `intro` or `mail`) name_cache String (HTML) Full name of the contact subject msg_cache String (Plaintext) Plaintext version of the notification text with a placeholder (`{0}`) for the subject contact's name. timestamp Integer Unix timestamp date_rel String Time since the note was posted, eg \"1 hour ago\" msg_html String (HTML) msg_plain String (Plaintext)","title":"Notification"},{"location":"de/spec/api/entities/#photo","text":"Attribute Type Description id String Resource ID (32 hex chars) created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS title String desc String (Plaintext) Picture caption album String Album name filename String Original image filename type String MIME Type height Integer Image height in pixels width Integer Image width in pixels profile Integer 1 if it is a profile photo allow_cid String (ACL) List of contact ids wrapped in angle brackets allowed to access the photo. allow_gid String (ACL) List of contact group ids wrapped in angle brackets allowed to access the photo. deny_cid String (ACL) List of contact ids wrapped in angle brackets forbidden to access the photo. deny_gid String (ACL) List of contact group ids wrapped in angle brackets forbidden to access the photo. link Array of Strings (URL) URLs to the different scales indexed by scale number if no specific scale was requested. Mutually exclusive with data datasize . datasize Integer Picture size in bytes if a single scale was requested. Mutually exclusive with link . data String Base64-encoded image data if a single scale was requested. Mutually exclusive with link . friendica_activities [Activities](./entities.md#activities) friendica_comments List of [Items](./entities.md#item) rights_mismatch Boolean True if the ACL differs between the picture and the associated item.","title":"Photo"},{"location":"de/spec/api/entities/#photo-list-item","text":"Attribute Type Description id String Resource ID (32 hex chars) album String Album name filename String Original image filename type String MIME Type created String (Date) Format YYYY-MM-DD HH:MM:SS edited String (Date) Format YYYY-MM-DD HH:MM:SS desc String (Plaintext) Picture caption thumb String (URL) URL of the smallest scale version of the picture.","title":"Photo List Item"},{"location":"de/spec/api/entities/#private-message","text":"Attribute Type Description id Integer sender_id Integer Sender Contact Id text String Can be HTML or plaintext depending on the API call parameter `getText`. recipient_id Integer Recipient Contact Id created_at String (Date) Ex: Wed May 23 06:01:13 +0000 2007 sender_screen_name String recipient_screen_name String sender [Contact](./entities.md#contact) recipient [Contact](./entities.md#contact) title String Empty if the API call parameter `getText` is empty or absent. friendica_seen Integer (Boolean) Whether the private message has been read or not. friendica_parent_uri String","title":"Private message"},{"location":"de/spec/api/entities/#profile","text":"Attribute Type Description profile_id Integer profile_name String is_default Boolean hide_friends Boolean Whether the user chose to hide their contact list on their profile. profile_photo String (URL) Largest size profile picture URL. profile_thumb String (URL) Smallest size profile picture URL. publish Boolean Whether the user chose to publish their profile in the local directory. net_publish Boolean Whether the user chose to publish their profile in the global directory. description String date_of_birth String address String city String region String postal_code String country String public_keywords String Comma-separated list of words meant to be displayed as hashtags. private_keywords String Comma-separated list of words meant to be used for search only. homepage String (URL)","title":"Profile"},{"location":"de/spec/api/entities/#size","text":"Attribute Type Nullable Attribute Type Nullable w Integer No h Integer No resize Enum (fit, crop) Yes ## Sizes Attribute Type Nullable medium [Size](./entities.md#size) No large [Size](./entities.md#size) Yes thumb [Size](./entities.md#size) Yes small [Size](./entities.md#size) Yes ## Symbol Unused ## URL Attribute Type Nullable url String (URL) No expanded_url String (URL) No display_url String (URL) No indices List of Integer No ## User Mention Unused","title":"Size"},{"location":"de/spec/api/friendica/","tags":["specification","api"],"text":"Friendica API # Overview # Friendica provides the following specific endpoints. Authentication is the same as described in Using the APIs . Entities # These endpoints use the Friendica API entities . Endpoints # GET api/friendica/events # Returns a list of Event entities for the current logged-in user. Parameters # since_id : (optional) minimum event id for pagination count : maximum number of items returned, default 20 GET api/externalprofile/show # Returns a Contact entity for the provided profile URL. Parameters # profileurl : Profile URL GET api/statuses/public_timeline # Returns a list of public Items posted on this node. Equivalent of the local community page. Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false) Unsupported parameters # trim_user GET api/statuses/networkpublic_timeline # Returns a list of public Items this node is aware of. Equivalent of the global community page. Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false) GET api/statuses/replies # Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false) Unsupported parameters # include_rts trim_user contributor_details GET api/conversation/show # Unofficial Twitter command. It shows all direct answers (excluding the original post) to a given id. Parameters # id : id of the post count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false) Unsupported parameters # include_rts trim_user contributor_details GET api/statusnet/conversation # Alias of api/conversation/show . GET api/statusnet/config # Returns the public Friendica node configuration. GET api/gnusocial/config # Alias of api/statusnet/config . GET api/statusnet/version # Returns a fake static StatusNet protocol version. GET api/gnusocial/version # Alias of api/statusnet/version . POST api/friendica/activity/[verb] # Add or remove an activity from an item. 'verb' can be one of: like dislike attendyes attendno attendmaybe To remove an activity, prepend the verb with \"un\", eg. \"unlike\" or \"undislike\" Attend verbs disable eachother: that means that if \"attendyes\" was added to an item, adding \"attendno\" remove previous \"attendyes\". Attend verbs should be used only with event-related items (there is no check at the moment). Parameters # id : item id Return values # On success: json: \"ok\" xml: <ok>true</ok> On error: HTTP 400 BadRequest GET api/direct_messages # Deprecated Twitter received direct message list endpoint. Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\") Unsupported parameters # skip_status GET api/direct_messages/all # Returns all Private Messages . Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" friendica_verbose : \"true\" enables different error returns (default: \"false\") GET api/direct_messages/conversation # Returns all replies of a single private message conversation. Returns Private Messages Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" uri : URI of the conversation friendica_verbose : \"true\" enables different error returns (default: \"false\") GET api/direct_messages/sent # Deprecated Twitter sent direct message list endpoint. Returns Private Messages . Parameters # count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\") POST api/direct_messages/new # Deprecated Twitter direct message submission endpoint. Parameters # user_id : id of the user screen_name : screen name (for technical reasons, this value is not unique!) text : The message replyto : ID of the replied direct message title : Title of the direct message POST api/direct_messages/destroy # Deprecated Twitter direct message deletion endpoint. Parameters # id : id of the message to be deleted include_entities : optional, currently not yet implemented friendica_parenturi : optional, can be used for increased safety to delete only intended messages friendica_verbose : \"true\" enables different error returns (default: \"false\") Return values # On success: JSON return as defined for Twitter API not yet implemented on friendica_verbose=true: JSON return {\"result\":\"ok\",\"message\":\"message deleted\"} On error: HTTP 400 BadRequest on friendica_verbose=true: different JSON returns {\"result\":\"error\",\"message\":\"xyz\"} GET api/friendica/direct_messages_setseen # Parameters # id : id of the message to be updated as seen Return values # On success: JSON return {\"result\": \"ok\", \"message\": \"message set to seen\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"xyz\"} GET api/friendica/direct_messages_search (GET; AUTH) # Returns Private Messages matching the provided search string. Parameters # searchstring : string for which the API call should search as '%searchstring%' in field 'body' of all messages of the authenticated user (caption ignored) getText (optional): plain | html If ommited, the title is prepended to the plaintext body in the text attribute of the private message objects. getUserObjects (optional): true | false If false , the sender and recipient attributes of the private message object are absent. Return values # Returns only tested with JSON, XML might work as well. On success: JSON return {\"success\":\"true\", \"search_results\": array of found messages} JSOn return {\"success\":\"false\", \"search_results\": \"nothing found\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"searchstring not specified\"} GET api/friendica/group_show # Return all or a specified group of the user with the containing contacts as array. Parameters # gid : optional, if not given, API returns all groups of the user Return values # Array of: name : name of the group gid : id of the group user : array of Contacts POST api/friendica/group_create # Create the group with the posted array of contacts as members. Parameters # name : name of the group to be created POST data # JSON data as Array like the result of GET api/friendica/group_show : gid name List of Contacts Return values # Array of: success : true if successfully created or reactivated gid : gid of the created group name : name of the created group status : \"missing user\" | \"reactivated\" | \"ok\" wrong users : array of users, which were not available in the contact table POST api/friendica/group_update # Update the group with the posted array of contacts as members (post all members of the group to the call; function will remove members not posted). Parameters # gid : id of the group to be changed name : name of the group to be changed POST data # JSON data as array like the result of GET api/friendica/group_show : gid name List of Contacts Return values # Array of: success : true if successfully updated gid : gid of the changed group name : name of the changed group status : \"missing user\" | \"ok\" wrong users : array of users, which were not available in the contact table POST api/friendica/group_delete # Delete the specified group of contacts; API call need to include the correct gid AND name of the group to be deleted. Parameters # gid : id of the group to be deleted name : name of the group to be deleted Return values # Array of: success : true if successfully deleted gid : gid of the deleted group name : name of the deleted group status : \"deleted\" if successfully deleted wrong users : empty array GET api/friendica/notifications # Return last 50 Notifications for the current user, ordered by date with unseen item on top. Parameters # none POST api/friendica/notifications/seen # Set notification as seen. Parameters # id : id of the notification to set seen Return values # If the note is linked to an item, returns an Item . Otherwise, a success status is returned: success (json) | <status>success</status> (xml) GET api/friendica/photo # Returns a Photo . Parameters # photo_id : Resource id of a photo. scale : (optional) scale value of the photo Returns data of a picture with the given resource. If 'scale' isn't provided, returned data include full url to each scale of the photo. If 'scale' is set, returned data include image data base64 encoded. possibile scale value are: 0: original or max size by server settings 1: image with or height at <= 640 2: image with or height at <= 320 3: thumbnail 160x160 4: Profile image at 300x300 5: Profile image at 80x80 6: Profile image at 48x48 An image used as profile image has only scaled 4-6, other images only 0-3 Return values # json: { \"id\" : \"photo id\" , \"created\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"edited\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"title\" : \"photo title\" , \"desc\" : \"photo description\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"mime type\" , \"height\" : \"number\" , \"width\" : \"number\" , \"profile\" : \"1 if is profile photo\" , \"link\" : { \"<scale>\" : \"url to image\" , ... }, // if 'scale' is set \"datasize\" : \"size in byte\" , \"data\" : \"base64 encoded image data\" } xml: <photo> <id> photo id </id> <created> date(YYYY-MM-DD HH:MM:SS) </created> <edited> date(YYYY-MM-DD HH:MM:SS) </edited> <title> photo title </title> <desc> photo description </desc> <album> album name </album> <filename> original file name </filename> <type> mime type </type> <height> number </height> <width> number </width> <profile> 1 if is profile photo </profile> <links type= \"array\" > <link type= \"mime type\" scale= \"scale number\" href= \"image url\" /> ... </links> </photo> GET api/friendica/photos/list # Returns the API user's Photo List Items . Return values # json: [ { \"id\" : \"resource_id\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"image mime type\" , \"thumb\" : \"url to thumb sized image\" }, ... ] xml: <photos type= \"array\" > <photo id= \"resource_id\" album= \"album name\" filename= \"original file name\" type= \"image mime type\" > \"url to thumb sized image\" </photo> ... </photos> POST api/friendica/photo/create # Alias of api/friendica/photo/update POST api/friendica/photo/update # Saves data for the scales 0-2 to database (see above for scale description). Call adds non-public entries to items table to enable authenticated contacts to comment/like the photo. Client should pay attention to the fact that updated access rights are not transferred to the contacts. i.e. public photos remain publicly visible if they have been commented/liked before setting visibility back to a limited group. Currently, it is best to inform user that updating rights is not the right way to do this, and offer a solution to add photo as a new photo with the new rights instead. Parameters # photo_id (optional): if specified the photo with this id will be updated media (optional): image data as base64, only optional if photo_id is specified (new upload must have media) desc (optional): description for the photo, updated when photo_id is specified album : name of the album to be deleted (always necessary) album_new (optional): can be used to change the album of a single photo if photo_id is specified allow_cid / allow_gid / deny_cid / deny_gid (optional): on create: empty string or omitting = public photo, specify in format <x><y><z> for private photo on update: keys need to be present with empty values for changing a private photo to public Return values # On success: new photo uploaded: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed photo data: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed info: JSON return {\"result\": \"updated\", \"message\":\"Image id 'xyz' has been updated.\"} photo updated - nothing changed: JSON return {\"result\": \"cancelled\",\"message\": \"Nothing to update for image id 'xyz'.\"} On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no media data submitted\", \"photo not available\", \"acl data invalid\" 500 INTERNALSERVERERROR: \"image size exceeds PHP config settings, file was rejected by server\", \"image size exceeds Friendica Config setting (uploaded size: x)\", \"unable to process image data\", \"image upload failed\", \"unknown error - uploading photo failed, see Friendica log for more information\", \"unknown error - update photo entry in database failed\", \"unknown error - this error on uploading or updating a photo should never happen\" POST api/friendica/photo/delete # Deletes a single image with the specified id, is not reversible -> ensure that client is asking user for being sure to do this Sets item table entries for this photo to deleted = 1. Parameters # photo_id : id of the photo to be deleted Return values # On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"photo with id 'xyz' has been deleted from server.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no photo_id specified\", \"photo not available\" 500 INTERNALSERVERERROR: \"unknown error on deleting photo\", \"problem with deleting items occurred\" POST api/friendica/photoalbum/delete # Deletes all images with the specified album name, is not reversible -> ensure that client is asking user for being sure to do this. Parameters # album : name of the album to be deleted Return values # On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"album 'xyz' with all containing photos has been deleted.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"problem with deleting item occured\", \"unknown error - deleting from database failed\" POST api/friendica/photoalbum/update # Changes the album name to album_new for all photos in album. Parameters # album : name of the album to be updated album_new : new name of the album Return values # On success: JSON return { \"result\" : \"updated\" , \"message\" : \"album 'abc' with all containing photos has been renamed to 'xyz'.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no new albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"unknown error - updating in database failed\" GET api/friendica/profile/show # Returns the Profile data of the authenticated user. Return values # On success: Array of: global_dir : URL of the global directory set in server settings friendica_owner : user data of the authenticated user profiles : array of the profile data On error: HTTP 403 Forbidden: when no authentication was provided HTTP 400 Bad Request: if given profile_id is not in the database or is not assigned to the authenticated user General description of profile data in API returns: - hide_friends: true if friends are hidden - profile_photo - profile_thumb - publish: true if published on the server's local directory - net_publish: true if published to global_dir - fullname - date_of_birth - description - xmpp - homepage - address - locality - region - postal_code - country - pub_keywords - custom_fields: list of public custom fields Deprecated endpoints # POST api/statuses/mediap","title":"Friendica"},{"location":"de/spec/api/friendica/#friendica-api","text":"","title":"Friendica API"},{"location":"de/spec/api/friendica/#overview","text":"Friendica provides the following specific endpoints. Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"de/spec/api/friendica/#entities","text":"These endpoints use the Friendica API entities .","title":"Entities"},{"location":"de/spec/api/friendica/#endpoints","text":"","title":"Endpoints"},{"location":"de/spec/api/friendica/#get-apifriendicaevents","text":"Returns a list of Event entities for the current logged-in user.","title":"GET api/friendica/events"},{"location":"de/spec/api/friendica/#parameters","text":"since_id : (optional) minimum event id for pagination count : maximum number of items returned, default 20","title":"Parameters"},{"location":"de/spec/api/friendica/#get-apiexternalprofileshow","text":"Returns a Contact entity for the provided profile URL.","title":"GET api/externalprofile/show"},{"location":"de/spec/api/friendica/#parameters_1","text":"profileurl : Profile URL","title":"Parameters"},{"location":"de/spec/api/friendica/#get-apistatusespublic_timeline","text":"Returns a list of public Items posted on this node. Equivalent of the local community page.","title":"GET api/statuses/public_timeline"},{"location":"de/spec/api/friendica/#parameters_2","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"de/spec/api/friendica/#unsupported-parameters","text":"trim_user","title":"Unsupported parameters"},{"location":"de/spec/api/friendica/#get-apistatusesnetworkpublic_timeline","text":"Returns a list of public Items this node is aware of. Equivalent of the global community page.","title":"GET api/statuses/networkpublic_timeline"},{"location":"de/spec/api/friendica/#parameters_3","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id exclude_replies : don't show replies (default: false) conversation_id : Shows all statuses of a given conversation. include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"de/spec/api/friendica/#get-apistatusesreplies","text":"","title":"GET api/statuses/replies"},{"location":"de/spec/api/friendica/#parameters_4","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"de/spec/api/friendica/#unsupported-parameters_1","text":"include_rts trim_user contributor_details","title":"Unsupported parameters"},{"location":"de/spec/api/friendica/#get-apiconversationshow","text":"Unofficial Twitter command. It shows all direct answers (excluding the original post) to a given id.","title":"GET api/conversation/show"},{"location":"de/spec/api/friendica/#parameters_5","text":"id : id of the post count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id include_entities : \"true\" shows entities for pictures and links (Default: false)","title":"Parameters"},{"location":"de/spec/api/friendica/#unsupported-parameters_2","text":"include_rts trim_user contributor_details","title":"Unsupported parameters"},{"location":"de/spec/api/friendica/#get-apistatusnetconversation","text":"Alias of api/conversation/show .","title":"GET api/statusnet/conversation"},{"location":"de/spec/api/friendica/#get-apistatusnetconfig","text":"Returns the public Friendica node configuration.","title":"GET api/statusnet/config"},{"location":"de/spec/api/friendica/#get-apignusocialconfig","text":"Alias of api/statusnet/config .","title":"GET api/gnusocial/config"},{"location":"de/spec/api/friendica/#get-apistatusnetversion","text":"Returns a fake static StatusNet protocol version.","title":"GET api/statusnet/version"},{"location":"de/spec/api/friendica/#get-apignusocialversion","text":"Alias of api/statusnet/version .","title":"GET api/gnusocial/version"},{"location":"de/spec/api/friendica/#post-apifriendicaactivityverb","text":"Add or remove an activity from an item. 'verb' can be one of: like dislike attendyes attendno attendmaybe To remove an activity, prepend the verb with \"un\", eg. \"unlike\" or \"undislike\" Attend verbs disable eachother: that means that if \"attendyes\" was added to an item, adding \"attendno\" remove previous \"attendyes\". Attend verbs should be used only with event-related items (there is no check at the moment).","title":"POST api/friendica/activity/[verb]"},{"location":"de/spec/api/friendica/#parameters_6","text":"id : item id","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values","text":"On success: json: \"ok\" xml: <ok>true</ok> On error: HTTP 400 BadRequest","title":"Return values"},{"location":"de/spec/api/friendica/#get-apidirect_messages","text":"Deprecated Twitter received direct message list endpoint.","title":"GET api/direct_messages"},{"location":"de/spec/api/friendica/#parameters_7","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"de/spec/api/friendica/#unsupported-parameters_3","text":"skip_status","title":"Unsupported parameters"},{"location":"de/spec/api/friendica/#get-apidirect_messagesall","text":"Returns all Private Messages .","title":"GET api/direct_messages/all"},{"location":"de/spec/api/friendica/#parameters_8","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"de/spec/api/friendica/#get-apidirect_messagesconversation","text":"Returns all replies of a single private message conversation. Returns Private Messages","title":"GET api/direct_messages/conversation"},{"location":"de/spec/api/friendica/#parameters_9","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" uri : URI of the conversation friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"de/spec/api/friendica/#get-apidirect_messagessent","text":"Deprecated Twitter sent direct message list endpoint. Returns Private Messages .","title":"GET api/direct_messages/sent"},{"location":"de/spec/api/friendica/#parameters_10","text":"count : Items per page (default: 20) page : page number since_id : minimum id max_id : maximum id getText : Defines the format of the status field. Can be \"html\" or \"plain\" include_entities : \"true\" shows entities for pictures and links (Default: false) friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"de/spec/api/friendica/#post-apidirect_messagesnew","text":"Deprecated Twitter direct message submission endpoint.","title":"POST api/direct_messages/new"},{"location":"de/spec/api/friendica/#parameters_11","text":"user_id : id of the user screen_name : screen name (for technical reasons, this value is not unique!) text : The message replyto : ID of the replied direct message title : Title of the direct message","title":"Parameters"},{"location":"de/spec/api/friendica/#post-apidirect_messagesdestroy","text":"Deprecated Twitter direct message deletion endpoint.","title":"POST api/direct_messages/destroy"},{"location":"de/spec/api/friendica/#parameters_12","text":"id : id of the message to be deleted include_entities : optional, currently not yet implemented friendica_parenturi : optional, can be used for increased safety to delete only intended messages friendica_verbose : \"true\" enables different error returns (default: \"false\")","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_1","text":"On success: JSON return as defined for Twitter API not yet implemented on friendica_verbose=true: JSON return {\"result\":\"ok\",\"message\":\"message deleted\"} On error: HTTP 400 BadRequest on friendica_verbose=true: different JSON returns {\"result\":\"error\",\"message\":\"xyz\"}","title":"Return values"},{"location":"de/spec/api/friendica/#get-apifriendicadirect_messages_setseen","text":"","title":"GET api/friendica/direct_messages_setseen"},{"location":"de/spec/api/friendica/#parameters_13","text":"id : id of the message to be updated as seen","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_2","text":"On success: JSON return {\"result\": \"ok\", \"message\": \"message set to seen\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"xyz\"}","title":"Return values"},{"location":"de/spec/api/friendica/#get-apifriendicadirect_messages_search-get-auth","text":"Returns Private Messages matching the provided search string.","title":"GET api/friendica/direct_messages_search (GET; AUTH)"},{"location":"de/spec/api/friendica/#parameters_14","text":"searchstring : string for which the API call should search as '%searchstring%' in field 'body' of all messages of the authenticated user (caption ignored) getText (optional): plain | html If ommited, the title is prepended to the plaintext body in the text attribute of the private message objects. getUserObjects (optional): true | false If false , the sender and recipient attributes of the private message object are absent.","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_3","text":"Returns only tested with JSON, XML might work as well. On success: JSON return {\"success\":\"true\", \"search_results\": array of found messages} JSOn return {\"success\":\"false\", \"search_results\": \"nothing found\"} On error: different JSON returns {\"result\": \"error\", \"message\": \"searchstring not specified\"}","title":"Return values"},{"location":"de/spec/api/friendica/#get-apifriendicagroup_show","text":"Return all or a specified group of the user with the containing contacts as array.","title":"GET api/friendica/group_show"},{"location":"de/spec/api/friendica/#parameters_15","text":"gid : optional, if not given, API returns all groups of the user","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_4","text":"Array of: name : name of the group gid : id of the group user : array of Contacts","title":"Return values"},{"location":"de/spec/api/friendica/#post-apifriendicagroup_create","text":"Create the group with the posted array of contacts as members.","title":"POST api/friendica/group_create"},{"location":"de/spec/api/friendica/#parameters_16","text":"name : name of the group to be created","title":"Parameters"},{"location":"de/spec/api/friendica/#post-data","text":"JSON data as Array like the result of GET api/friendica/group_show : gid name List of Contacts","title":"POST data"},{"location":"de/spec/api/friendica/#return-values_5","text":"Array of: success : true if successfully created or reactivated gid : gid of the created group name : name of the created group status : \"missing user\" | \"reactivated\" | \"ok\" wrong users : array of users, which were not available in the contact table","title":"Return values"},{"location":"de/spec/api/friendica/#post-apifriendicagroup_update","text":"Update the group with the posted array of contacts as members (post all members of the group to the call; function will remove members not posted).","title":"POST api/friendica/group_update"},{"location":"de/spec/api/friendica/#parameters_17","text":"gid : id of the group to be changed name : name of the group to be changed","title":"Parameters"},{"location":"de/spec/api/friendica/#post-data_1","text":"JSON data as array like the result of GET api/friendica/group_show : gid name List of Contacts","title":"POST data"},{"location":"de/spec/api/friendica/#return-values_6","text":"Array of: success : true if successfully updated gid : gid of the changed group name : name of the changed group status : \"missing user\" | \"ok\" wrong users : array of users, which were not available in the contact table","title":"Return values"},{"location":"de/spec/api/friendica/#post-apifriendicagroup_delete","text":"Delete the specified group of contacts; API call need to include the correct gid AND name of the group to be deleted.","title":"POST api/friendica/group_delete"},{"location":"de/spec/api/friendica/#parameters_18","text":"gid : id of the group to be deleted name : name of the group to be deleted","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_7","text":"Array of: success : true if successfully deleted gid : gid of the deleted group name : name of the deleted group status : \"deleted\" if successfully deleted wrong users : empty array","title":"Return values"},{"location":"de/spec/api/friendica/#get-apifriendicanotifications","text":"Return last 50 Notifications for the current user, ordered by date with unseen item on top.","title":"GET api/friendica/notifications"},{"location":"de/spec/api/friendica/#parameters_19","text":"none","title":"Parameters"},{"location":"de/spec/api/friendica/#post-apifriendicanotificationsseen","text":"Set notification as seen.","title":"POST api/friendica/notifications/seen"},{"location":"de/spec/api/friendica/#parameters_20","text":"id : id of the notification to set seen","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_8","text":"If the note is linked to an item, returns an Item . Otherwise, a success status is returned: success (json) | <status>success</status> (xml)","title":"Return values"},{"location":"de/spec/api/friendica/#get-apifriendicaphoto","text":"Returns a Photo .","title":"GET api/friendica/photo"},{"location":"de/spec/api/friendica/#parameters_21","text":"photo_id : Resource id of a photo. scale : (optional) scale value of the photo Returns data of a picture with the given resource. If 'scale' isn't provided, returned data include full url to each scale of the photo. If 'scale' is set, returned data include image data base64 encoded. possibile scale value are: 0: original or max size by server settings 1: image with or height at <= 640 2: image with or height at <= 320 3: thumbnail 160x160 4: Profile image at 300x300 5: Profile image at 80x80 6: Profile image at 48x48 An image used as profile image has only scaled 4-6, other images only 0-3","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_9","text":"json: { \"id\" : \"photo id\" , \"created\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"edited\" : \"date(YYYY-MM-DD HH:MM:SS)\" , \"title\" : \"photo title\" , \"desc\" : \"photo description\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"mime type\" , \"height\" : \"number\" , \"width\" : \"number\" , \"profile\" : \"1 if is profile photo\" , \"link\" : { \"<scale>\" : \"url to image\" , ... }, // if 'scale' is set \"datasize\" : \"size in byte\" , \"data\" : \"base64 encoded image data\" } xml: <photo> <id> photo id </id> <created> date(YYYY-MM-DD HH:MM:SS) </created> <edited> date(YYYY-MM-DD HH:MM:SS) </edited> <title> photo title </title> <desc> photo description </desc> <album> album name </album> <filename> original file name </filename> <type> mime type </type> <height> number </height> <width> number </width> <profile> 1 if is profile photo </profile> <links type= \"array\" > <link type= \"mime type\" scale= \"scale number\" href= \"image url\" /> ... </links> </photo>","title":"Return values"},{"location":"de/spec/api/friendica/#get-apifriendicaphotoslist","text":"Returns the API user's Photo List Items .","title":"GET api/friendica/photos/list"},{"location":"de/spec/api/friendica/#return-values_10","text":"json: [ { \"id\" : \"resource_id\" , \"album\" : \"album name\" , \"filename\" : \"original file name\" , \"type\" : \"image mime type\" , \"thumb\" : \"url to thumb sized image\" }, ... ] xml: <photos type= \"array\" > <photo id= \"resource_id\" album= \"album name\" filename= \"original file name\" type= \"image mime type\" > \"url to thumb sized image\" </photo> ... </photos>","title":"Return values"},{"location":"de/spec/api/friendica/#post-apifriendicaphotocreate","text":"Alias of api/friendica/photo/update","title":"POST api/friendica/photo/create"},{"location":"de/spec/api/friendica/#post-apifriendicaphotoupdate","text":"Saves data for the scales 0-2 to database (see above for scale description). Call adds non-public entries to items table to enable authenticated contacts to comment/like the photo. Client should pay attention to the fact that updated access rights are not transferred to the contacts. i.e. public photos remain publicly visible if they have been commented/liked before setting visibility back to a limited group. Currently, it is best to inform user that updating rights is not the right way to do this, and offer a solution to add photo as a new photo with the new rights instead.","title":"POST api/friendica/photo/update"},{"location":"de/spec/api/friendica/#parameters_22","text":"photo_id (optional): if specified the photo with this id will be updated media (optional): image data as base64, only optional if photo_id is specified (new upload must have media) desc (optional): description for the photo, updated when photo_id is specified album : name of the album to be deleted (always necessary) album_new (optional): can be used to change the album of a single photo if photo_id is specified allow_cid / allow_gid / deny_cid / deny_gid (optional): on create: empty string or omitting = public photo, specify in format <x><y><z> for private photo on update: keys need to be present with empty values for changing a private photo to public","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_11","text":"On success: new photo uploaded: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed photo data: JSON return with photo data (see GET api/friendica/photo ) photo updated - changed info: JSON return {\"result\": \"updated\", \"message\":\"Image id 'xyz' has been updated.\"} photo updated - nothing changed: JSON return {\"result\": \"cancelled\",\"message\": \"Nothing to update for image id 'xyz'.\"} On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no media data submitted\", \"photo not available\", \"acl data invalid\" 500 INTERNALSERVERERROR: \"image size exceeds PHP config settings, file was rejected by server\", \"image size exceeds Friendica Config setting (uploaded size: x)\", \"unable to process image data\", \"image upload failed\", \"unknown error - uploading photo failed, see Friendica log for more information\", \"unknown error - update photo entry in database failed\", \"unknown error - this error on uploading or updating a photo should never happen\"","title":"Return values"},{"location":"de/spec/api/friendica/#post-apifriendicaphotodelete","text":"Deletes a single image with the specified id, is not reversible -> ensure that client is asking user for being sure to do this Sets item table entries for this photo to deleted = 1.","title":"POST api/friendica/photo/delete"},{"location":"de/spec/api/friendica/#parameters_23","text":"photo_id : id of the photo to be deleted","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_12","text":"On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"photo with id 'xyz' has been deleted from server.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no photo_id specified\", \"photo not available\" 500 INTERNALSERVERERROR: \"unknown error on deleting photo\", \"problem with deleting items occurred\"","title":"Return values"},{"location":"de/spec/api/friendica/#post-apifriendicaphotoalbumdelete","text":"Deletes all images with the specified album name, is not reversible -> ensure that client is asking user for being sure to do this.","title":"POST api/friendica/photoalbum/delete"},{"location":"de/spec/api/friendica/#parameters_24","text":"album : name of the album to be deleted","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_13","text":"On success: JSON return { \"result\" : \"deleted\" , \"message\" : \"album 'xyz' with all containing photos has been deleted.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"problem with deleting item occured\", \"unknown error - deleting from database failed\"","title":"Return values"},{"location":"de/spec/api/friendica/#post-apifriendicaphotoalbumupdate","text":"Changes the album name to album_new for all photos in album.","title":"POST api/friendica/photoalbum/update"},{"location":"de/spec/api/friendica/#parameters_25","text":"album : name of the album to be updated album_new : new name of the album","title":"Parameters"},{"location":"de/spec/api/friendica/#return-values_14","text":"On success: JSON return { \"result\" : \"updated\" , \"message\" : \"album 'abc' with all containing photos has been renamed to 'xyz'.\" } On error: 403 FORBIDDEN: if not authenticated 400 BADREQUEST: \"no albumname specified\", \"no new albumname specified\", \"album not available\" 500 INTERNALSERVERERROR: \"unknown error - updating in database failed\"","title":"Return values"},{"location":"de/spec/api/friendica/#get-apifriendicaprofileshow","text":"Returns the Profile data of the authenticated user.","title":"GET api/friendica/profile/show"},{"location":"de/spec/api/friendica/#return-values_15","text":"On success: Array of: global_dir : URL of the global directory set in server settings friendica_owner : user data of the authenticated user profiles : array of the profile data On error: HTTP 403 Forbidden: when no authentication was provided HTTP 400 Bad Request: if given profile_id is not in the database or is not assigned to the authenticated user General description of profile data in API returns: - hide_friends: true if friends are hidden - profile_photo - profile_thumb - publish: true if published on the server's local directory - net_publish: true if published to global_dir - fullname - date_of_birth - description - xmpp - homepage - address - locality - region - postal_code - country - pub_keywords - custom_fields: list of public custom fields","title":"Return values"},{"location":"de/spec/api/friendica/#deprecated-endpoints","text":"POST api/statuses/mediap","title":"Deprecated endpoints"},{"location":"de/spec/api/gnu-social/","tags":["specification","api","gnu social"],"text":"GNU Social API # Overview # Friendica provides the following endpoints defined in the official GNU Social Twitter-like API reference . Authentication is the same as described in Using the APIs . Entities # These endpoints use the Friendica API entities . Implemented endpoints # GET api/account/rate_limit_status POST api/account/update_profile_image GET api/account/verify_credentials GET api/direct_messages POST/DELETE api/direct_messages/destroy POST api/direct_messages/new GET api/direct_messages/sent GET api/favorites POST api/favorites/create/:id POST api/favorites/destroy/:id GET api/followers/ids POST api/friendships/destroy GET api/friends/ids GET/POST api/help/test GET api/search GET api/statuses/show/:id POST api/statuses/destroy/:id GET api/statuses/followers GET api/statuses/friends GET api/statuses/friends_timeline GET api/statuses/friends_timeline/:username GET api/statuses/home_timeline GET api/statuses/mentions GET api/statuses/replies GET api/statuses/replies/:username POST api/statuses/retweet/:id GET api/statuses/public_timeline POST api/statuses/update GET api/statuses/user_timeline GET api/users/show Non-implemented endpoints # statuses/retweeted_to_me statuses/retweeted_by_me statuses/retweets_of_me friendships/create friendships/exists friendships/show account/end_session account/update_delivery_device account/update_profile_background_image notifications/follow notifications/leave blocks/create blocks/destroy blocks/exists blocks/blocking oauth/authorize oauth/access_token oauth/request_token statusnet/groups/timeline statusnet/groups/show statusnet/groups/create statusnet/groups/join statusnet/groups/leave statusnet/groups/list statusnet/groups/list_all statusnet/groups/membership statusnet/groups/is_member statusnet/tags/timeline statusnet/media/upload statusnet/config","title":"GNU Social"},{"location":"de/spec/api/gnu-social/#gnu-social-api","text":"","title":"GNU Social API"},{"location":"de/spec/api/gnu-social/#overview","text":"Friendica provides the following endpoints defined in the official GNU Social Twitter-like API reference . Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"de/spec/api/gnu-social/#entities","text":"These endpoints use the Friendica API entities .","title":"Entities"},{"location":"de/spec/api/gnu-social/#implemented-endpoints","text":"GET api/account/rate_limit_status POST api/account/update_profile_image GET api/account/verify_credentials GET api/direct_messages POST/DELETE api/direct_messages/destroy POST api/direct_messages/new GET api/direct_messages/sent GET api/favorites POST api/favorites/create/:id POST api/favorites/destroy/:id GET api/followers/ids POST api/friendships/destroy GET api/friends/ids GET/POST api/help/test GET api/search GET api/statuses/show/:id POST api/statuses/destroy/:id GET api/statuses/followers GET api/statuses/friends GET api/statuses/friends_timeline GET api/statuses/friends_timeline/:username GET api/statuses/home_timeline GET api/statuses/mentions GET api/statuses/replies GET api/statuses/replies/:username POST api/statuses/retweet/:id GET api/statuses/public_timeline POST api/statuses/update GET api/statuses/user_timeline GET api/users/show","title":"Implemented endpoints"},{"location":"de/spec/api/gnu-social/#non-implemented-endpoints","text":"statuses/retweeted_to_me statuses/retweeted_by_me statuses/retweets_of_me friendships/create friendships/exists friendships/show account/end_session account/update_delivery_device account/update_profile_background_image notifications/follow notifications/leave blocks/create blocks/destroy blocks/exists blocks/blocking oauth/authorize oauth/access_token oauth/request_token statusnet/groups/timeline statusnet/groups/show statusnet/groups/create statusnet/groups/join statusnet/groups/leave statusnet/groups/list statusnet/groups/list_all statusnet/groups/membership statusnet/groups/is_member statusnet/tags/timeline statusnet/media/upload statusnet/config","title":"Non-implemented endpoints"},{"location":"de/spec/api/mastodon/","tags":["specification","api","mastodon"],"text":"Mastodon API # Overview # Friendica provides the following endpoints defined in the official Mastodon API reference . Authentication is the same as described in Using the APIs . Clients # Supported apps # For supported apps please have a look at the FAQ Unsupported apps # Android # Fedilab Automatically uses the legacy API, see issue: https://framagit.org/tom79/fedilab/-/issues/520 Mammut There are problems with the token request, see issue https://github.com/jamiesanson/Mammut/issues/19 iOS # Mast Doesn't accept the entered instance name. Claims that it is invalid (Message is: \"Not a valid instance (maybe closed or dead)\") Toot! Entities # These endpoints use the Mastodon API entities . Implemented endpoints # GET /api/v1/accounts/:id POST /api/v1/accounts/:id/block POST /api/v1/accounts/:id/follow GET /api/v1/accounts/:id/followers GET /api/v1/accounts/:id/following GET /api/v1/accounts/:id/lists POST /api/v1/accounts/:id/mute POST /api/v1/accounts/:id/note GET /api/v1/accounts/:id/statuses POST /api/v1/accounts/:id/unfollow POST /api/v1/accounts/:id/unblock POST /api/v1/accounts/:id/unmute GET /api/v1/accounts/relationships GET /api/v1/accounts/search GET /api/v1/accounts/verify_credentials POST /api/v1/apps GET /api/v1/apps/verify_credentials GET /api/v1/blocks GET /api/v1/bookmarks GET /api/v1/conversations DELETE /api/v1/conversations/:id POST /api/v1/conversations/:id/read GET /api/v1/custom_emojis Doesn't return unicode emojis since they aren't using an image URL GET /api/v1/directory GET /api/v1/favourites GET /api/v1/follow_requests Returned IDs are specific to follow requests POST /api/v1/follow_requests/:id/authorize :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/reject :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/ignore Friendica-specific, hides the follow request from the list and prevents the remote contact from retrying. :id is a follow request ID, not a regular account id Returns a Relationship object. GET /api/v1/instance GET /api/v1/instance/rules Undocumented, returns Terms of Service GET /api/v1/instance/peers GET /api/v1/lists POST /api/v1/lists GET /api/v1/lists/:id PUT /api/v1/lists/:id DELETE /api/v1/lists/:id GET /api/v1/lists/:id/accounts POST /api/v1/lists/:id/accounts DELETE /api/v1/lists/:id/accounts POST /api/v1/markers GET /api/v1/markers POST /api/v1/media GET /api/v1/media/:id PUT /api/v1/media/:id GET /api/v1/mutes GET /api/v1/notifications GET /api/v1/notifications/:id POST /api/v1/notifications/clear POST /api/v1/notifications/:id/dismiss GET /api/v1/polls/:id GET /api/v1/preferences DELETE /api/v1/push/subscription GET /api/v1/push/subscription PUSH /api/v1/push/subscription PUT /api/v1/push/subscription GET /api/v1/scheduled_statuses DELETE /api/v1/scheduled_statuses/:id GET /api/v1/scheduled_statuses/:id GET /api/v1/search POST /api/v1/statuses Additionally, to the static values public , unlisted and private , the visibility parameter can contain a numeric value with a group id. GET /api/v1/statuses/:id DELETE /api/v1/statuses/:id GET /api/v1/statuses/:id/card GET /api/v1/statuses/:id/context GET /api/v1/statuses/:id/reblogged_by GET /api/v1/statuses/:id/favourited_by POST /api/v1/statuses/:id/favourite POST /api/v1/statuses/:id/unfavourite POST /api/v1/statuses/:id/reblog POST /api/v1/statuses/:id/unreblog POST /api/v1/statuses/:id/bookmark POST /api/v1/statuses/:id/unbookmark POST /api/v1/statuses/:id/mute POST /api/v1/statuses/:id/unmute POST /api/v1/statuses/:id/pin POST /api/v1/statuses/:id/unpin GET /api/v1/suggestions GET /api/v1/timelines/direct GET /api/v1/timelines/home GET /api/v1/timelines/list/:id GET /api/v1/timelines/public GET /api/v1/timelines/tag/:hashtag GET /api/v1/trends GET /api/v2/search Currently unimplemented endpoints # These endpoints are planned to be implemented somewhere in the future. PATCH /api/v1/accounts/update_credentials POST /api/v1/accounts/:id/remove_from_followers GET /api/v1/accounts/familiar_followers GET /api/v1/accounts/lookup GET /api/v1/trends/links GET /api/v1/trends/statuses GET /api/v1/trends/tags POST /api/v1/polls/:id/votes GET /api/v1/statuses/{id:\\d+}/source GET /api/v1/featured_tags POST /api/v1/featured_tags DELETE /api/v1/featured_tags/:id Dummy endpoints # These endpoints are returning empty data to avoid error messages when using third party clients. They refer to features that don't exist in Friendica yet. GET /api/v1/accounts/:id/identity_proofs GET /api/v1/announcements GET /api/v1/endorsements GET /api/v1/filters Non supportable endpoints # These endpoints won't be implemented at the moment. They refer to features or data that don't exist in Friendica yet. POST /api/meta Misskey API endpoint. POST /api/v1/accounts GET /api/v1/accounts/:id/featured_tags POST /api/v1/accounts/:id/pin POST /api/v1/accounts/:id/unpin GET /api/v1/admin/accounts GET /api/v1/admin/accounts/:id POST /api/v1/admin/accounts/:id/{action} GET /api/v1/admin/reports GET /api/v1/admin/reports/:id POST /api/v1/admin/reports/:id/{action} POST /api/v1/announcements/:id/dismiss PUT /api/v1/announcements/:id/reactions/{name} DELETE /api/v1/announcements/:id/reactions/{name} GET /api/v1/domain_blocks POST /api/v1/domain_blocks DELETE /api/v1/domain_blocks DELETE /api/v1/emails/confirmations GET /api/v1/featured_tags/suggestions GET /api/v1/filters/:id POST /api/v1/filters/:id PUT /api/v1/filters/:id DELETE /api/v1/filters/:id GET /api/v1/instance/activity POST /api/v1/markers POST /api/v1/reports PUT /api/v1/scheduled_statuses/:id GET /api/v1/statuses/{id:\\d+}/history GET /api/v1/streaming DELETE /api/v1/suggestions/:id","title":"Mastodon"},{"location":"de/spec/api/mastodon/#mastodon-api","text":"","title":"Mastodon API"},{"location":"de/spec/api/mastodon/#overview","text":"Friendica provides the following endpoints defined in the official Mastodon API reference . Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"de/spec/api/mastodon/#clients","text":"","title":"Clients"},{"location":"de/spec/api/mastodon/#supported-apps","text":"For supported apps please have a look at the FAQ","title":"Supported apps"},{"location":"de/spec/api/mastodon/#unsupported-apps","text":"","title":"Unsupported apps"},{"location":"de/spec/api/mastodon/#android","text":"Fedilab Automatically uses the legacy API, see issue: https://framagit.org/tom79/fedilab/-/issues/520 Mammut There are problems with the token request, see issue https://github.com/jamiesanson/Mammut/issues/19","title":"Android"},{"location":"de/spec/api/mastodon/#ios","text":"Mast Doesn't accept the entered instance name. Claims that it is invalid (Message is: \"Not a valid instance (maybe closed or dead)\") Toot!","title":"iOS"},{"location":"de/spec/api/mastodon/#entities","text":"These endpoints use the Mastodon API entities .","title":"Entities"},{"location":"de/spec/api/mastodon/#implemented-endpoints","text":"GET /api/v1/accounts/:id POST /api/v1/accounts/:id/block POST /api/v1/accounts/:id/follow GET /api/v1/accounts/:id/followers GET /api/v1/accounts/:id/following GET /api/v1/accounts/:id/lists POST /api/v1/accounts/:id/mute POST /api/v1/accounts/:id/note GET /api/v1/accounts/:id/statuses POST /api/v1/accounts/:id/unfollow POST /api/v1/accounts/:id/unblock POST /api/v1/accounts/:id/unmute GET /api/v1/accounts/relationships GET /api/v1/accounts/search GET /api/v1/accounts/verify_credentials POST /api/v1/apps GET /api/v1/apps/verify_credentials GET /api/v1/blocks GET /api/v1/bookmarks GET /api/v1/conversations DELETE /api/v1/conversations/:id POST /api/v1/conversations/:id/read GET /api/v1/custom_emojis Doesn't return unicode emojis since they aren't using an image URL GET /api/v1/directory GET /api/v1/favourites GET /api/v1/follow_requests Returned IDs are specific to follow requests POST /api/v1/follow_requests/:id/authorize :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/reject :id is a follow request ID, not a regular account id POST /api/v1/follow_requests/:id/ignore Friendica-specific, hides the follow request from the list and prevents the remote contact from retrying. :id is a follow request ID, not a regular account id Returns a Relationship object. GET /api/v1/instance GET /api/v1/instance/rules Undocumented, returns Terms of Service GET /api/v1/instance/peers GET /api/v1/lists POST /api/v1/lists GET /api/v1/lists/:id PUT /api/v1/lists/:id DELETE /api/v1/lists/:id GET /api/v1/lists/:id/accounts POST /api/v1/lists/:id/accounts DELETE /api/v1/lists/:id/accounts POST /api/v1/markers GET /api/v1/markers POST /api/v1/media GET /api/v1/media/:id PUT /api/v1/media/:id GET /api/v1/mutes GET /api/v1/notifications GET /api/v1/notifications/:id POST /api/v1/notifications/clear POST /api/v1/notifications/:id/dismiss GET /api/v1/polls/:id GET /api/v1/preferences DELETE /api/v1/push/subscription GET /api/v1/push/subscription PUSH /api/v1/push/subscription PUT /api/v1/push/subscription GET /api/v1/scheduled_statuses DELETE /api/v1/scheduled_statuses/:id GET /api/v1/scheduled_statuses/:id GET /api/v1/search POST /api/v1/statuses Additionally, to the static values public , unlisted and private , the visibility parameter can contain a numeric value with a group id. GET /api/v1/statuses/:id DELETE /api/v1/statuses/:id GET /api/v1/statuses/:id/card GET /api/v1/statuses/:id/context GET /api/v1/statuses/:id/reblogged_by GET /api/v1/statuses/:id/favourited_by POST /api/v1/statuses/:id/favourite POST /api/v1/statuses/:id/unfavourite POST /api/v1/statuses/:id/reblog POST /api/v1/statuses/:id/unreblog POST /api/v1/statuses/:id/bookmark POST /api/v1/statuses/:id/unbookmark POST /api/v1/statuses/:id/mute POST /api/v1/statuses/:id/unmute POST /api/v1/statuses/:id/pin POST /api/v1/statuses/:id/unpin GET /api/v1/suggestions GET /api/v1/timelines/direct GET /api/v1/timelines/home GET /api/v1/timelines/list/:id GET /api/v1/timelines/public GET /api/v1/timelines/tag/:hashtag GET /api/v1/trends GET /api/v2/search","title":"Implemented endpoints"},{"location":"de/spec/api/mastodon/#currently-unimplemented-endpoints","text":"These endpoints are planned to be implemented somewhere in the future. PATCH /api/v1/accounts/update_credentials POST /api/v1/accounts/:id/remove_from_followers GET /api/v1/accounts/familiar_followers GET /api/v1/accounts/lookup GET /api/v1/trends/links GET /api/v1/trends/statuses GET /api/v1/trends/tags POST /api/v1/polls/:id/votes GET /api/v1/statuses/{id:\\d+}/source GET /api/v1/featured_tags POST /api/v1/featured_tags DELETE /api/v1/featured_tags/:id","title":"Currently unimplemented endpoints"},{"location":"de/spec/api/mastodon/#dummy-endpoints","text":"These endpoints are returning empty data to avoid error messages when using third party clients. They refer to features that don't exist in Friendica yet. GET /api/v1/accounts/:id/identity_proofs GET /api/v1/announcements GET /api/v1/endorsements GET /api/v1/filters","title":"Dummy endpoints"},{"location":"de/spec/api/mastodon/#non-supportable-endpoints","text":"These endpoints won't be implemented at the moment. They refer to features or data that don't exist in Friendica yet. POST /api/meta Misskey API endpoint. POST /api/v1/accounts GET /api/v1/accounts/:id/featured_tags POST /api/v1/accounts/:id/pin POST /api/v1/accounts/:id/unpin GET /api/v1/admin/accounts GET /api/v1/admin/accounts/:id POST /api/v1/admin/accounts/:id/{action} GET /api/v1/admin/reports GET /api/v1/admin/reports/:id POST /api/v1/admin/reports/:id/{action} POST /api/v1/announcements/:id/dismiss PUT /api/v1/announcements/:id/reactions/{name} DELETE /api/v1/announcements/:id/reactions/{name} GET /api/v1/domain_blocks POST /api/v1/domain_blocks DELETE /api/v1/domain_blocks DELETE /api/v1/emails/confirmations GET /api/v1/featured_tags/suggestions GET /api/v1/filters/:id POST /api/v1/filters/:id PUT /api/v1/filters/:id DELETE /api/v1/filters/:id GET /api/v1/instance/activity POST /api/v1/markers POST /api/v1/reports PUT /api/v1/scheduled_statuses/:id GET /api/v1/statuses/{id:\\d+}/history GET /api/v1/streaming DELETE /api/v1/suggestions/:id","title":"Non supportable endpoints"},{"location":"de/spec/api/twitter/","tags":["specification","api","twitter"],"text":"Twitter API # Overview # Friendica provides the following endpoints defined in the official Twitter API reference . Authentication is the same as described in Using the APIs . Entities # These endpoints use the Friendica API entities . Different behaviour # screen_name : The nickname in Friendica is only unique in each network but not for all networks. The users are searched in the following priority: Friendica, StatusNet/GNU Social, Diaspora, pump.io, Twitter. If no contact was found by this way, then the first contact is taken. include_entities : Default is \"false\". If set to \"true\" then the plain text is formatted so that links are having descriptions. Friendica-specific return values # cid : Contact id of the user (important for \"contact_allow\" and \"contact_deny\") network : network of the user Unsupported parameters # cursor trim_user contributor_details place_id display_coordinates include_rts : To-Do include_my_retweet : Retweets in Friendica are implemented in a different way Implemented endpoints # POST api/oauth/access_token Unsupported parameters: x_auth_password x_auth_username x_auth_mode POST api/oauth/request_token Unsupported parameter: x_auth_access_type GET api/account/verify_credentials Unsupported parameter: include_email POST api/account/update_profile Unsupported parameters: url location profile_link_color include_entities skip_status POST api/account/update_profile_image Additional parameter: profile_id (optional): Numerical id of the profile for which the image should be used, default is changing the default profile. POST api/statuses/update Unsupported parameter: display_coordinates POST api/statuses/update_with_media (deprecated) POST api/media/upload Additional return value: image.friendica_preview_url : image preview url POST api/media/metadata/create GET api/users/show GET api/users/search Unsupported parameters: page count include_entities GET api/users/lookup Unsupported parameters: screen_name include_entities GET api/search/tweets Unsupported parameters: geocode lang locale result_type until include_entities GET api/saved_searches/list GET api/statuses/home_timeline Alias: GET api/statuses/friends_timeline GET api/statuses/user_timeline GET api/statuses/mentions (deprecated) GET api/statuses/show/:id POST api/statuses/retweet/:id POST api/statuses/destroy/:id GET api/statuses/followers (deprecated) Alias: GET api/statuses/friends GET api/favorites (deprecated) Unsupported parameters: user_id : Favorites aren't returned for other users than self screen_name : Favorites aren't returned for other users than self POST api/favorites/create POST api/favorites/destroy GET api/lists/list GET api/lists/ownerships Unsupported parameters: slug owner_screen_name owner_id include_entities GET api/lists/statuses Unsupported parameters: screen_name count GET api/lists/subscriptions POST api/lists/update Unsupported parameters: slug name mode description owner_screen_name owner_id POST api/lists/create Unsupported parameters: mode description POST api/lists/destroy Unsupported parameters: owner_screen_name owner_id slug GET api/blocks/list GET api/friendships/incoming Unsupported parameters stringify_ids GET api/followers/ids GET api/followers/list GET api/friends/ids GET api/friends/list Additional parameters: since_id : You can use the next_cursor value to load the next page. max_id : You can use the inverse of the previous_cursor value to load the previous page. Unsupported parameter: skip_status : No status is returned even if it isn't set to true. Caveats: cursor trumps since_id trumps max_id if any combination is provided. user_id must be the ID of a contact associated with a local user account. screen_name must be associated with a local user account. screen_name trumps user_id if both are provided (undocumented Twitter behavior). Will succeed but return an empty array for users hiding their contact lists. POST api/friendships/destroy Non-implemented endpoints # GET oauth/authenticate GET oauth/authorize POST oauth/invalidate_token POST oauth2/invalidate_token POST oauth2/token GET lists/members GET lists/members/show GET lists/memberships GET lists/show GET lists/subscribers GET lists/subscribers/show POST lists/members/create POST lists/members/create_all POST lists/members/destroy POST lists/members/destroy_all POST lists/subscribers/create POST lists/subscribers/destroy GET friendships/lookup GET friendships/no_retweets/ids GET friendships/outgoing GET friendships/show GET users/suggestions (deprecated) GET users/suggestions/:slug (deprecated) GET users/suggestions/:slug/members (deprecated) POST friendships/create POST friendships/update GET account/settings GET saved_searches/show/:id GET users/profile_banner POST account/remove_profile_banner POST account/settings POST account/update_profile_background_image (deprecated) POST account/update_profile_banner POST saved_searches/create POST saved_searches/destroy/:id GET blocks/ids GET mutes/users/ids GET mutes/users/list POST blocks/create POST blocks/destroy POST mutes/users/create POST mutes/users/destroy POST users/report_spam GET collections/entries GET collections/list GET collections/show POST collections/create POST collections/destroy POST collections/entries/add POST collections/entries/curate POST collections/entries/move POST collections/entries/remove POST collections/update POST statuses/filter GET statuses/mentions_timeline GET favorites/list GET statuses/lookup GET statuses/oembed GET statuses/retweeters/ids GET statuses/retweets/:id GET statuses/retweets_of_me POST statuses/unretweet/:id GET statuses/sample GET compliance/firehose DELETE custom_profiles/destroy.json GET custom_profiles/:id GET custom_profiles/list POST custom_profiles/new.json DELETE direct_messages/events/destroy GET direct_messages/events/list GET direct_messages/events/show POST direct_messages/events/new (message_create) POST direct_messages/indicate_typing POST direct_messages/mark_read DELETE direct_messages/welcome_messages/destroy DELETE direct_messages/welcome_messages/rules/destroy PUT direct_messages/welcome_messages/update GET direct_messages/welcome_messages/list GET direct_messages/welcome_messages/rules/list GET direct_messages/welcome_messages/rules/show GET direct_messages/welcome_messages/show POST direct_messages/welcome_messages/new POST direct_messages/welcome_messages/rules/new GET media/upload (STATUS) POST media/subtitles/create POST media/subtitles/delete POST media/upload (APPEND) POST media/upload (FINALIZE) POST media/upload (INIT) GET trends/available GET trends/closest GET trends/place GET geo/id/:place_id GET geo/reverse_geocode GET geo/search","title":"Twitter"},{"location":"de/spec/api/twitter/#twitter-api","text":"","title":"Twitter API"},{"location":"de/spec/api/twitter/#overview","text":"Friendica provides the following endpoints defined in the official Twitter API reference . Authentication is the same as described in Using the APIs .","title":"Overview"},{"location":"de/spec/api/twitter/#entities","text":"These endpoints use the Friendica API entities .","title":"Entities"},{"location":"de/spec/api/twitter/#different-behaviour","text":"screen_name : The nickname in Friendica is only unique in each network but not for all networks. The users are searched in the following priority: Friendica, StatusNet/GNU Social, Diaspora, pump.io, Twitter. If no contact was found by this way, then the first contact is taken. include_entities : Default is \"false\". If set to \"true\" then the plain text is formatted so that links are having descriptions.","title":"Different behaviour"},{"location":"de/spec/api/twitter/#friendica-specific-return-values","text":"cid : Contact id of the user (important for \"contact_allow\" and \"contact_deny\") network : network of the user","title":"Friendica-specific return values"},{"location":"de/spec/api/twitter/#unsupported-parameters","text":"cursor trim_user contributor_details place_id display_coordinates include_rts : To-Do include_my_retweet : Retweets in Friendica are implemented in a different way","title":"Unsupported parameters"},{"location":"de/spec/api/twitter/#implemented-endpoints","text":"POST api/oauth/access_token Unsupported parameters: x_auth_password x_auth_username x_auth_mode POST api/oauth/request_token Unsupported parameter: x_auth_access_type GET api/account/verify_credentials Unsupported parameter: include_email POST api/account/update_profile Unsupported parameters: url location profile_link_color include_entities skip_status POST api/account/update_profile_image Additional parameter: profile_id (optional): Numerical id of the profile for which the image should be used, default is changing the default profile. POST api/statuses/update Unsupported parameter: display_coordinates POST api/statuses/update_with_media (deprecated) POST api/media/upload Additional return value: image.friendica_preview_url : image preview url POST api/media/metadata/create GET api/users/show GET api/users/search Unsupported parameters: page count include_entities GET api/users/lookup Unsupported parameters: screen_name include_entities GET api/search/tweets Unsupported parameters: geocode lang locale result_type until include_entities GET api/saved_searches/list GET api/statuses/home_timeline Alias: GET api/statuses/friends_timeline GET api/statuses/user_timeline GET api/statuses/mentions (deprecated) GET api/statuses/show/:id POST api/statuses/retweet/:id POST api/statuses/destroy/:id GET api/statuses/followers (deprecated) Alias: GET api/statuses/friends GET api/favorites (deprecated) Unsupported parameters: user_id : Favorites aren't returned for other users than self screen_name : Favorites aren't returned for other users than self POST api/favorites/create POST api/favorites/destroy GET api/lists/list GET api/lists/ownerships Unsupported parameters: slug owner_screen_name owner_id include_entities GET api/lists/statuses Unsupported parameters: screen_name count GET api/lists/subscriptions POST api/lists/update Unsupported parameters: slug name mode description owner_screen_name owner_id POST api/lists/create Unsupported parameters: mode description POST api/lists/destroy Unsupported parameters: owner_screen_name owner_id slug GET api/blocks/list GET api/friendships/incoming Unsupported parameters stringify_ids GET api/followers/ids GET api/followers/list GET api/friends/ids GET api/friends/list Additional parameters: since_id : You can use the next_cursor value to load the next page. max_id : You can use the inverse of the previous_cursor value to load the previous page. Unsupported parameter: skip_status : No status is returned even if it isn't set to true. Caveats: cursor trumps since_id trumps max_id if any combination is provided. user_id must be the ID of a contact associated with a local user account. screen_name must be associated with a local user account. screen_name trumps user_id if both are provided (undocumented Twitter behavior). Will succeed but return an empty array for users hiding their contact lists. POST api/friendships/destroy","title":"Implemented endpoints"},{"location":"de/spec/api/twitter/#non-implemented-endpoints","text":"GET oauth/authenticate GET oauth/authorize POST oauth/invalidate_token POST oauth2/invalidate_token POST oauth2/token GET lists/members GET lists/members/show GET lists/memberships GET lists/show GET lists/subscribers GET lists/subscribers/show POST lists/members/create POST lists/members/create_all POST lists/members/destroy POST lists/members/destroy_all POST lists/subscribers/create POST lists/subscribers/destroy GET friendships/lookup GET friendships/no_retweets/ids GET friendships/outgoing GET friendships/show GET users/suggestions (deprecated) GET users/suggestions/:slug (deprecated) GET users/suggestions/:slug/members (deprecated) POST friendships/create POST friendships/update GET account/settings GET saved_searches/show/:id GET users/profile_banner POST account/remove_profile_banner POST account/settings POST account/update_profile_background_image (deprecated) POST account/update_profile_banner POST saved_searches/create POST saved_searches/destroy/:id GET blocks/ids GET mutes/users/ids GET mutes/users/list POST blocks/create POST blocks/destroy POST mutes/users/create POST mutes/users/destroy POST users/report_spam GET collections/entries GET collections/list GET collections/show POST collections/create POST collections/destroy POST collections/entries/add POST collections/entries/curate POST collections/entries/move POST collections/entries/remove POST collections/update POST statuses/filter GET statuses/mentions_timeline GET favorites/list GET statuses/lookup GET statuses/oembed GET statuses/retweeters/ids GET statuses/retweets/:id GET statuses/retweets_of_me POST statuses/unretweet/:id GET statuses/sample GET compliance/firehose DELETE custom_profiles/destroy.json GET custom_profiles/:id GET custom_profiles/list POST custom_profiles/new.json DELETE direct_messages/events/destroy GET direct_messages/events/list GET direct_messages/events/show POST direct_messages/events/new (message_create) POST direct_messages/indicate_typing POST direct_messages/mark_read DELETE direct_messages/welcome_messages/destroy DELETE direct_messages/welcome_messages/rules/destroy PUT direct_messages/welcome_messages/update GET direct_messages/welcome_messages/list GET direct_messages/welcome_messages/rules/list GET direct_messages/welcome_messages/rules/show GET direct_messages/welcome_messages/show POST direct_messages/welcome_messages/new POST direct_messages/welcome_messages/rules/new GET media/upload (STATUS) POST media/subtitles/create POST media/subtitles/delete POST media/upload (APPEND) POST media/upload (FINALIZE) POST media/upload (INIT) GET trends/available GET trends/closest GET trends/place GET geo/id/:place_id GET geo/reverse_geocode GET geo/search","title":"Non-implemented endpoints"},{"location":"de/spec/database/","text":"Database Tables # Table Comment 2fa_app_specific_password Two-factor app-specific _password 2fa_recovery_codes Two-factor authentication recovery codes 2fa_trusted_browser Two-factor authentication trusted browsers addon registered addons apcontact ActivityPub compatible contacts - used in the ActivityPub implementation application-marker Timeline marker application-token OAuth user token application OAuth application attach file attachments cache Stores temporary data config main configuration storage contact-relation Contact relations contact contact table conv private messages conversation Raw data and structure information for messages delayed-post Posts that are about to be distributed at a later time diaspora-interaction Signed Diaspora Interaction endpoint ActivityPub endpoints - used in the ActivityPub implementation event Events fcontact Diaspora compatible contacts - used in the Diaspora implementation fsuggest friend suggestion stuff group privacy groups, group info group_member privacy groups, member info gserver-tag Tags that the server has subscribed gserver Global servers hook addon hook registry inbox-entry-receiver Receiver for the incoming activity inbox-entry Incoming activity inbox-status Status of ActivityPub inboxes intro item-uri URI and GUID for items locks mail private messages mailacct Mail account data for fetching mails manage table of accounts that can manage each other notification notifications notify-threads notify [Deprecated] User notifications oembed cache for OEmbed queries openwebauth-token Store OpenWebAuth token to verify contacts parsed_url cache for 'parse_url' queries pconfig personal (per user) configuration storage permissionset photo photo storage post-category post relation to categories post-collection Collection of posts post-content Content for all posts post-delivery-data Delivery data for items post-delivery Delivery data for posts for the batch processing post-history Post history post-link Post related external links post-media Attached media post-question-option Question option post-question Question post-tag post relation to tags post-thread-user Thread related data per user post-thread Thread related data post-user-notification User post notifications post-user User specific post data post Structure for all posts process Currently running system processes profile user profiles data profile_field Custom profile fields push_subscriber Used for OStatus: Contains feed subscribers register registrations requiring admin approval search session web session storage storage Data stored by Database storage backend subscription Push Subscription for the API tag tags and mentions user-contact User specific public contact data user The local users userd Deleted usernames verb Activity Verbs worker-ipc Inter process communication between the frontend and the worker workerqueue Background tasks queue entries","title":"Database Tables"},{"location":"de/spec/database/#database-tables","text":"Table Comment 2fa_app_specific_password Two-factor app-specific _password 2fa_recovery_codes Two-factor authentication recovery codes 2fa_trusted_browser Two-factor authentication trusted browsers addon registered addons apcontact ActivityPub compatible contacts - used in the ActivityPub implementation application-marker Timeline marker application-token OAuth user token application OAuth application attach file attachments cache Stores temporary data config main configuration storage contact-relation Contact relations contact contact table conv private messages conversation Raw data and structure information for messages delayed-post Posts that are about to be distributed at a later time diaspora-interaction Signed Diaspora Interaction endpoint ActivityPub endpoints - used in the ActivityPub implementation event Events fcontact Diaspora compatible contacts - used in the Diaspora implementation fsuggest friend suggestion stuff group privacy groups, group info group_member privacy groups, member info gserver-tag Tags that the server has subscribed gserver Global servers hook addon hook registry inbox-entry-receiver Receiver for the incoming activity inbox-entry Incoming activity inbox-status Status of ActivityPub inboxes intro item-uri URI and GUID for items locks mail private messages mailacct Mail account data for fetching mails manage table of accounts that can manage each other notification notifications notify-threads notify [Deprecated] User notifications oembed cache for OEmbed queries openwebauth-token Store OpenWebAuth token to verify contacts parsed_url cache for 'parse_url' queries pconfig personal (per user) configuration storage permissionset photo photo storage post-category post relation to categories post-collection Collection of posts post-content Content for all posts post-delivery-data Delivery data for items post-delivery Delivery data for posts for the batch processing post-history Post history post-link Post related external links post-media Attached media post-question-option Question option post-question Question post-tag post relation to tags post-thread-user Thread related data per user post-thread Thread related data post-user-notification User post notifications post-user User specific post data post Structure for all posts process Currently running system processes profile user profiles data profile_field Custom profile fields push_subscriber Used for OStatus: Contains feed subscribers register registrations requiring admin approval search session web session storage storage Data stored by Database storage backend subscription Push Subscription for the API tag tags and mentions user-contact User specific public contact data user The local users userd Deleted usernames verb Activity Verbs worker-ipc Inter process communication between the frontend and the worker workerqueue Background tasks queue entries","title":"Database Tables"},{"location":"de/spec/database/db_2fa_app_specific_password/","tags":["database","table","developer"],"text":"Table 2fa_app_specific_password # Two-factor app-specific _password Fields # Field Description Type Null Key Default Extra id Password ID for revocation mediumint unsigned NO PRI NULL auto_increment uid User ID mediumint unsigned NO NULL description Description of the usage of the password varchar(255) YES NULL hashed_password Hashed password varchar(255) NO NULL generated Datetime the password was generated datetime NO NULL last_used Datetime the password was last used datetime YES NULL Indexes # Name Fields PRIMARY id uid_description uid, description(190) Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"2fa_app_specific_password"},{"location":"de/spec/database/db_2fa_app_specific_password/#table-2fa_app_specific_password","text":"Two-factor app-specific _password","title":"Table 2fa_app_specific_password"},{"location":"de/spec/database/db_2fa_app_specific_password/#fields","text":"Field Description Type Null Key Default Extra id Password ID for revocation mediumint unsigned NO PRI NULL auto_increment uid User ID mediumint unsigned NO NULL description Description of the usage of the password varchar(255) YES NULL hashed_password Hashed password varchar(255) NO NULL generated Datetime the password was generated datetime NO NULL last_used Datetime the password was last used datetime YES NULL","title":"Fields"},{"location":"de/spec/database/db_2fa_app_specific_password/#indexes","text":"Name Fields PRIMARY id uid_description uid, description(190)","title":"Indexes"},{"location":"de/spec/database/db_2fa_app_specific_password/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_2fa_recovery_codes/","tags":["database","table","developer"],"text":"Table 2fa_recovery_codes # Two-factor authentication recovery codes Fields # Field Description Type Null Key Default Extra uid User ID mediumint unsigned NO PRI NULL code Recovery code string varchar(50) NO PRI NULL generated Datetime the code was generated datetime NO NULL used Datetime the code was used datetime YES NULL Indexes # Name Fields PRIMARY uid, code Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"2fa_recovery_codes"},{"location":"de/spec/database/db_2fa_recovery_codes/#table-2fa_recovery_codes","text":"Two-factor authentication recovery codes","title":"Table 2fa_recovery_codes"},{"location":"de/spec/database/db_2fa_recovery_codes/#fields","text":"Field Description Type Null Key Default Extra uid User ID mediumint unsigned NO PRI NULL code Recovery code string varchar(50) NO PRI NULL generated Datetime the code was generated datetime NO NULL used Datetime the code was used datetime YES NULL","title":"Fields"},{"location":"de/spec/database/db_2fa_recovery_codes/#indexes","text":"Name Fields PRIMARY uid, code","title":"Indexes"},{"location":"de/spec/database/db_2fa_recovery_codes/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_2fa_trusted_browser/","tags":["database","table","developer"],"text":"Table 2fa_trusted_browser # Two-factor authentication trusted browsers Fields # Field Description Type Null Key Default Extra cookie_hash Trusted cookie hash varchar(80) NO PRI NULL uid User ID mediumint unsigned NO NULL user_agent User agent string text YES NULL trusted Whenever this browser should be trusted or not boolean NO 1 created Datetime the trusted browser was recorded datetime NO NULL last_used Datetime the trusted browser was last used datetime YES NULL Indexes # Name Fields PRIMARY cookie_hash uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"2fa_trusted_browser"},{"location":"de/spec/database/db_2fa_trusted_browser/#table-2fa_trusted_browser","text":"Two-factor authentication trusted browsers","title":"Table 2fa_trusted_browser"},{"location":"de/spec/database/db_2fa_trusted_browser/#fields","text":"Field Description Type Null Key Default Extra cookie_hash Trusted cookie hash varchar(80) NO PRI NULL uid User ID mediumint unsigned NO NULL user_agent User agent string text YES NULL trusted Whenever this browser should be trusted or not boolean NO 1 created Datetime the trusted browser was recorded datetime NO NULL last_used Datetime the trusted browser was last used datetime YES NULL","title":"Fields"},{"location":"de/spec/database/db_2fa_trusted_browser/#indexes","text":"Name Fields PRIMARY cookie_hash uid uid","title":"Indexes"},{"location":"de/spec/database/db_2fa_trusted_browser/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_addon/","tags":["database","table","developer"],"text":"Table addon # registered addons Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name addon base (file)name varchar(50) NO version currently unused varchar(50) NO installed currently always 1 boolean NO 0 hidden currently unused boolean NO 0 timestamp file timestamp to check for reloads int unsigned NO 0 plugin_admin 1 = has admin config, 0 = has no admin config boolean NO 0 Indexes # Name Fields PRIMARY id installed_name installed, name name UNIQUE, name Return to database documentation","title":"addon"},{"location":"de/spec/database/db_addon/#table-addon","text":"registered addons","title":"Table addon"},{"location":"de/spec/database/db_addon/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name addon base (file)name varchar(50) NO version currently unused varchar(50) NO installed currently always 1 boolean NO 0 hidden currently unused boolean NO 0 timestamp file timestamp to check for reloads int unsigned NO 0 plugin_admin 1 = has admin config, 0 = has no admin config boolean NO 0","title":"Fields"},{"location":"de/spec/database/db_addon/#indexes","text":"Name Fields PRIMARY id installed_name installed, name name UNIQUE, name Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_apcontact/","tags":["database","table","developer"],"text":"Table apcontact # ActivityPub compatible contacts - used in the ActivityPub implementation Fields # Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL uuid varchar(255) YES NULL type varchar(20) NO NULL following varchar(255) YES NULL followers varchar(255) YES NULL inbox varchar(255) NO NULL outbox varchar(255) YES NULL sharedinbox varchar(255) YES NULL featured Address for the collection of featured posts varchar(255) YES NULL featured-tags Address for the collection of featured tags varchar(255) YES NULL manually-approve boolean YES NULL discoverable Mastodon extension: true if profile is published in their directory boolean YES NULL nick varchar(255) NO name varchar(255) YES NULL about text YES NULL xmpp XMPP address varchar(255) YES NULL matrix Matrix address varchar(255) YES NULL photo varchar(255) YES NULL header Header picture varchar(255) YES NULL addr varchar(255) YES NULL alias varchar(255) YES NULL pubkey text YES NULL subscribe varchar(255) YES NULL baseurl baseurl of the ap contact varchar(255) YES NULL gsid Global Server ID int unsigned YES NULL generator Name of the contact's system varchar(255) YES NULL following_count Number of following contacts int unsigned YES 0 followers_count Number of followers int unsigned YES 0 statuses_count Number of posts int unsigned YES 0 updated datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY url addr addr(32) alias alias(190) followers followers(190) baseurl baseurl(190) sharedinbox sharedinbox(190) gsid gsid uri-id UNIQUE, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id gsid gserver id Return to database documentation","title":"apcontact"},{"location":"de/spec/database/db_apcontact/#table-apcontact","text":"ActivityPub compatible contacts - used in the ActivityPub implementation","title":"Table apcontact"},{"location":"de/spec/database/db_apcontact/#fields","text":"Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL uuid varchar(255) YES NULL type varchar(20) NO NULL following varchar(255) YES NULL followers varchar(255) YES NULL inbox varchar(255) NO NULL outbox varchar(255) YES NULL sharedinbox varchar(255) YES NULL featured Address for the collection of featured posts varchar(255) YES NULL featured-tags Address for the collection of featured tags varchar(255) YES NULL manually-approve boolean YES NULL discoverable Mastodon extension: true if profile is published in their directory boolean YES NULL nick varchar(255) NO name varchar(255) YES NULL about text YES NULL xmpp XMPP address varchar(255) YES NULL matrix Matrix address varchar(255) YES NULL photo varchar(255) YES NULL header Header picture varchar(255) YES NULL addr varchar(255) YES NULL alias varchar(255) YES NULL pubkey text YES NULL subscribe varchar(255) YES NULL baseurl baseurl of the ap contact varchar(255) YES NULL gsid Global Server ID int unsigned YES NULL generator Name of the contact's system varchar(255) YES NULL following_count Number of following contacts int unsigned YES 0 followers_count Number of followers int unsigned YES 0 statuses_count Number of posts int unsigned YES 0 updated datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_apcontact/#indexes","text":"Name Fields PRIMARY url addr addr(32) alias alias(190) followers followers(190) baseurl baseurl(190) sharedinbox sharedinbox(190) gsid gsid uri-id UNIQUE, uri-id","title":"Indexes"},{"location":"de/spec/database/db_apcontact/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id gsid gserver id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_application-marker/","tags":["database","table","developer"],"text":"Table application-marker # Timeline marker Fields # Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL timeline Marker (home, notifications) varchar(64) NO PRI NULL last_read_id Marker id for the timeline varchar(255) YES NULL version Version number smallint unsigned YES NULL updated_at creation time datetime YES NULL Indexes # Name Fields PRIMARY application-id, uid, timeline uid_id uid Foreign Keys # Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"application-marker"},{"location":"de/spec/database/db_application-marker/#table-application-marker","text":"Timeline marker","title":"Table application-marker"},{"location":"de/spec/database/db_application-marker/#fields","text":"Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL timeline Marker (home, notifications) varchar(64) NO PRI NULL last_read_id Marker id for the timeline varchar(255) YES NULL version Version number smallint unsigned YES NULL updated_at creation time datetime YES NULL","title":"Fields"},{"location":"de/spec/database/db_application-marker/#indexes","text":"Name Fields PRIMARY application-id, uid, timeline uid_id uid","title":"Indexes"},{"location":"de/spec/database/db_application-marker/#foreign-keys","text":"Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_application-token/","tags":["database","table","developer"],"text":"Table application-token # OAuth user token Fields # Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL code varchar(64) NO NULL access_token varchar(64) NO NULL created_at creation time datetime NO NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL Indexes # Name Fields PRIMARY application-id, uid uid_id uid, application-id Foreign Keys # Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"application-token"},{"location":"de/spec/database/db_application-token/#table-application-token","text":"OAuth user token","title":"Table application-token"},{"location":"de/spec/database/db_application-token/#fields","text":"Field Description Type Null Key Default Extra application-id int unsigned NO PRI NULL uid Owner User id mediumint unsigned NO PRI NULL code varchar(64) NO NULL access_token varchar(64) NO NULL created_at creation time datetime NO NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL","title":"Fields"},{"location":"de/spec/database/db_application-token/#indexes","text":"Name Fields PRIMARY application-id, uid uid_id uid, application-id","title":"Indexes"},{"location":"de/spec/database/db_application-token/#foreign-keys","text":"Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_application/","tags":["database","table","developer"],"text":"Table application # OAuth application Fields # Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment client_id varchar(64) NO NULL client_secret varchar(64) NO NULL name varchar(255) NO NULL redirect_uri varchar(255) NO NULL website varchar(255) YES NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL Indexes # Name Fields PRIMARY id client_id UNIQUE, client_id Return to database documentation","title":"application"},{"location":"de/spec/database/db_application/#table-application","text":"OAuth application","title":"Table application"},{"location":"de/spec/database/db_application/#fields","text":"Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment client_id varchar(64) NO NULL client_secret varchar(64) NO NULL name varchar(255) NO NULL redirect_uri varchar(255) NO NULL website varchar(255) YES NULL scopes varchar(255) YES NULL read Read scope boolean YES NULL write Write scope boolean YES NULL follow Follow scope boolean YES NULL push Push scope boolean YES NULL","title":"Fields"},{"location":"de/spec/database/db_application/#indexes","text":"Name Fields PRIMARY id client_id UNIQUE, client_id Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_attach/","tags":["database","table","developer"],"text":"Table attach # file attachments Fields # Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 hash hash varchar(64) NO filename filename of original varchar(255) NO filetype mimetype varchar(64) NO filesize size in bytes int unsigned NO 0 data file data longblob NO NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 allow_cid Access Control - list of allowed contact.id '<19><78> mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"attach"},{"location":"de/spec/database/db_attach/#table-attach","text":"file attachments","title":"Table attach"},{"location":"de/spec/database/db_attach/#fields","text":"Field Description Type Null Key Default Extra id generated index int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 hash hash varchar(64) NO filename filename of original varchar(255) NO filetype mimetype varchar(64) NO filesize size in bytes int unsigned NO 0 data file data longblob NO NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 allow_cid Access Control - list of allowed contact.id '<19><78> mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL","title":"Fields"},{"location":"de/spec/database/db_attach/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"de/spec/database/db_attach/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_cache/","tags":["database","table","developer"],"text":"Table cache # Stores temporary data Fields # Field Description Type Null Key Default Extra k cache key varbinary(255) NO PRI NULL v cached serialized value mediumtext YES NULL expires datetime of cache expiration datetime NO 0001-01-01 00:00:00 updated datetime of cache insertion datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY k k_expires k, expires Return to database documentation","title":"cache"},{"location":"de/spec/database/db_cache/#table-cache","text":"Stores temporary data","title":"Table cache"},{"location":"de/spec/database/db_cache/#fields","text":"Field Description Type Null Key Default Extra k cache key varbinary(255) NO PRI NULL v cached serialized value mediumtext YES NULL expires datetime of cache expiration datetime NO 0001-01-01 00:00:00 updated datetime of cache insertion datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_cache/#indexes","text":"Name Fields PRIMARY k k_expires k, expires Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_config/","tags":["database","table","developer"],"text":"Table config # main configuration storage Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment cat varbinary(50) NO k varbinary(50) NO v mediumtext YES NULL Indexes # Name Fields PRIMARY id cat_k UNIQUE, cat, k Return to database documentation","title":"config"},{"location":"de/spec/database/db_config/#table-config","text":"main configuration storage","title":"Table config"},{"location":"de/spec/database/db_config/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment cat varbinary(50) NO k varbinary(50) NO v mediumtext YES NULL","title":"Fields"},{"location":"de/spec/database/db_config/#indexes","text":"Name Fields PRIMARY id cat_k UNIQUE, cat, k Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_contact-relation/","tags":["database","table","developer"],"text":"Table contact-relation # Contact relations Fields # Field Description Type Null Key Default Extra cid contact the related contact had interacted with int unsigned NO PRI 0 relation-cid related contact who had interacted with the contact int unsigned NO PRI 0 last-interaction Date of the last interaction datetime NO 0001-01-01 00:00:00 follow-updated Date of the last update of the contact relationship datetime NO 0001-01-01 00:00:00 follows boolean NO 0 Indexes # Name Fields PRIMARY cid, relation-cid relation-cid relation-cid Foreign Keys # Field Target Table Target Field cid contact id relation-cid contact id Return to database documentation","title":"contact-relation"},{"location":"de/spec/database/db_contact-relation/#table-contact-relation","text":"Contact relations","title":"Table contact-relation"},{"location":"de/spec/database/db_contact-relation/#fields","text":"Field Description Type Null Key Default Extra cid contact the related contact had interacted with int unsigned NO PRI 0 relation-cid related contact who had interacted with the contact int unsigned NO PRI 0 last-interaction Date of the last interaction datetime NO 0001-01-01 00:00:00 follow-updated Date of the last update of the contact relationship datetime NO 0001-01-01 00:00:00 follows boolean NO 0","title":"Fields"},{"location":"de/spec/database/db_contact-relation/#indexes","text":"Name Fields PRIMARY cid, relation-cid relation-cid relation-cid","title":"Indexes"},{"location":"de/spec/database/db_contact-relation/#foreign-keys","text":"Field Target Table Target Field cid contact id relation-cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_contact/","tags":["database","table","developer"],"text":"Table contact # contact table Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 created datetime NO 0001-01-01 00:00:00 updated Date of last contact update datetime YES 0001-01-01 00:00:00 network Network of the contact char(4) NO name Name that this contact is known by varchar(255) NO nick Nick- and user name of the contact varchar(255) NO location varchar(255) YES about text YES NULL keywords public keywords (interests) of the contact text YES NULL xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO avatar varchar(255) NO header Header picture varchar(255) YES NULL url varchar(255) NO nurl varchar(255) NO uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL addr varchar(255) NO alias varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL batch varchar(255) NO notify varchar(255) YES NULL poll varchar(255) YES NULL subscribe varchar(255) YES NULL last-update Date of the last try to update the contact info datetime NO 0001-01-01 00:00:00 success_update Date of the last successful contact update datetime NO 0001-01-01 00:00:00 failure_update Date of the last failed update datetime NO 0001-01-01 00:00:00 failed Connection failed boolean YES NULL term-date datetime NO 0001-01-01 00:00:00 last-item date of the last post datetime NO 0001-01-01 00:00:00 last-discovery date of the last follower discovery datetime NO 0001-01-01 00:00:00 blocked Node-wide block status boolean NO 1 block_reason Node-wide block reason text YES NULL readonly posts of the contact are readonly boolean NO 0 contact-type Person, organisation, news, community, relay tinyint NO 0 manually-approve Contact requests have to be approved manually boolean YES NULL archive boolean NO 0 unsearchable Contact prefers to not be searchable boolean NO 0 sensitive Contact posts sensitive content boolean NO 0 baseurl baseurl of the contact varchar(255) YES gsid Global Server ID int unsigned YES NULL bd date NO 0001-01-01 reason text YES NULL self 1 if the contact is the user him/her self boolean NO 0 remote_self boolean NO 0 rel The kind of the relation between the user and the contact tinyint unsigned NO 0 protocol Protocol of the contact char(4) NO subhub boolean NO 0 hub-verify varchar(255) NO rating Automatically detected feed poll frequency tinyint NO 0 priority Feed poll priority tinyint unsigned NO 0 attag varchar(255) NO hidden boolean NO 0 pending Contact request is pending boolean NO 1 deleted Contact has been deleted boolean NO 0 info mediumtext YES NULL notify_new_posts boolean NO 0 fetch_further_information tinyint unsigned NO 0 ffi_keyword_denylist text YES NULL photo Link to the profile photo of the contact varchar(255) YES thumb Link to the profile photo (thumb size) varchar(255) YES micro Link to the profile photo (micro size) varchar(255) YES name-date datetime NO 0001-01-01 00:00:00 uri-date datetime NO 0001-01-01 00:00:00 avatar-date datetime NO 0001-01-01 00:00:00 request varchar(255) YES NULL confirm varchar(255) YES NULL poco varchar(255) YES NULL writable boolean NO 0 forum contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead boolean NO 0 prv contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead boolean NO 0 bdyear varchar(4) NO site-pubkey Deprecated text YES NULL gender Deprecated varchar(32) NO duplex Deprecated boolean NO 0 issued-id Deprecated varchar(255) NO dfrn-id Deprecated varchar(255) NO aes_allow Deprecated boolean NO 0 ret-aes Deprecated boolean NO 0 usehub Deprecated boolean NO 0 closeness Deprecated tinyint unsigned NO 99 profile-id Deprecated int unsigned YES NULL Indexes # Name Fields PRIMARY id uid_name uid, name(190) self_uid self, uid alias_uid alias(128), uid pending_uid pending, uid blocked_uid blocked, uid uid_rel_network_poll uid, rel, network, poll(64), archive uid_network_batch uid, network, batch(64) batch_contact-type batch(64), contact-type addr_uid addr(128), uid nurl_uid nurl(128), uid nick_uid nick(128), uid attag_uid attag(96), uid network_uid_lastupdate network, uid, last-update uid_network_self_lastupdate uid, network, self, last-update uid_lastitem uid, last-item baseurl baseurl(64) uid_contact-type uid, contact-type uid_self_contact-type uid, self, contact-type self_network_uid self, network, uid gsid gsid uri-id uri-id Foreign Keys # Field Target Table Target Field uid user uid uri-id item-uri id gsid gserver id Return to database documentation","title":"contact"},{"location":"de/spec/database/db_contact/#table-contact","text":"contact table","title":"Table contact"},{"location":"de/spec/database/db_contact/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 created datetime NO 0001-01-01 00:00:00 updated Date of last contact update datetime YES 0001-01-01 00:00:00 network Network of the contact char(4) NO name Name that this contact is known by varchar(255) NO nick Nick- and user name of the contact varchar(255) NO location varchar(255) YES about text YES NULL keywords public keywords (interests) of the contact text YES NULL xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO avatar varchar(255) NO header Header picture varchar(255) YES NULL url varchar(255) NO nurl varchar(255) NO uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL addr varchar(255) NO alias varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL batch varchar(255) NO notify varchar(255) YES NULL poll varchar(255) YES NULL subscribe varchar(255) YES NULL last-update Date of the last try to update the contact info datetime NO 0001-01-01 00:00:00 success_update Date of the last successful contact update datetime NO 0001-01-01 00:00:00 failure_update Date of the last failed update datetime NO 0001-01-01 00:00:00 failed Connection failed boolean YES NULL term-date datetime NO 0001-01-01 00:00:00 last-item date of the last post datetime NO 0001-01-01 00:00:00 last-discovery date of the last follower discovery datetime NO 0001-01-01 00:00:00 blocked Node-wide block status boolean NO 1 block_reason Node-wide block reason text YES NULL readonly posts of the contact are readonly boolean NO 0 contact-type Person, organisation, news, community, relay tinyint NO 0 manually-approve Contact requests have to be approved manually boolean YES NULL archive boolean NO 0 unsearchable Contact prefers to not be searchable boolean NO 0 sensitive Contact posts sensitive content boolean NO 0 baseurl baseurl of the contact varchar(255) YES gsid Global Server ID int unsigned YES NULL bd date NO 0001-01-01 reason text YES NULL self 1 if the contact is the user him/her self boolean NO 0 remote_self boolean NO 0 rel The kind of the relation between the user and the contact tinyint unsigned NO 0 protocol Protocol of the contact char(4) NO subhub boolean NO 0 hub-verify varchar(255) NO rating Automatically detected feed poll frequency tinyint NO 0 priority Feed poll priority tinyint unsigned NO 0 attag varchar(255) NO hidden boolean NO 0 pending Contact request is pending boolean NO 1 deleted Contact has been deleted boolean NO 0 info mediumtext YES NULL notify_new_posts boolean NO 0 fetch_further_information tinyint unsigned NO 0 ffi_keyword_denylist text YES NULL photo Link to the profile photo of the contact varchar(255) YES thumb Link to the profile photo (thumb size) varchar(255) YES micro Link to the profile photo (micro size) varchar(255) YES name-date datetime NO 0001-01-01 00:00:00 uri-date datetime NO 0001-01-01 00:00:00 avatar-date datetime NO 0001-01-01 00:00:00 request varchar(255) YES NULL confirm varchar(255) YES NULL poco varchar(255) YES NULL writable boolean NO 0 forum contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead boolean NO 0 prv contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead boolean NO 0 bdyear varchar(4) NO site-pubkey Deprecated text YES NULL gender Deprecated varchar(32) NO duplex Deprecated boolean NO 0 issued-id Deprecated varchar(255) NO dfrn-id Deprecated varchar(255) NO aes_allow Deprecated boolean NO 0 ret-aes Deprecated boolean NO 0 usehub Deprecated boolean NO 0 closeness Deprecated tinyint unsigned NO 99 profile-id Deprecated int unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_contact/#indexes","text":"Name Fields PRIMARY id uid_name uid, name(190) self_uid self, uid alias_uid alias(128), uid pending_uid pending, uid blocked_uid blocked, uid uid_rel_network_poll uid, rel, network, poll(64), archive uid_network_batch uid, network, batch(64) batch_contact-type batch(64), contact-type addr_uid addr(128), uid nurl_uid nurl(128), uid nick_uid nick(128), uid attag_uid attag(96), uid network_uid_lastupdate network, uid, last-update uid_network_self_lastupdate uid, network, self, last-update uid_lastitem uid, last-item baseurl baseurl(64) uid_contact-type uid, contact-type uid_self_contact-type uid, self, contact-type self_network_uid self, network, uid gsid gsid uri-id uri-id","title":"Indexes"},{"location":"de/spec/database/db_contact/#foreign-keys","text":"Field Target Table Target Field uid user uid uri-id item-uri id gsid gserver id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_conv/","tags":["database","table","developer"],"text":"Table conv # private messages Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid A unique identifier for this conversation varchar(255) NO recips sender_handle;recipient_handle text YES NULL uid Owner User id mediumint unsigned NO 0 creator handle of creator varchar(255) NO created creation timestamp datetime NO 0001-01-01 00:00:00 updated edited timestamp datetime NO 0001-01-01 00:00:00 subject subject of initial message text YES NULL Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"conv"},{"location":"de/spec/database/db_conv/#table-conv","text":"private messages","title":"Table conv"},{"location":"de/spec/database/db_conv/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid A unique identifier for this conversation varchar(255) NO recips sender_handle;recipient_handle text YES NULL uid Owner User id mediumint unsigned NO 0 creator handle of creator varchar(255) NO created creation timestamp datetime NO 0001-01-01 00:00:00 updated edited timestamp datetime NO 0001-01-01 00:00:00 subject subject of initial message text YES NULL","title":"Fields"},{"location":"de/spec/database/db_conv/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"de/spec/database/db_conv/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_conversation/","tags":["database","table","developer"],"text":"Table conversation # Raw data and structure information for messages Fields # Field Description Type Null Key Default Extra item-uri Original URI of the item - unrelated to the table with the same name varbinary(255) NO PRI NULL reply-to-uri URI to which this item is a reply varbinary(255) NO conversation-uri GNU Social conversation URI varbinary(255) NO conversation-href GNU Social conversation link varbinary(255) NO protocol The protocol of the item tinyint unsigned NO 255 direction How the message arrived here: 1=push, 2=pull tinyint unsigned NO 0 source Original source mediumtext YES NULL received Receiving date datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY item-uri conversation-uri conversation-uri received received Return to database documentation","title":"conversation"},{"location":"de/spec/database/db_conversation/#table-conversation","text":"Raw data and structure information for messages","title":"Table conversation"},{"location":"de/spec/database/db_conversation/#fields","text":"Field Description Type Null Key Default Extra item-uri Original URI of the item - unrelated to the table with the same name varbinary(255) NO PRI NULL reply-to-uri URI to which this item is a reply varbinary(255) NO conversation-uri GNU Social conversation URI varbinary(255) NO conversation-href GNU Social conversation link varbinary(255) NO protocol The protocol of the item tinyint unsigned NO 255 direction How the message arrived here: 1=push, 2=pull tinyint unsigned NO 0 source Original source mediumtext YES NULL received Receiving date datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_conversation/#indexes","text":"Name Fields PRIMARY item-uri conversation-uri conversation-uri received received Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_delayed-post/","tags":["database","table","developer"],"text":"Table delayed-post # Posts that are about to be distributed at a later time Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of the post that will be distributed later varchar(255) YES NULL uid Owner User id mediumint unsigned YES NULL delayed delay time datetime YES NULL wid Workerqueue id int unsigned YES NULL Indexes # Name Fields PRIMARY id uid_uri UNIQUE, uid, uri(190) wid wid Foreign Keys # Field Target Table Target Field uid user uid wid workerqueue id Return to database documentation","title":"delayed-post"},{"location":"de/spec/database/db_delayed-post/#table-delayed-post","text":"Posts that are about to be distributed at a later time","title":"Table delayed-post"},{"location":"de/spec/database/db_delayed-post/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of the post that will be distributed later varchar(255) YES NULL uid Owner User id mediumint unsigned YES NULL delayed delay time datetime YES NULL wid Workerqueue id int unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_delayed-post/#indexes","text":"Name Fields PRIMARY id uid_uri UNIQUE, uid, uri(190) wid wid","title":"Indexes"},{"location":"de/spec/database/db_delayed-post/#foreign-keys","text":"Field Target Table Target Field uid user uid wid workerqueue id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_diaspora-interaction/","tags":["database","table","developer"],"text":"Table diaspora-interaction # Signed Diaspora Interaction Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL interaction The Diaspora interaction mediumtext YES NULL Indexes # Name Fields PRIMARY uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"diaspora-interaction"},{"location":"de/spec/database/db_diaspora-interaction/#table-diaspora-interaction","text":"Signed Diaspora Interaction","title":"Table diaspora-interaction"},{"location":"de/spec/database/db_diaspora-interaction/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL interaction The Diaspora interaction mediumtext YES NULL","title":"Fields"},{"location":"de/spec/database/db_diaspora-interaction/#indexes","text":"Name Fields PRIMARY uri-id","title":"Indexes"},{"location":"de/spec/database/db_diaspora-interaction/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_endpoint/","tags":["database","table","developer"],"text":"Table endpoint # ActivityPub endpoints - used in the ActivityPub implementation Fields # Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL type varchar(20) NO NULL owner-uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL Indexes # Name Fields PRIMARY url owner-uri-id_type UNIQUE, owner-uri-id, type Foreign Keys # Field Target Table Target Field owner-uri-id item-uri id Return to database documentation","title":"endpoint"},{"location":"de/spec/database/db_endpoint/#table-endpoint","text":"ActivityPub endpoints - used in the ActivityPub implementation","title":"Table endpoint"},{"location":"de/spec/database/db_endpoint/#fields","text":"Field Description Type Null Key Default Extra url URL of the contact varbinary(255) NO PRI NULL type varchar(20) NO NULL owner-uri-id Id of the item-uri table entry that contains the apcontact url int unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_endpoint/#indexes","text":"Name Fields PRIMARY url owner-uri-id_type UNIQUE, owner-uri-id, type","title":"Indexes"},{"location":"de/spec/database/db_endpoint/#foreign-keys","text":"Field Target Table Target Field owner-uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_event/","tags":["database","table","developer"],"text":"Table event # Events Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid varchar(255) NO uid Owner User id mediumint unsigned NO 0 cid contact_id (ID of the contact in contact table) int unsigned NO 0 uri varchar(255) NO uri-id Id of the item-uri table entry that contains the event uri int unsigned YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 start event start time datetime NO 0001-01-01 00:00:00 finish event end time datetime NO 0001-01-01 00:00:00 summary short description or title of the event text YES NULL desc event description text YES NULL location event location text YES NULL type event or birthday varchar(20) NO nofinish if event does have no end this is 1 boolean NO 0 ignore 0 or 1 boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL Indexes # Name Fields PRIMARY id uid_start uid, start cid cid uri-id uri-id Foreign Keys # Field Target Table Target Field uid user uid cid contact id uri-id item-uri id Return to database documentation","title":"event"},{"location":"de/spec/database/db_event/#table-event","text":"Events","title":"Table event"},{"location":"de/spec/database/db_event/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid varchar(255) NO uid Owner User id mediumint unsigned NO 0 cid contact_id (ID of the contact in contact table) int unsigned NO 0 uri varchar(255) NO uri-id Id of the item-uri table entry that contains the event uri int unsigned YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 start event start time datetime NO 0001-01-01 00:00:00 finish event end time datetime NO 0001-01-01 00:00:00 summary short description or title of the event text YES NULL desc event description text YES NULL location event location text YES NULL type event or birthday varchar(20) NO nofinish if event does have no end this is 1 boolean NO 0 ignore 0 or 1 boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL","title":"Fields"},{"location":"de/spec/database/db_event/#indexes","text":"Name Fields PRIMARY id uid_start uid, start cid cid uri-id uri-id","title":"Indexes"},{"location":"de/spec/database/db_event/#foreign-keys","text":"Field Target Table Target Field uid user uid cid contact id uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_fcontact/","tags":["database","table","developer"],"text":"Table fcontact # Diaspora compatible contacts - used in the Diaspora implementation Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid unique id varchar(255) NO url varchar(255) NO uri-id Id of the item-uri table entry that contains the fcontact url int unsigned YES NULL name varchar(255) NO photo varchar(255) NO request varchar(255) NO nick varchar(255) NO addr varchar(255) NO batch varchar(255) NO notify varchar(255) NO poll varchar(255) NO confirm varchar(255) NO priority tinyint unsigned NO 0 network char(4) NO alias varchar(255) NO pubkey text YES NULL updated datetime NO 0001-01-01 00:00:00 interacting_count Number of contacts this contact interactes with int unsigned YES 0 interacted_count Number of contacts that interacted with this contact int unsigned YES 0 post_count Number of posts and comments int unsigned YES 0 Indexes # Name Fields PRIMARY id addr addr(32) url UNIQUE, url(190) uri-id UNIQUE, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"fcontact"},{"location":"de/spec/database/db_fcontact/#table-fcontact","text":"Diaspora compatible contacts - used in the Diaspora implementation","title":"Table fcontact"},{"location":"de/spec/database/db_fcontact/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment guid unique id varchar(255) NO url varchar(255) NO uri-id Id of the item-uri table entry that contains the fcontact url int unsigned YES NULL name varchar(255) NO photo varchar(255) NO request varchar(255) NO nick varchar(255) NO addr varchar(255) NO batch varchar(255) NO notify varchar(255) NO poll varchar(255) NO confirm varchar(255) NO priority tinyint unsigned NO 0 network char(4) NO alias varchar(255) NO pubkey text YES NULL updated datetime NO 0001-01-01 00:00:00 interacting_count Number of contacts this contact interactes with int unsigned YES 0 interacted_count Number of contacts that interacted with this contact int unsigned YES 0 post_count Number of posts and comments int unsigned YES 0","title":"Fields"},{"location":"de/spec/database/db_fcontact/#indexes","text":"Name Fields PRIMARY id addr addr(32) url UNIQUE, url(190) uri-id UNIQUE, uri-id","title":"Indexes"},{"location":"de/spec/database/db_fcontact/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_fsuggest/","tags":["database","table","developer"],"text":"Table fsuggest # friend suggestion stuff Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cid int unsigned NO 0 name varchar(255) NO url varchar(255) NO request varchar(255) NO photo varchar(255) NO note text YES NULL created datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id cid cid uid uid Foreign Keys # Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"fsuggest"},{"location":"de/spec/database/db_fsuggest/#table-fsuggest","text":"friend suggestion stuff","title":"Table fsuggest"},{"location":"de/spec/database/db_fsuggest/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cid int unsigned NO 0 name varchar(255) NO url varchar(255) NO request varchar(255) NO photo varchar(255) NO note text YES NULL created datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_fsuggest/#indexes","text":"Name Fields PRIMARY id cid cid uid uid","title":"Indexes"},{"location":"de/spec/database/db_fsuggest/#foreign-keys","text":"Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_group/","tags":["database","table","developer"],"text":"Table group # privacy groups, group info Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 visible 1 indicates the member list is not private boolean NO 0 deleted 1 indicates the group has been deleted boolean NO 0 cid Contact id of forum. When this field is filled then the members are synced automatically. int unsigned YES NULL name human readable name of group varchar(255) NO Indexes # Name Fields PRIMARY id uid uid cid cid Foreign Keys # Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"group"},{"location":"de/spec/database/db_group/#table-group","text":"privacy groups, group info","title":"Table group"},{"location":"de/spec/database/db_group/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 visible 1 indicates the member list is not private boolean NO 0 deleted 1 indicates the group has been deleted boolean NO 0 cid Contact id of forum. When this field is filled then the members are synced automatically. int unsigned YES NULL name human readable name of group varchar(255) NO","title":"Fields"},{"location":"de/spec/database/db_group/#indexes","text":"Name Fields PRIMARY id uid uid cid cid","title":"Indexes"},{"location":"de/spec/database/db_group/#foreign-keys","text":"Field Target Table Target Field uid user uid cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_group_member/","tags":["database","table","developer"],"text":"Table group_member # privacy groups, member info Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment gid groups.id of the associated group int unsigned NO 0 contact-id contact.id of the member assigned to the associated group int unsigned NO 0 Indexes # Name Fields PRIMARY id contactid contact-id gid_contactid UNIQUE, gid, contact-id Foreign Keys # Field Target Table Target Field gid group id contact-id contact id Return to database documentation","title":"group_member"},{"location":"de/spec/database/db_group_member/#table-group_member","text":"privacy groups, member info","title":"Table group_member"},{"location":"de/spec/database/db_group_member/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment gid groups.id of the associated group int unsigned NO 0 contact-id contact.id of the member assigned to the associated group int unsigned NO 0","title":"Fields"},{"location":"de/spec/database/db_group_member/#indexes","text":"Name Fields PRIMARY id contactid contact-id gid_contactid UNIQUE, gid, contact-id","title":"Indexes"},{"location":"de/spec/database/db_group_member/#foreign-keys","text":"Field Target Table Target Field gid group id contact-id contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_gserver-tag/","tags":["database","table","developer"],"text":"Table gserver-tag # Tags that the server has subscribed Fields # Field Description Type Null Key Default Extra gserver-id The id of the gserver int unsigned NO PRI 0 tag Tag that the server has subscribed varchar(100) NO PRI Indexes # Name Fields PRIMARY gserver-id, tag tag tag Foreign Keys # Field Target Table Target Field gserver-id gserver id Return to database documentation","title":"gserver-tag"},{"location":"de/spec/database/db_gserver-tag/#table-gserver-tag","text":"Tags that the server has subscribed","title":"Table gserver-tag"},{"location":"de/spec/database/db_gserver-tag/#fields","text":"Field Description Type Null Key Default Extra gserver-id The id of the gserver int unsigned NO PRI 0 tag Tag that the server has subscribed varchar(100) NO PRI","title":"Fields"},{"location":"de/spec/database/db_gserver-tag/#indexes","text":"Name Fields PRIMARY gserver-id, tag tag tag","title":"Indexes"},{"location":"de/spec/database/db_gserver-tag/#foreign-keys","text":"Field Target Table Target Field gserver-id gserver id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_gserver/","tags":["database","table","developer"],"text":"Table gserver # Global servers Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment url varchar(255) NO nurl varchar(255) NO version varchar(255) NO site_name varchar(255) NO info text YES NULL register_policy tinyint NO 0 registered-users Number of registered users int unsigned NO 0 active-week-users Number of active users in the last week int unsigned YES NULL active-month-users Number of active users in the last month int unsigned YES NULL active-halfyear-users Number of active users in the last six month int unsigned YES NULL local-posts Number of local posts int unsigned YES NULL local-comments Number of local comments int unsigned YES NULL directory-type Type of directory service (Poco, Mastodon) tinyint YES 0 poco varchar(255) NO noscrape varchar(255) NO network char(4) NO protocol The protocol of the server tinyint unsigned YES NULL platform varchar(255) NO relay-subscribe Has the server subscribed to the relay system boolean NO 0 relay-scope The scope of messages that the server wants to get varchar(10) NO detection-method Method that had been used to detect that server tinyint unsigned YES NULL created datetime NO 0001-01-01 00:00:00 last_poco_query datetime YES 0001-01-01 00:00:00 last_contact Last successful connection request datetime YES 0001-01-01 00:00:00 last_failure Last failed connection request datetime YES 0001-01-01 00:00:00 failed Connection failed boolean YES NULL next_contact Next connection request datetime YES 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id nurl UNIQUE, nurl(190) next_contact next_contact network network Return to database documentation","title":"gserver"},{"location":"de/spec/database/db_gserver/#table-gserver","text":"Global servers","title":"Table gserver"},{"location":"de/spec/database/db_gserver/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment url varchar(255) NO nurl varchar(255) NO version varchar(255) NO site_name varchar(255) NO info text YES NULL register_policy tinyint NO 0 registered-users Number of registered users int unsigned NO 0 active-week-users Number of active users in the last week int unsigned YES NULL active-month-users Number of active users in the last month int unsigned YES NULL active-halfyear-users Number of active users in the last six month int unsigned YES NULL local-posts Number of local posts int unsigned YES NULL local-comments Number of local comments int unsigned YES NULL directory-type Type of directory service (Poco, Mastodon) tinyint YES 0 poco varchar(255) NO noscrape varchar(255) NO network char(4) NO protocol The protocol of the server tinyint unsigned YES NULL platform varchar(255) NO relay-subscribe Has the server subscribed to the relay system boolean NO 0 relay-scope The scope of messages that the server wants to get varchar(10) NO detection-method Method that had been used to detect that server tinyint unsigned YES NULL created datetime NO 0001-01-01 00:00:00 last_poco_query datetime YES 0001-01-01 00:00:00 last_contact Last successful connection request datetime YES 0001-01-01 00:00:00 last_failure Last failed connection request datetime YES 0001-01-01 00:00:00 failed Connection failed boolean YES NULL next_contact Next connection request datetime YES 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_gserver/#indexes","text":"Name Fields PRIMARY id nurl UNIQUE, nurl(190) next_contact next_contact network network Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_hook/","tags":["database","table","developer"],"text":"Table hook # addon hook registry Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hook name of hook varbinary(100) NO file relative filename of hook handler varbinary(200) NO function function name of hook handler varbinary(200) NO priority not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order smallint unsigned NO 0 Indexes # Name Fields PRIMARY id priority priority hook_file_function UNIQUE, hook, file, function Return to database documentation","title":"hook"},{"location":"de/spec/database/db_hook/#table-hook","text":"addon hook registry","title":"Table hook"},{"location":"de/spec/database/db_hook/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hook name of hook varbinary(100) NO file relative filename of hook handler varbinary(200) NO function function name of hook handler varbinary(200) NO priority not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order smallint unsigned NO 0","title":"Fields"},{"location":"de/spec/database/db_hook/#indexes","text":"Name Fields PRIMARY id priority priority hook_file_function UNIQUE, hook, file, function Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_inbox-entry-receiver/","tags":["database","table","developer"],"text":"Table inbox-entry-receiver # Receiver for the incoming activity Fields # Field Description Type Null Key Default Extra queue-id int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI NULL Indexes # Name Fields PRIMARY queue-id, uid uid uid Foreign Keys # Field Target Table Target Field queue-id inbox-entry id uid user uid Return to database documentation","title":"inbox-entry-receiver"},{"location":"de/spec/database/db_inbox-entry-receiver/#table-inbox-entry-receiver","text":"Receiver for the incoming activity","title":"Table inbox-entry-receiver"},{"location":"de/spec/database/db_inbox-entry-receiver/#fields","text":"Field Description Type Null Key Default Extra queue-id int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI NULL","title":"Fields"},{"location":"de/spec/database/db_inbox-entry-receiver/#indexes","text":"Name Fields PRIMARY queue-id, uid uid uid","title":"Indexes"},{"location":"de/spec/database/db_inbox-entry-receiver/#foreign-keys","text":"Field Target Table Target Field queue-id inbox-entry id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_inbox-entry/","tags":["database","table","developer"],"text":"Table inbox-entry # Incoming activity Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment activity-id id of the incoming activity varbinary(255) YES NULL object-id varbinary(255) YES NULL in-reply-to-id varbinary(255) YES NULL conversation varbinary(255) YES NULL type Type of the activity varchar(64) YES NULL object-type Type of the object activity varchar(64) YES NULL object-object-type Type of the object's object activity varchar(64) YES NULL received Receiving date datetime YES NULL activity The JSON activity mediumtext YES NULL signer varchar(255) YES NULL push Is the entry pushed or have pulled it? boolean YES NULL trust Do we trust this entry? boolean YES NULL wid Workerqueue id int unsigned YES NULL Indexes # Name Fields PRIMARY id activity-id UNIQUE, activity-id object-id object-id received received wid wid Foreign Keys # Field Target Table Target Field wid workerqueue id Return to database documentation","title":"inbox-entry"},{"location":"de/spec/database/db_inbox-entry/#table-inbox-entry","text":"Incoming activity","title":"Table inbox-entry"},{"location":"de/spec/database/db_inbox-entry/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment activity-id id of the incoming activity varbinary(255) YES NULL object-id varbinary(255) YES NULL in-reply-to-id varbinary(255) YES NULL conversation varbinary(255) YES NULL type Type of the activity varchar(64) YES NULL object-type Type of the object activity varchar(64) YES NULL object-object-type Type of the object's object activity varchar(64) YES NULL received Receiving date datetime YES NULL activity The JSON activity mediumtext YES NULL signer varchar(255) YES NULL push Is the entry pushed or have pulled it? boolean YES NULL trust Do we trust this entry? boolean YES NULL wid Workerqueue id int unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_inbox-entry/#indexes","text":"Name Fields PRIMARY id activity-id UNIQUE, activity-id object-id object-id received received wid wid","title":"Indexes"},{"location":"de/spec/database/db_inbox-entry/#foreign-keys","text":"Field Target Table Target Field wid workerqueue id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_inbox-status/","tags":["database","table","developer"],"text":"Table inbox-status # Status of ActivityPub inboxes Fields # Field Description Type Null Key Default Extra url URL of the inbox varbinary(255) NO PRI NULL uri-id Item-uri id of inbox url int unsigned YES NULL created Creation date of this entry datetime NO 0001-01-01 00:00:00 success Date of the last successful delivery datetime NO 0001-01-01 00:00:00 failure Date of the last failed delivery datetime NO 0001-01-01 00:00:00 previous Previous delivery date datetime NO 0001-01-01 00:00:00 archive Is the inbox archived? boolean NO 0 shared Is it a shared inbox? boolean NO 0 Indexes # Name Fields PRIMARY url uri-id uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"inbox-status"},{"location":"de/spec/database/db_inbox-status/#table-inbox-status","text":"Status of ActivityPub inboxes","title":"Table inbox-status"},{"location":"de/spec/database/db_inbox-status/#fields","text":"Field Description Type Null Key Default Extra url URL of the inbox varbinary(255) NO PRI NULL uri-id Item-uri id of inbox url int unsigned YES NULL created Creation date of this entry datetime NO 0001-01-01 00:00:00 success Date of the last successful delivery datetime NO 0001-01-01 00:00:00 failure Date of the last failed delivery datetime NO 0001-01-01 00:00:00 previous Previous delivery date datetime NO 0001-01-01 00:00:00 archive Is the inbox archived? boolean NO 0 shared Is it a shared inbox? boolean NO 0","title":"Fields"},{"location":"de/spec/database/db_inbox-status/#indexes","text":"Name Fields PRIMARY url uri-id uri-id","title":"Indexes"},{"location":"de/spec/database/db_inbox-status/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_intro/","tags":["database","table","developer"],"text":"Table intro # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 fid deprecated int unsigned YES NULL contact-id int unsigned NO 0 suggest-cid Suggested contact int unsigned YES NULL knowyou boolean NO 0 duplex deprecated boolean NO 0 note text YES NULL hash varchar(255) NO datetime datetime NO 0001-01-01 00:00:00 blocked deprecated boolean NO 0 ignore boolean NO 0 Indexes # Name Fields PRIMARY id contact-id contact-id suggest-cid suggest-cid uid uid Foreign Keys # Field Target Table Target Field uid user uid contact-id contact id suggest-cid contact id Return to database documentation","title":"intro"},{"location":"de/spec/database/db_intro/#table-intro","text":"","title":"Table intro"},{"location":"de/spec/database/db_intro/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 fid deprecated int unsigned YES NULL contact-id int unsigned NO 0 suggest-cid Suggested contact int unsigned YES NULL knowyou boolean NO 0 duplex deprecated boolean NO 0 note text YES NULL hash varchar(255) NO datetime datetime NO 0001-01-01 00:00:00 blocked deprecated boolean NO 0 ignore boolean NO 0","title":"Fields"},{"location":"de/spec/database/db_intro/#indexes","text":"Name Fields PRIMARY id contact-id contact-id suggest-cid suggest-cid uid uid","title":"Indexes"},{"location":"de/spec/database/db_intro/#foreign-keys","text":"Field Target Table Target Field uid user uid contact-id contact id suggest-cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_item-uri/","tags":["database","table","developer"],"text":"Table item-uri # URI and GUID for items Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of an item varbinary(255) NO NULL guid A unique identifier for an item varbinary(255) YES NULL Indexes # Name Fields PRIMARY id uri UNIQUE, uri guid guid Return to database documentation","title":"item-uri"},{"location":"de/spec/database/db_item-uri/#table-item-uri","text":"URI and GUID for items","title":"Table item-uri"},{"location":"de/spec/database/db_item-uri/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri URI of an item varbinary(255) NO NULL guid A unique identifier for an item varbinary(255) YES NULL","title":"Fields"},{"location":"de/spec/database/db_item-uri/#indexes","text":"Name Fields PRIMARY id uri UNIQUE, uri guid guid Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_locks/","tags":["database","table","developer"],"text":"Table locks # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment name varchar(128) NO locked boolean NO 0 pid Process ID int unsigned NO 0 expires datetime of cache expiration datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id name_expires name, expires Return to database documentation","title":"locks"},{"location":"de/spec/database/db_locks/#table-locks","text":"","title":"Table locks"},{"location":"de/spec/database/db_locks/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment name varchar(128) NO locked boolean NO 0 pid Process ID int unsigned NO 0 expires datetime of cache expiration datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_locks/#indexes","text":"Name Fields PRIMARY id name_expires name, expires Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_mail/","tags":["database","table","developer"],"text":"Table mail # private messages Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 guid A unique identifier for this private message varchar(255) NO from-name name of the sender varchar(255) NO from-photo contact photo link of the sender varchar(255) NO from-url profile linke of the sender varchar(255) NO contact-id contact.id varchar(255) YES NULL author-id Link to the contact table with uid=0 of the author of the mail int unsigned YES NULL convid conv.id int unsigned YES NULL title varchar(255) NO body mediumtext YES NULL seen if message visited it is 1 boolean NO 0 reply boolean NO 0 replied boolean NO 0 unknown if sender not in the contact table this is 1 boolean NO 0 uri varchar(255) NO uri-id Item-uri id of the related mail int unsigned YES NULL parent-uri varchar(255) NO parent-uri-id Item-uri id of the parent of the related mail int unsigned YES NULL thr-parent varchar(255) YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL created creation time of the private message datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid_seen uid, seen convid convid uri uri(64) parent-uri parent-uri(64) contactid contact-id(32) author-id author-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id Foreign Keys # Field Target Table Target Field uid user uid author-id contact id uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id Return to database documentation","title":"mail"},{"location":"de/spec/database/db_mail/#table-mail","text":"private messages","title":"Table mail"},{"location":"de/spec/database/db_mail/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 guid A unique identifier for this private message varchar(255) NO from-name name of the sender varchar(255) NO from-photo contact photo link of the sender varchar(255) NO from-url profile linke of the sender varchar(255) NO contact-id contact.id varchar(255) YES NULL author-id Link to the contact table with uid=0 of the author of the mail int unsigned YES NULL convid conv.id int unsigned YES NULL title varchar(255) NO body mediumtext YES NULL seen if message visited it is 1 boolean NO 0 reply boolean NO 0 replied boolean NO 0 unknown if sender not in the contact table this is 1 boolean NO 0 uri varchar(255) NO uri-id Item-uri id of the related mail int unsigned YES NULL parent-uri varchar(255) NO parent-uri-id Item-uri id of the parent of the related mail int unsigned YES NULL thr-parent varchar(255) YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL created creation time of the private message datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_mail/#indexes","text":"Name Fields PRIMARY id uid_seen uid, seen convid convid uri uri(64) parent-uri parent-uri(64) contactid contact-id(32) author-id author-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id","title":"Indexes"},{"location":"de/spec/database/db_mail/#foreign-keys","text":"Field Target Table Target Field uid user uid author-id contact id uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_mailacct/","tags":["database","table","developer"],"text":"Table mailacct # Mail account data for fetching mails Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 server varchar(255) NO port smallint unsigned NO 0 ssltype varchar(16) NO mailbox varchar(255) NO user varchar(255) NO pass text YES NULL reply_to varchar(255) NO action tinyint unsigned NO 0 movetofolder varchar(255) NO pubmail boolean NO 0 last_check datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"mailacct"},{"location":"de/spec/database/db_mailacct/#table-mailacct","text":"Mail account data for fetching mails","title":"Table mailacct"},{"location":"de/spec/database/db_mailacct/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 server varchar(255) NO port smallint unsigned NO 0 ssltype varchar(16) NO mailbox varchar(255) NO user varchar(255) NO pass text YES NULL reply_to varchar(255) NO action tinyint unsigned NO 0 movetofolder varchar(255) NO pubmail boolean NO 0 last_check datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_mailacct/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"de/spec/database/db_mailacct/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_manage/","tags":["database","table","developer"],"text":"Table manage # table of accounts that can manage each other Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 mid User id mediumint unsigned NO 0 Indexes # Name Fields PRIMARY id uid_mid UNIQUE, uid, mid mid mid Foreign Keys # Field Target Table Target Field uid user uid mid user uid Return to database documentation","title":"manage"},{"location":"de/spec/database/db_manage/#table-manage","text":"table of accounts that can manage each other","title":"Table manage"},{"location":"de/spec/database/db_manage/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 mid User id mediumint unsigned NO 0","title":"Fields"},{"location":"de/spec/database/db_manage/#indexes","text":"Name Fields PRIMARY id uid_mid UNIQUE, uid, mid mid mid","title":"Indexes"},{"location":"de/spec/database/db_manage/#foreign-keys","text":"Field Target Table Target Field uid user uid mid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_notification/","tags":["database","table","developer"],"text":"Table notification # notifications Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned YES NULL vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL type smallint unsigned YES NULL actor-id Link to the contact table with uid=0 of the actor that caused the notification int unsigned YES NULL target-uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL created datetime YES NULL seen Seen on the desktop boolean YES 0 dismissed Dismissed via the API boolean YES 0 Indexes # Name Fields PRIMARY id uid_vid_type_actor-id_target-uri-id UNIQUE, uid, vid, type, actor-id, target-uri-id vid vid actor-id actor-id target-uri-id target-uri-id parent-uri-id parent-uri-id seen_uid seen, uid Foreign Keys # Field Target Table Target Field uid user uid vid verb id actor-id contact id target-uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"notification"},{"location":"de/spec/database/db_notification/#table-notification","text":"notifications","title":"Table notification"},{"location":"de/spec/database/db_notification/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned YES NULL vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL type smallint unsigned YES NULL actor-id Link to the contact table with uid=0 of the actor that caused the notification int unsigned YES NULL target-uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL created datetime YES NULL seen Seen on the desktop boolean YES 0 dismissed Dismissed via the API boolean YES 0","title":"Fields"},{"location":"de/spec/database/db_notification/#indexes","text":"Name Fields PRIMARY id uid_vid_type_actor-id_target-uri-id UNIQUE, uid, vid, type, actor-id, target-uri-id vid vid actor-id actor-id target-uri-id target-uri-id parent-uri-id parent-uri-id seen_uid seen, uid","title":"Indexes"},{"location":"de/spec/database/db_notification/#foreign-keys","text":"Field Target Table Target Field uid user uid vid verb id actor-id contact id target-uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_notify-threads/","tags":["database","table","developer"],"text":"Table notify-threads # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment notify-id int unsigned NO 0 master-parent-item Deprecated int unsigned YES NULL master-parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL parent-item int unsigned NO 0 receiver-uid User id mediumint unsigned NO 0 Indexes # Name Fields PRIMARY id master-parent-uri-id master-parent-uri-id receiver-uid receiver-uid notify-id notify-id Foreign Keys # Field Target Table Target Field notify-id notify id master-parent-uri-id item-uri id receiver-uid user uid Return to database documentation","title":"notify-threads"},{"location":"de/spec/database/db_notify-threads/#table-notify-threads","text":"","title":"Table notify-threads"},{"location":"de/spec/database/db_notify-threads/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment notify-id int unsigned NO 0 master-parent-item Deprecated int unsigned YES NULL master-parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL parent-item int unsigned NO 0 receiver-uid User id mediumint unsigned NO 0","title":"Fields"},{"location":"de/spec/database/db_notify-threads/#indexes","text":"Name Fields PRIMARY id master-parent-uri-id master-parent-uri-id receiver-uid receiver-uid notify-id notify-id","title":"Indexes"},{"location":"de/spec/database/db_notify-threads/#foreign-keys","text":"Field Target Table Target Field notify-id notify id master-parent-uri-id item-uri id receiver-uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_notify/","tags":["database","table","developer"],"text":"Table notify # [Deprecated] User notifications Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment type smallint unsigned NO 0 name varchar(255) NO url varchar(255) NO photo varchar(255) NO date datetime NO 0001-01-01 00:00:00 msg mediumtext YES NULL uid Owner User id mediumint unsigned NO 0 link varchar(255) NO iid int unsigned YES NULL parent int unsigned YES NULL uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL seen boolean NO 0 verb varchar(100) NO otype varchar(10) NO name_cache Cached bbcode parsing of name tinytext YES NULL msg_cache Cached bbcode parsing of msg mediumtext YES NULL Indexes # Name Fields PRIMARY id seen_uid_date seen, uid, date uid_date uid, date uid_type_link uid, type, link(190) uri-id uri-id parent-uri-id parent-uri-id Foreign Keys # Field Target Table Target Field uid user uid uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"notify"},{"location":"de/spec/database/db_notify/#table-notify","text":"[Deprecated] User notifications","title":"Table notify"},{"location":"de/spec/database/db_notify/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment type smallint unsigned NO 0 name varchar(255) NO url varchar(255) NO photo varchar(255) NO date datetime NO 0001-01-01 00:00:00 msg mediumtext YES NULL uid Owner User id mediumint unsigned NO 0 link varchar(255) NO iid int unsigned YES NULL parent int unsigned YES NULL uri-id Item-uri id of the related post int unsigned YES NULL parent-uri-id Item-uri id of the parent of the related post int unsigned YES NULL seen boolean NO 0 verb varchar(100) NO otype varchar(10) NO name_cache Cached bbcode parsing of name tinytext YES NULL msg_cache Cached bbcode parsing of msg mediumtext YES NULL","title":"Fields"},{"location":"de/spec/database/db_notify/#indexes","text":"Name Fields PRIMARY id seen_uid_date seen, uid, date uid_date uid, date uid_type_link uid, type, link(190) uri-id uri-id parent-uri-id parent-uri-id","title":"Indexes"},{"location":"de/spec/database/db_notify/#foreign-keys","text":"Field Target Table Target Field uid user uid uri-id item-uri id parent-uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_oembed/","tags":["database","table","developer"],"text":"Table oembed # cache for OEmbed queries Fields # Field Description Type Null Key Default Extra url page url varbinary(255) NO PRI NULL maxwidth Maximum width passed to Oembed mediumint unsigned NO PRI NULL content OEmbed data of the page mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY url, maxwidth created created Return to database documentation","title":"oembed"},{"location":"de/spec/database/db_oembed/#table-oembed","text":"cache for OEmbed queries","title":"Table oembed"},{"location":"de/spec/database/db_oembed/#fields","text":"Field Description Type Null Key Default Extra url page url varbinary(255) NO PRI NULL maxwidth Maximum width passed to Oembed mediumint unsigned NO PRI NULL content OEmbed data of the page mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_oembed/#indexes","text":"Name Fields PRIMARY url, maxwidth created created Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_openwebauth-token/","tags":["database","table","developer"],"text":"Table openwebauth-token # Store OpenWebAuth token to verify contacts Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id - currently unused mediumint unsigned NO 0 type Verify type varchar(32) NO token A generated token varchar(255) NO meta varchar(255) NO created datetime of creation datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"openwebauth-token"},{"location":"de/spec/database/db_openwebauth-token/#table-openwebauth-token","text":"Store OpenWebAuth token to verify contacts","title":"Table openwebauth-token"},{"location":"de/spec/database/db_openwebauth-token/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id - currently unused mediumint unsigned NO 0 type Verify type varchar(32) NO token A generated token varchar(255) NO meta varchar(255) NO created datetime of creation datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_openwebauth-token/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"de/spec/database/db_openwebauth-token/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_parsed_url/","tags":["database","table","developer"],"text":"Table parsed_url # cache for 'parse_url' queries Fields # Field Description Type Null Key Default Extra url_hash page url hash binary(64) NO PRI NULL guessing is the 'guessing' mode active? boolean NO PRI 0 oembed is the data the result of oembed? boolean NO PRI 0 url page url text NO NULL content page data mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00 expires datetime of expiration datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY url_hash, guessing, oembed created created expires expires Return to database documentation","title":"parsed_url"},{"location":"de/spec/database/db_parsed_url/#table-parsed_url","text":"cache for 'parse_url' queries","title":"Table parsed_url"},{"location":"de/spec/database/db_parsed_url/#fields","text":"Field Description Type Null Key Default Extra url_hash page url hash binary(64) NO PRI NULL guessing is the 'guessing' mode active? boolean NO PRI 0 oembed is the data the result of oembed? boolean NO PRI 0 url page url text NO NULL content page data mediumtext YES NULL created datetime of creation datetime NO 0001-01-01 00:00:00 expires datetime of expiration datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_parsed_url/#indexes","text":"Name Fields PRIMARY url_hash, guessing, oembed created created expires expires Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_pconfig/","tags":["database","table","developer"],"text":"Table pconfig # personal (per user) configuration storage Fields # Field Description Type Null Key Default Extra id Primary key int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cat Category varchar(50) NO k Key varchar(100) NO v Value mediumtext YES NULL Indexes # Name Fields PRIMARY id uid_cat_k UNIQUE, uid, cat, k Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"pconfig"},{"location":"de/spec/database/db_pconfig/#table-pconfig","text":"personal (per user) configuration storage","title":"Table pconfig"},{"location":"de/spec/database/db_pconfig/#fields","text":"Field Description Type Null Key Default Extra id Primary key int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 cat Category varchar(50) NO k Key varchar(100) NO v Value mediumtext YES NULL","title":"Fields"},{"location":"de/spec/database/db_pconfig/#indexes","text":"Name Fields PRIMARY id uid_cat_k UNIQUE, uid, cat, k","title":"Indexes"},{"location":"de/spec/database/db_pconfig/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_permissionset/","tags":["database","table","developer"],"text":"Table permissionset # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner id of this permission set mediumint unsigned NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL Indexes # Name Fields PRIMARY id uid_allow_cid_allow_gid_deny_cid_deny_gid uid, allow_cid(50), allow_gid(30), deny_cid(50), deny_gid(30) Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"permissionset"},{"location":"de/spec/database/db_permissionset/#table-permissionset","text":"","title":"Table permissionset"},{"location":"de/spec/database/db_permissionset/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner id of this permission set mediumint unsigned NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL","title":"Fields"},{"location":"de/spec/database/db_permissionset/#indexes","text":"Name Fields PRIMARY id uid_allow_cid_allow_gid_deny_cid_deny_gid uid, allow_cid(50), allow_gid(30), deny_cid(50), deny_gid(30)","title":"Indexes"},{"location":"de/spec/database/db_permissionset/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_photo/","tags":["database","table","developer"],"text":"Table photo # photo storage Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 contact-id contact.id int unsigned NO 0 guid A unique identifier for this photo char(16) NO resource-id char(32) NO hash hash value of the photo char(32) YES NULL created creation date datetime NO 0001-01-01 00:00:00 edited last edited date datetime NO 0001-01-01 00:00:00 title varchar(255) NO desc text YES NULL album The name of the album to which the photo belongs varchar(255) NO photo-type User avatar, user banner, contact avatar, contact banner or default tinyint unsigned YES NULL filename varchar(255) NO type varchar(30) NO image/jpeg height smallint unsigned NO 0 width smallint unsigned NO 0 datasize int unsigned NO 0 data mediumblob NO NULL scale tinyint unsigned NO 0 profile boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL accessible Make photo publicly accessible, ignoring permissions boolean NO 0 backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL updated datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id contactid contact-id uid_contactid uid, contact-id uid_profile uid, profile uid_album_scale_created uid, album(32), scale, created uid_album_resource-id_created uid, album(32), resource-id, created resource-id resource-id uid_photo-type uid, photo-type Foreign Keys # Field Target Table Target Field uid user uid contact-id contact id Return to database documentation","title":"photo"},{"location":"de/spec/database/db_photo/#table-photo","text":"photo storage","title":"Table photo"},{"location":"de/spec/database/db_photo/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 contact-id contact.id int unsigned NO 0 guid A unique identifier for this photo char(16) NO resource-id char(32) NO hash hash value of the photo char(32) YES NULL created creation date datetime NO 0001-01-01 00:00:00 edited last edited date datetime NO 0001-01-01 00:00:00 title varchar(255) NO desc text YES NULL album The name of the album to which the photo belongs varchar(255) NO photo-type User avatar, user banner, contact avatar, contact banner or default tinyint unsigned YES NULL filename varchar(255) NO type varchar(30) NO image/jpeg height smallint unsigned NO 0 width smallint unsigned NO 0 datasize int unsigned NO 0 data mediumblob NO NULL scale tinyint unsigned NO 0 profile boolean NO 0 allow_cid Access Control - list of allowed contact.id '<19><78>' mediumtext YES NULL allow_gid Access Control - list of allowed groups mediumtext YES NULL deny_cid Access Control - list of denied contact.id mediumtext YES NULL deny_gid Access Control - list of denied groups mediumtext YES NULL accessible Make photo publicly accessible, ignoring permissions boolean NO 0 backend-class Storage backend class tinytext YES NULL backend-ref Storage backend data reference text YES NULL updated datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_photo/#indexes","text":"Name Fields PRIMARY id contactid contact-id uid_contactid uid, contact-id uid_profile uid, profile uid_album_scale_created uid, album(32), scale, created uid_album_resource-id_created uid, album(32), resource-id, created resource-id resource-id uid_photo-type uid, photo-type","title":"Indexes"},{"location":"de/spec/database/db_photo/#foreign-keys","text":"Field Target Table Target Field uid user uid contact-id contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-category/","tags":["database","table","developer"],"text":"Table post-category # post relation to categories Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI 0 type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0 Indexes # Name Fields PRIMARY uri-id, uid, type, tid tid tid uid_uri-id uid, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id uid user uid tid tag id Return to database documentation","title":"post-category"},{"location":"de/spec/database/db_post-category/#table-post-category","text":"post relation to categories","title":"Table post-category"},{"location":"de/spec/database/db_post-category/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid User id mediumint unsigned NO PRI 0 type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0","title":"Fields"},{"location":"de/spec/database/db_post-category/#indexes","text":"Name Fields PRIMARY uri-id, uid, type, tid tid tid uid_uri-id uid, uri-id","title":"Indexes"},{"location":"de/spec/database/db_post-category/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id uid user uid tid tag id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-collection/","tags":["database","table","developer"],"text":"Table post-collection # Collection of posts Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type 0 - Featured tinyint unsigned NO PRI 0 Indexes # Name Fields PRIMARY uri-id, type type type Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-collection"},{"location":"de/spec/database/db_post-collection/#table-post-collection","text":"Collection of posts","title":"Table post-collection"},{"location":"de/spec/database/db_post-collection/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type 0 - Featured tinyint unsigned NO PRI 0","title":"Fields"},{"location":"de/spec/database/db_post-collection/#indexes","text":"Name Fields PRIMARY uri-id, type type type","title":"Indexes"},{"location":"de/spec/database/db_post-collection/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-content/","tags":["database","table","developer"],"text":"Table post-content # Content for all posts Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO Indexes # Name Fields PRIMARY uri-id plink plink(191) resource-id resource-id title-content-warning-body FULLTEXT, title, content-warning, body Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-content"},{"location":"de/spec/database/db_post-content/#table-post-content","text":"Content for all posts","title":"Table post-content"},{"location":"de/spec/database/db_post-content/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO","title":"Fields"},{"location":"de/spec/database/db_post-content/#indexes","text":"Name Fields PRIMARY uri-id plink plink(191) resource-id resource-id title-content-warning-body FULLTEXT, title, content-warning, body","title":"Indexes"},{"location":"de/spec/database/db_post-content/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-delivery-data/","tags":["database","table","developer"],"text":"Table post-delivery-data # Delivery data for items Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL postopts External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery text YES NULL inform Additional receivers of the linked item mediumtext YES NULL queue_count Initial number of delivery recipients, used as item.delivery_queue_count mediumint NO 0 queue_done Number of successful deliveries, used as item.delivery_queue_done mediumint NO 0 queue_failed Number of unsuccessful deliveries, used as item.delivery_queue_failed mediumint NO 0 activitypub Number of successful deliveries via ActivityPub mediumint NO 0 dfrn Number of successful deliveries via DFRN mediumint NO 0 legacy_dfrn Number of successful deliveries via legacy DFRN mediumint NO 0 diaspora Number of successful deliveries via Diaspora mediumint NO 0 ostatus Number of successful deliveries via OStatus mediumint NO 0 Indexes # Name Fields PRIMARY uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-delivery-data"},{"location":"de/spec/database/db_post-delivery-data/#table-post-delivery-data","text":"Delivery data for items","title":"Table post-delivery-data"},{"location":"de/spec/database/db_post-delivery-data/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL postopts External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery text YES NULL inform Additional receivers of the linked item mediumtext YES NULL queue_count Initial number of delivery recipients, used as item.delivery_queue_count mediumint NO 0 queue_done Number of successful deliveries, used as item.delivery_queue_done mediumint NO 0 queue_failed Number of unsuccessful deliveries, used as item.delivery_queue_failed mediumint NO 0 activitypub Number of successful deliveries via ActivityPub mediumint NO 0 dfrn Number of successful deliveries via DFRN mediumint NO 0 legacy_dfrn Number of successful deliveries via legacy DFRN mediumint NO 0 diaspora Number of successful deliveries via Diaspora mediumint NO 0 ostatus Number of successful deliveries via OStatus mediumint NO 0","title":"Fields"},{"location":"de/spec/database/db_post-delivery-data/#indexes","text":"Name Fields PRIMARY uri-id","title":"Indexes"},{"location":"de/spec/database/db_post-delivery-data/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-delivery/","tags":["database","table","developer"],"text":"Table post-delivery # Delivery data for posts for the batch processing Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL inbox-id Item-uri id of inbox url int unsigned NO PRI NULL uid Delivering user mediumint unsigned YES NULL created datetime YES 0001-01-01 00:00:00 command varbinary(32) YES NULL failed Number of times the delivery has failed tinyint YES 0 receivers JSON encoded array with the receiving contacts mediumtext YES NULL Indexes # Name Fields PRIMARY uri-id, inbox-id inbox-id_created inbox-id, created uid uid Foreign Keys # Field Target Table Target Field uri-id item-uri id inbox-id item-uri id uid user uid Return to database documentation","title":"post-delivery"},{"location":"de/spec/database/db_post-delivery/#table-post-delivery","text":"Delivery data for posts for the batch processing","title":"Table post-delivery"},{"location":"de/spec/database/db_post-delivery/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL inbox-id Item-uri id of inbox url int unsigned NO PRI NULL uid Delivering user mediumint unsigned YES NULL created datetime YES 0001-01-01 00:00:00 command varbinary(32) YES NULL failed Number of times the delivery has failed tinyint YES 0 receivers JSON encoded array with the receiving contacts mediumtext YES NULL","title":"Fields"},{"location":"de/spec/database/db_post-delivery/#indexes","text":"Name Fields PRIMARY uri-id, inbox-id inbox-id_created inbox-id, created uid uid","title":"Indexes"},{"location":"de/spec/database/db_post-delivery/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id inbox-id item-uri id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-history/","tags":["database","table","developer"],"text":"Table post-history # Post history Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL edited Date of edit datetime NO PRI 0001-01-01 00:00:00 title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO Indexes # Name Fields PRIMARY uri-id, edited Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-history"},{"location":"de/spec/database/db_post-history/#table-post-history","text":"Post history","title":"Table post-history"},{"location":"de/spec/database/db_post-history/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL edited Date of edit datetime NO PRI 0001-01-01 00:00:00 title item title varchar(255) NO content-warning varchar(255) NO body item body content mediumtext YES NULL raw-body Body without embedded media links mediumtext YES NULL location text location where this item originated varchar(255) NO coord longitude/latitude pair representing location where this item originated varchar(255) NO language Language information about this post text YES NULL app application which generated this item varchar(255) NO rendered-hash varchar(32) NO rendered-html item.body converted to html mediumtext YES NULL object-type ActivityStreams object type varchar(100) NO object JSON encoded object structure unless it is an implied object (normal post) text YES NULL target-type ActivityStreams target type if applicable (URI) varchar(100) NO target JSON encoded target structure if used text YES NULL resource-id Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type varchar(32) NO plink permalink or URL to a displayable copy of the message at its source varchar(255) NO","title":"Fields"},{"location":"de/spec/database/db_post-history/#indexes","text":"Name Fields PRIMARY uri-id, edited","title":"Indexes"},{"location":"de/spec/database/db_post-history/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-link/","tags":["database","table","developer"],"text":"Table post-link # Post related external links Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url External URL varbinary(511) NO NULL mimetype varchar(60) YES NULL Indexes # Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-link"},{"location":"de/spec/database/db_post-link/#table-post-link","text":"Post related external links","title":"Table post-link"},{"location":"de/spec/database/db_post-link/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url External URL varbinary(511) NO NULL mimetype varchar(60) YES NULL","title":"Fields"},{"location":"de/spec/database/db_post-link/#indexes","text":"Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url","title":"Indexes"},{"location":"de/spec/database/db_post-link/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-media/","tags":["database","table","developer"],"text":"Table post-media # Attached media Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url Media URL varbinary(1024) NO NULL type Media type tinyint unsigned NO 0 mimetype varchar(60) YES NULL height Height of the media smallint unsigned YES NULL width Width of the media smallint unsigned YES NULL size Media size bigint unsigned YES NULL preview Preview URL varbinary(512) YES NULL preview-height Height of the preview picture smallint unsigned YES NULL preview-width Width of the preview picture smallint unsigned YES NULL description text YES NULL name Name of the media varchar(255) YES NULL author-url URL of the author of the media varbinary(255) YES NULL author-name Name of the author of the media varchar(255) YES NULL author-image Image of the author of the media varbinary(255) YES NULL publisher-url URL of the publisher of the media varbinary(255) YES NULL publisher-name Name of the publisher of the media varchar(255) YES NULL publisher-image Image of the publisher of the media varbinary(255) YES NULL Indexes # Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url(512) uri-id-id uri-id, id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-media"},{"location":"de/spec/database/db_post-media/#table-post-media","text":"Attached media","title":"Table post-media"},{"location":"de/spec/database/db_post-media/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL url Media URL varbinary(1024) NO NULL type Media type tinyint unsigned NO 0 mimetype varchar(60) YES NULL height Height of the media smallint unsigned YES NULL width Width of the media smallint unsigned YES NULL size Media size bigint unsigned YES NULL preview Preview URL varbinary(512) YES NULL preview-height Height of the preview picture smallint unsigned YES NULL preview-width Width of the preview picture smallint unsigned YES NULL description text YES NULL name Name of the media varchar(255) YES NULL author-url URL of the author of the media varbinary(255) YES NULL author-name Name of the author of the media varchar(255) YES NULL author-image Image of the author of the media varbinary(255) YES NULL publisher-url URL of the publisher of the media varbinary(255) YES NULL publisher-name Name of the publisher of the media varchar(255) YES NULL publisher-image Image of the publisher of the media varbinary(255) YES NULL","title":"Fields"},{"location":"de/spec/database/db_post-media/#indexes","text":"Name Fields PRIMARY id uri-id-url UNIQUE, uri-id, url(512) uri-id-id uri-id, id","title":"Indexes"},{"location":"de/spec/database/db_post-media/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-question-option/","tags":["database","table","developer"],"text":"Table post-question-option # Question option Fields # Field Description Type Null Key Default Extra id Id of the question int unsigned NO PRI NULL uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL name Name of the option varchar(255) YES NULL replies Number of replies for this question option int unsigned YES NULL Indexes # Name Fields PRIMARY uri-id, id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-question-option"},{"location":"de/spec/database/db_post-question-option/#table-post-question-option","text":"Question option","title":"Table post-question-option"},{"location":"de/spec/database/db_post-question-option/#fields","text":"Field Description Type Null Key Default Extra id Id of the question int unsigned NO PRI NULL uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL name Name of the option varchar(255) YES NULL replies Number of replies for this question option int unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_post-question-option/#indexes","text":"Name Fields PRIMARY uri-id, id","title":"Indexes"},{"location":"de/spec/database/db_post-question-option/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-question/","tags":["database","table","developer"],"text":"Table post-question # Question Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL multiple Multiple choice boolean NO 0 voters Number of voters for this question int unsigned YES NULL end-time Question end time datetime YES 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uri-id UNIQUE, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"post-question"},{"location":"de/spec/database/db_post-question/#table-post-question","text":"Question","title":"Table post-question"},{"location":"de/spec/database/db_post-question/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL multiple Multiple choice boolean NO 0 voters Number of voters for this question int unsigned YES NULL end-time Question end time datetime YES 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_post-question/#indexes","text":"Name Fields PRIMARY id uri-id UNIQUE, uri-id","title":"Indexes"},{"location":"de/spec/database/db_post-question/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-tag/","tags":["database","table","developer"],"text":"Table post-tag # post relation to tags Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0 cid Contact id of the mentioned public contact int unsigned NO PRI 0 Indexes # Name Fields PRIMARY uri-id, type, tid, cid tid tid cid cid Foreign Keys # Field Target Table Target Field uri-id item-uri id tid tag id cid contact id Return to database documentation","title":"post-tag"},{"location":"de/spec/database/db_post-tag/#table-post-tag","text":"post relation to tags","title":"Table post-tag"},{"location":"de/spec/database/db_post-tag/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL type tinyint unsigned NO PRI 0 tid int unsigned NO PRI 0 cid Contact id of the mentioned public contact int unsigned NO PRI 0","title":"Fields"},{"location":"de/spec/database/db_post-tag/#indexes","text":"Name Fields PRIMARY uri-id, type, tid, cid tid tid cid cid","title":"Indexes"},{"location":"de/spec/database/db_post-tag/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id tid tag id cid contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-thread-user/","tags":["database","table","developer"],"text":"Table post-thread-user # Thread related data per user Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00 uid Owner id which owns this copy of the item mediumint unsigned NO PRI 0 pinned deprecated boolean NO 0 starred boolean NO 0 ignored Ignore updates for this thread boolean NO 0 wall This item was posted to the wall of uid boolean NO 0 mention boolean NO 0 pubmail boolean NO 0 forum_mode Deprecated tinyint unsigned NO 0 contact-id contact.id int unsigned NO 0 unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL post-user-id Id of the post-user table int unsigned YES NULL Indexes # Name Fields PRIMARY uid, uri-id uri-id uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id uid uid contact-id contact-id psid psid post-user-id post-user-id commented commented uid_received uid, received uid_wall_received uid, wall, received uid_commented uid, commented uid_starred uid, starred uid_mention uid, mention Foreign Keys # Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id uid user uid contact-id contact id psid permissionset id post-user-id post-user id Return to database documentation","title":"post-thread-user"},{"location":"de/spec/database/db_post-thread-user/#table-post-thread-user","text":"Thread related data per user","title":"Table post-thread-user"},{"location":"de/spec/database/db_post-thread-user/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00 uid Owner id which owns this copy of the item mediumint unsigned NO PRI 0 pinned deprecated boolean NO 0 starred boolean NO 0 ignored Ignore updates for this thread boolean NO 0 wall This item was posted to the wall of uid boolean NO 0 mention boolean NO 0 pubmail boolean NO 0 forum_mode Deprecated tinyint unsigned NO 0 contact-id contact.id int unsigned NO 0 unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL post-user-id Id of the post-user table int unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_post-thread-user/#indexes","text":"Name Fields PRIMARY uid, uri-id uri-id uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id uid uid contact-id contact-id psid psid post-user-id post-user-id commented commented uid_received uid, received uid_wall_received uid, wall, received uid_commented uid, commented uid_starred uid, starred uid_mention uid, mention","title":"Indexes"},{"location":"de/spec/database/db_post-thread-user/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id uid user uid contact-id contact id psid permissionset id post-user-id post-user id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-thread/","tags":["database","table","developer"],"text":"Table post-thread # Thread related data Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id received received commented commented Foreign Keys # Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id Return to database documentation","title":"post-thread"},{"location":"de/spec/database/db_post-thread/#table-post-thread","text":"Thread related data","title":"Table post-thread"},{"location":"de/spec/database/db_post-thread/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL conversation-id Id of the item-uri table entry that contains the conversation uri int unsigned YES NULL owner-id Item owner int unsigned NO 0 author-id Item author int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL network char(4) NO created datetime NO 0001-01-01 00:00:00 received datetime NO 0001-01-01 00:00:00 changed Date that something in the conversation changed, indicating clients should fetch the conversation again datetime NO 0001-01-01 00:00:00 commented datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_post-thread/#indexes","text":"Name Fields PRIMARY uri-id conversation-id conversation-id owner-id owner-id author-id author-id causer-id causer-id received received commented commented","title":"Indexes"},{"location":"de/spec/database/db_post-thread/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id conversation-id item-uri id owner-id contact id author-id contact id causer-id contact id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-user-notification/","tags":["database","table","developer"],"text":"Table post-user-notification # User post notifications Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid Owner id which owns this copy of the item mediumint unsigned NO PRI NULL notification-type smallint unsigned NO 0 Indexes # Name Fields PRIMARY uid, uri-id uri-id uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id uid user uid Return to database documentation","title":"post-user-notification"},{"location":"de/spec/database/db_post-user-notification/#table-post-user-notification","text":"User post notifications","title":"Table post-user-notification"},{"location":"de/spec/database/db_post-user-notification/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL uid Owner id which owns this copy of the item mediumint unsigned NO PRI NULL notification-type smallint unsigned NO 0","title":"Fields"},{"location":"de/spec/database/db_post-user-notification/#indexes","text":"Name Fields PRIMARY uid, uri-id uri-id uri-id","title":"Indexes"},{"location":"de/spec/database/db_post-user-notification/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post-user/","tags":["database","table","developer"],"text":"Table post-user # User specific post data Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 post-reason Reason why the post arrived at the user tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0 uid Owner id which owns this copy of the item mediumint unsigned NO NULL protocol Protocol used to deliver the item for this user tinyint unsigned YES NULL contact-id contact.id int unsigned NO 0 event-id Used to link to the event.id int unsigned YES NULL unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 notification-type tinyint unsigned NO 0 wall This item was posted to the wall of uid boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL Indexes # Name Fields PRIMARY id uid_uri-id UNIQUE, uid, uri-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid contact-id contact-id event-id event-id psid psid author-id_uid author-id, uid author-id_received author-id, received parent-uri-id_uid parent-uri-id, uid uid_contactid uid, contact-id uid_unseen_contactid uid, unseen, contact-id uid_unseen uid, unseen uid_hidden_uri-id uid, hidden, uri-id Foreign Keys # Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id uid user uid contact-id contact id event-id event id psid permissionset id Return to database documentation","title":"post-user"},{"location":"de/spec/database/db_post-user/#table-post-user","text":"User specific post data","title":"Table post-user"},{"location":"de/spec/database/db_post-user/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment uri-id Id of the item-uri table entry that contains the item uri int unsigned NO NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 post-reason Reason why the post arrived at the user tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0 uid Owner id which owns this copy of the item mediumint unsigned NO NULL protocol Protocol used to deliver the item for this user tinyint unsigned YES NULL contact-id contact.id int unsigned NO 0 event-id Used to link to the event.id int unsigned YES NULL unseen post has not been seen boolean NO 1 hidden Marker to hide the post from the user boolean NO 0 notification-type tinyint unsigned NO 0 wall This item was posted to the wall of uid boolean NO 0 origin item originated at this site boolean NO 0 psid ID of the permission set of this post int unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_post-user/#indexes","text":"Name Fields PRIMARY id uid_uri-id UNIQUE, uid, uri-id uri-id uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid contact-id contact-id event-id event-id psid psid author-id_uid author-id, uid author-id_received author-id, received parent-uri-id_uid parent-uri-id, uid uid_contactid uid, contact-id uid_unseen_contactid uid, unseen, contact-id uid_unseen uid, unseen uid_hidden_uri-id uid, hidden, uri-id","title":"Indexes"},{"location":"de/spec/database/db_post-user/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id uid user uid contact-id contact id event-id event id psid permissionset id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_post/","tags":["database","table","developer"],"text":"Table post # Structure for all posts Fields # Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0 Indexes # Name Fields PRIMARY uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid Foreign Keys # Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id Return to database documentation","title":"post"},{"location":"de/spec/database/db_post/#table-post","text":"Structure for all posts","title":"Table post"},{"location":"de/spec/database/db_post/#fields","text":"Field Description Type Null Key Default Extra uri-id Id of the item-uri table entry that contains the item uri int unsigned NO PRI NULL parent-uri-id Id of the item-uri table that contains the parent uri int unsigned YES NULL thr-parent-id Id of the item-uri table that contains the thread parent uri int unsigned YES NULL external-id Id of the item-uri table entry that contains the external uri int unsigned YES NULL created Creation timestamp. datetime NO 0001-01-01 00:00:00 edited Date of last edit (default is created) datetime NO 0001-01-01 00:00:00 received datetime datetime NO 0001-01-01 00:00:00 gravity tinyint unsigned NO 0 network Network from where the item comes from char(4) NO owner-id Link to the contact table with uid=0 of the owner of this item int unsigned NO 0 author-id Link to the contact table with uid=0 of the author of this item int unsigned NO 0 causer-id Link to the contact table with uid=0 of the contact that caused the item creation int unsigned YES NULL post-type Post type (personal note, image, article, ...) tinyint unsigned NO 0 vid Id of the verb table entry that contains the activity verbs smallint unsigned YES NULL private 0=public, 1=private, 2=unlisted tinyint unsigned NO 0 global boolean NO 0 visible boolean NO 0 deleted item has been marked for deletion boolean NO 0","title":"Fields"},{"location":"de/spec/database/db_post/#indexes","text":"Name Fields PRIMARY uri-id parent-uri-id parent-uri-id thr-parent-id thr-parent-id external-id external-id owner-id owner-id author-id author-id causer-id causer-id vid vid","title":"Indexes"},{"location":"de/spec/database/db_post/#foreign-keys","text":"Field Target Table Target Field uri-id item-uri id parent-uri-id item-uri id thr-parent-id item-uri id external-id item-uri id owner-id contact id author-id contact id causer-id contact id vid verb id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_process/","tags":["database","table","developer"],"text":"Table process # Currently running system processes Fields # Field Description Type Null Key Default Extra pid The ID of the process int unsigned NO PRI NULL hostname The name of the host the process is ran on varchar(32) NO PRI NULL command varbinary(32) NO created datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY pid, hostname command command Return to database documentation","title":"process"},{"location":"de/spec/database/db_process/#table-process","text":"Currently running system processes","title":"Table process"},{"location":"de/spec/database/db_process/#fields","text":"Field Description Type Null Key Default Extra pid The ID of the process int unsigned NO PRI NULL hostname The name of the host the process is ran on varchar(32) NO PRI NULL command varbinary(32) NO created datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_process/#indexes","text":"Name Fields PRIMARY pid, hostname command command Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_profile/","tags":["database","table","developer"],"text":"Table profile # user profiles data Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 profile-name Deprecated varchar(255) YES NULL is-default Deprecated boolean YES NULL hide-friends Hide friend list from viewers of this profile boolean NO 0 name varchar(255) NO pdesc Deprecated varchar(255) YES NULL dob Day of birth varchar(32) NO 0000-00-00 address varchar(255) NO locality varchar(255) NO region varchar(255) NO postal-code varchar(32) NO country-name varchar(255) NO hometown Deprecated varchar(255) YES NULL gender Deprecated varchar(32) YES NULL marital Deprecated varchar(255) YES NULL with Deprecated text YES NULL howlong Deprecated datetime YES NULL sexual Deprecated varchar(255) YES NULL politic Deprecated varchar(255) YES NULL religion Deprecated varchar(255) YES NULL pub_keywords text YES NULL prv_keywords text YES NULL likes Deprecated text YES NULL dislikes Deprecated text YES NULL about Profile description text YES NULL summary Deprecated varchar(255) YES NULL music Deprecated text YES NULL book Deprecated text YES NULL tv Deprecated text YES NULL film Deprecated text YES NULL interest Deprecated text YES NULL romance Deprecated text YES NULL work Deprecated text YES NULL education Deprecated text YES NULL contact Deprecated text YES NULL homepage varchar(255) NO xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO photo varchar(255) NO thumb varchar(255) NO publish publish default profile in local directory boolean NO 0 net-publish publish profile in global directory boolean NO 0 Indexes # Name Fields PRIMARY id uid_is-default uid, is-default pub_keywords FULLTEXT, pub_keywords Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"profile"},{"location":"de/spec/database/db_profile/#table-profile","text":"user profiles data","title":"Table profile"},{"location":"de/spec/database/db_profile/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner User id mediumint unsigned NO 0 profile-name Deprecated varchar(255) YES NULL is-default Deprecated boolean YES NULL hide-friends Hide friend list from viewers of this profile boolean NO 0 name varchar(255) NO pdesc Deprecated varchar(255) YES NULL dob Day of birth varchar(32) NO 0000-00-00 address varchar(255) NO locality varchar(255) NO region varchar(255) NO postal-code varchar(32) NO country-name varchar(255) NO hometown Deprecated varchar(255) YES NULL gender Deprecated varchar(32) YES NULL marital Deprecated varchar(255) YES NULL with Deprecated text YES NULL howlong Deprecated datetime YES NULL sexual Deprecated varchar(255) YES NULL politic Deprecated varchar(255) YES NULL religion Deprecated varchar(255) YES NULL pub_keywords text YES NULL prv_keywords text YES NULL likes Deprecated text YES NULL dislikes Deprecated text YES NULL about Profile description text YES NULL summary Deprecated varchar(255) YES NULL music Deprecated text YES NULL book Deprecated text YES NULL tv Deprecated text YES NULL film Deprecated text YES NULL interest Deprecated text YES NULL romance Deprecated text YES NULL work Deprecated text YES NULL education Deprecated text YES NULL contact Deprecated text YES NULL homepage varchar(255) NO xmpp XMPP address varchar(255) NO matrix Matrix address varchar(255) NO photo varchar(255) NO thumb varchar(255) NO publish publish default profile in local directory boolean NO 0 net-publish publish profile in global directory boolean NO 0","title":"Fields"},{"location":"de/spec/database/db_profile/#indexes","text":"Name Fields PRIMARY id uid_is-default uid, is-default pub_keywords FULLTEXT, pub_keywords","title":"Indexes"},{"location":"de/spec/database/db_profile/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_profile_field/","tags":["database","table","developer"],"text":"Table profile_field # Custom profile fields Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner user id mediumint unsigned NO 0 order Field ordering per user mediumint unsigned NO 1 psid ID of the permission set of this profile field - 0 = public int unsigned YES NULL label Label of the field varchar(255) NO value Value of the field text YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00 Indexes # Name Fields PRIMARY id uid uid order order psid psid Foreign Keys # Field Target Table Target Field uid user uid psid permissionset id Return to database documentation","title":"profile_field"},{"location":"de/spec/database/db_profile_field/#table-profile_field","text":"Custom profile fields","title":"Table profile_field"},{"location":"de/spec/database/db_profile_field/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid Owner user id mediumint unsigned NO 0 order Field ordering per user mediumint unsigned NO 1 psid ID of the permission set of this profile field - 0 = public int unsigned YES NULL label Label of the field varchar(255) NO value Value of the field text YES NULL created creation time datetime NO 0001-01-01 00:00:00 edited last edit time datetime NO 0001-01-01 00:00:00","title":"Fields"},{"location":"de/spec/database/db_profile_field/#indexes","text":"Name Fields PRIMARY id uid uid order order psid psid","title":"Indexes"},{"location":"de/spec/database/db_profile_field/#foreign-keys","text":"Field Target Table Target Field uid user uid psid permissionset id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_push_subscriber/","tags":["database","table","developer"],"text":"Table push_subscriber # Used for OStatus: Contains feed subscribers Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 callback_url varchar(255) NO topic varchar(255) NO nickname varchar(255) NO push Retrial counter tinyint NO 0 last_update Date of last successful trial datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 renewed Date of last subscription renewal datetime NO 0001-01-01 00:00:00 secret varchar(255) NO Indexes # Name Fields PRIMARY id next_try next_try uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"push_subscriber"},{"location":"de/spec/database/db_push_subscriber/#table-push_subscriber","text":"Used for OStatus: Contains feed subscribers","title":"Table push_subscriber"},{"location":"de/spec/database/db_push_subscriber/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 callback_url varchar(255) NO topic varchar(255) NO nickname varchar(255) NO push Retrial counter tinyint NO 0 last_update Date of last successful trial datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 renewed Date of last subscription renewal datetime NO 0001-01-01 00:00:00 secret varchar(255) NO","title":"Fields"},{"location":"de/spec/database/db_push_subscriber/#indexes","text":"Name Fields PRIMARY id next_try next_try uid uid","title":"Indexes"},{"location":"de/spec/database/db_push_subscriber/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_register/","tags":["database","table","developer"],"text":"Table register # registrations requiring admin approval Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hash varchar(255) NO created datetime NO 0001-01-01 00:00:00 uid User id mediumint unsigned NO 0 password varchar(255) NO language varchar(16) NO note text YES NULL Indexes # Name Fields PRIMARY id uid uid Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"register"},{"location":"de/spec/database/db_register/#table-register","text":"registrations requiring admin approval","title":"Table register"},{"location":"de/spec/database/db_register/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment hash varchar(255) NO created datetime NO 0001-01-01 00:00:00 uid User id mediumint unsigned NO 0 password varchar(255) NO language varchar(16) NO note text YES NULL","title":"Fields"},{"location":"de/spec/database/db_register/#indexes","text":"Name Fields PRIMARY id uid uid","title":"Indexes"},{"location":"de/spec/database/db_register/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_search/","tags":["database","table","developer"],"text":"Table search # Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 term varchar(255) NO Indexes # Name Fields PRIMARY id uid_term uid, term(64) term term(64) Foreign Keys # Field Target Table Target Field uid user uid Return to database documentation","title":"search"},{"location":"de/spec/database/db_search/#table-search","text":"","title":"Table search"},{"location":"de/spec/database/db_search/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment uid User id mediumint unsigned NO 0 term varchar(255) NO","title":"Fields"},{"location":"de/spec/database/db_search/#indexes","text":"Name Fields PRIMARY id uid_term uid, term(64) term term(64)","title":"Indexes"},{"location":"de/spec/database/db_search/#foreign-keys","text":"Field Target Table Target Field uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_session/","tags":["database","table","developer"],"text":"Table session # web session storage Fields # Field Description Type Null Key Default Extra id sequential ID bigint unsigned NO PRI NULL auto_increment sid varbinary(255) NO data text YES NULL expire int unsigned NO 0 Indexes # Name Fields PRIMARY id sid sid(64) expire expire Return to database documentation","title":"session"},{"location":"de/spec/database/db_session/#table-session","text":"web session storage","title":"Table session"},{"location":"de/spec/database/db_session/#fields","text":"Field Description Type Null Key Default Extra id sequential ID bigint unsigned NO PRI NULL auto_increment sid varbinary(255) NO data text YES NULL expire int unsigned NO 0","title":"Fields"},{"location":"de/spec/database/db_session/#indexes","text":"Name Fields PRIMARY id sid sid(64) expire expire Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_storage/","tags":["database","table","developer"],"text":"Table storage # Data stored by Database storage backend Fields # Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment data file data longblob NO NULL Indexes # Name Fields PRIMARY id Return to database documentation","title":"storage"},{"location":"de/spec/database/db_storage/#table-storage","text":"Data stored by Database storage backend","title":"Table storage"},{"location":"de/spec/database/db_storage/#fields","text":"Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment data file data longblob NO NULL","title":"Fields"},{"location":"de/spec/database/db_storage/#indexes","text":"Name Fields PRIMARY id Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_subscription/","tags":["database","table","developer"],"text":"Table subscription # Push Subscription for the API Fields # Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment application-id int unsigned NO NULL uid Owner User id mediumint unsigned NO NULL endpoint Endpoint URL varchar(511) YES NULL pubkey User agent public key varchar(127) YES NULL secret Auth secret varchar(32) YES NULL follow boolean YES NULL favourite boolean YES NULL reblog boolean YES NULL mention boolean YES NULL poll boolean YES NULL follow_request boolean YES NULL status boolean YES NULL Indexes # Name Fields PRIMARY id application-id_uid UNIQUE, application-id, uid uid_application-id uid, application-id Foreign Keys # Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"subscription"},{"location":"de/spec/database/db_subscription/#table-subscription","text":"Push Subscription for the API","title":"Table subscription"},{"location":"de/spec/database/db_subscription/#fields","text":"Field Description Type Null Key Default Extra id Auto incremented image data id int unsigned NO PRI NULL auto_increment application-id int unsigned NO NULL uid Owner User id mediumint unsigned NO NULL endpoint Endpoint URL varchar(511) YES NULL pubkey User agent public key varchar(127) YES NULL secret Auth secret varchar(32) YES NULL follow boolean YES NULL favourite boolean YES NULL reblog boolean YES NULL mention boolean YES NULL poll boolean YES NULL follow_request boolean YES NULL status boolean YES NULL","title":"Fields"},{"location":"de/spec/database/db_subscription/#indexes","text":"Name Fields PRIMARY id application-id_uid UNIQUE, application-id, uid uid_application-id uid, application-id","title":"Indexes"},{"location":"de/spec/database/db_subscription/#foreign-keys","text":"Field Target Table Target Field application-id application id uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_tag/","tags":["database","table","developer"],"text":"Table tag # tags and mentions Fields # Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name varchar(96) NO url varbinary(255) NO type Type of the tag (Unknown, General Collection, Follower Collection or Account) tinyint unsigned YES NULL Indexes # Name Fields PRIMARY id type_name_url UNIQUE, name, url url url Return to database documentation","title":"tag"},{"location":"de/spec/database/db_tag/#table-tag","text":"tags and mentions","title":"Table tag"},{"location":"de/spec/database/db_tag/#fields","text":"Field Description Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment name varchar(96) NO url varbinary(255) NO type Type of the tag (Unknown, General Collection, Follower Collection or Account) tinyint unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_tag/#indexes","text":"Name Fields PRIMARY id type_name_url UNIQUE, name, url url url Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_user-contact/","tags":["database","table","developer"],"text":"Table user-contact # User specific public contact data Fields # Field Description Type Null Key Default Extra cid Contact id of the linked public contact int unsigned NO PRI 0 uid User id mediumint unsigned NO PRI 0 uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL blocked Contact is completely blocked for this user boolean YES NULL ignored Posts from this contact are ignored boolean YES NULL collapsed Posts from this contact are collapsed boolean YES NULL hidden This contact is hidden from the others boolean YES NULL is-blocked User is blocked by this contact boolean YES NULL pending boolean YES NULL rel The kind of the relation between the user and the contact tinyint unsigned YES NULL info mediumtext YES NULL notify_new_posts boolean YES NULL remote_self boolean YES NULL fetch_further_information tinyint unsigned YES NULL ffi_keyword_denylist text YES NULL subhub boolean YES NULL hub-verify varchar(255) YES NULL protocol Protocol of the contact char(4) YES NULL rating Automatically detected feed poll frequency tinyint YES NULL priority Feed poll priority tinyint unsigned YES NULL Indexes # Name Fields PRIMARY uid, cid cid cid uri-id_uid UNIQUE, uri-id, uid Foreign Keys # Field Target Table Target Field cid contact id uid user uid uri-id item-uri id Return to database documentation","title":"user-contact"},{"location":"de/spec/database/db_user-contact/#table-user-contact","text":"User specific public contact data","title":"Table user-contact"},{"location":"de/spec/database/db_user-contact/#fields","text":"Field Description Type Null Key Default Extra cid Contact id of the linked public contact int unsigned NO PRI 0 uid User id mediumint unsigned NO PRI 0 uri-id Id of the item-uri table entry that contains the contact url int unsigned YES NULL blocked Contact is completely blocked for this user boolean YES NULL ignored Posts from this contact are ignored boolean YES NULL collapsed Posts from this contact are collapsed boolean YES NULL hidden This contact is hidden from the others boolean YES NULL is-blocked User is blocked by this contact boolean YES NULL pending boolean YES NULL rel The kind of the relation between the user and the contact tinyint unsigned YES NULL info mediumtext YES NULL notify_new_posts boolean YES NULL remote_self boolean YES NULL fetch_further_information tinyint unsigned YES NULL ffi_keyword_denylist text YES NULL subhub boolean YES NULL hub-verify varchar(255) YES NULL protocol Protocol of the contact char(4) YES NULL rating Automatically detected feed poll frequency tinyint YES NULL priority Feed poll priority tinyint unsigned YES NULL","title":"Fields"},{"location":"de/spec/database/db_user-contact/#indexes","text":"Name Fields PRIMARY uid, cid cid cid uri-id_uid UNIQUE, uri-id, uid","title":"Indexes"},{"location":"de/spec/database/db_user-contact/#foreign-keys","text":"Field Target Table Target Field cid contact id uid user uid uri-id item-uri id Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_user/","tags":["database","table","developer"],"text":"Table user # The local users Fields # Field Description Type Null Key Default Extra uid sequential ID mediumint unsigned NO PRI NULL auto_increment parent-uid The parent user that has full control about this user mediumint unsigned YES NULL guid A unique identifier for this user varchar(64) NO username Name that this user is known by varchar(255) NO password encrypted password varchar(255) NO legacy_password Is the password hash double-hashed? boolean NO 0 nickname nick- and user name varchar(255) NO email the users email address varchar(255) NO openid varchar(255) NO timezone PHP-legal timezone varchar(128) NO language default language varchar(32) NO en register_date timestamp of registration datetime NO 0001-01-01 00:00:00 login_date timestamp of last login datetime NO 0001-01-01 00:00:00 default-location Default for item.location varchar(255) NO allow_location 1 allows to display the location boolean NO 0 theme user theme preference varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL spubkey text YES NULL sprvkey text YES NULL verified user is verified through email boolean NO 0 blocked 1 for user is blocked boolean NO 0 blockwall Prohibit contacts to post to the profile page of the user boolean NO 0 hidewall Hide profile details from unkown viewers boolean NO 0 blocktags Prohibit contacts to tag the post of this user boolean NO 0 unkmail Permit unknown people to send private mails to this user boolean NO 0 cntunkmail int unsigned NO 10 notify-flags email notification options smallint unsigned NO 65535 page-flags page/profile type tinyint unsigned NO 0 account-type tinyint unsigned NO 0 prvnets boolean NO 0 pwdreset Password reset request token varchar(255) YES NULL pwdreset_time Timestamp of the last password reset request datetime YES NULL maxreq int unsigned NO 10 expire int unsigned NO 0 account_removed if 1 the account is removed boolean NO 0 account_expired boolean NO 0 account_expires_on timestamp when account expires and will be deleted datetime NO 0001-01-01 00:00:00 expire_notification_sent timestamp of last warning of account expiration datetime NO 0001-01-01 00:00:00 def_gid int unsigned NO 0 allow_cid default permission for this user mediumtext YES NULL allow_gid default permission for this user mediumtext YES NULL deny_cid default permission for this user mediumtext YES NULL deny_gid default permission for this user mediumtext YES NULL openidserver text YES NULL Indexes # Name Fields PRIMARY uid nickname nickname(32) parent-uid parent-uid guid guid email email(64) Foreign Keys # Field Target Table Target Field parent-uid user uid Return to database documentation","title":"user"},{"location":"de/spec/database/db_user/#table-user","text":"The local users","title":"Table user"},{"location":"de/spec/database/db_user/#fields","text":"Field Description Type Null Key Default Extra uid sequential ID mediumint unsigned NO PRI NULL auto_increment parent-uid The parent user that has full control about this user mediumint unsigned YES NULL guid A unique identifier for this user varchar(64) NO username Name that this user is known by varchar(255) NO password encrypted password varchar(255) NO legacy_password Is the password hash double-hashed? boolean NO 0 nickname nick- and user name varchar(255) NO email the users email address varchar(255) NO openid varchar(255) NO timezone PHP-legal timezone varchar(128) NO language default language varchar(32) NO en register_date timestamp of registration datetime NO 0001-01-01 00:00:00 login_date timestamp of last login datetime NO 0001-01-01 00:00:00 default-location Default for item.location varchar(255) NO allow_location 1 allows to display the location boolean NO 0 theme user theme preference varchar(255) NO pubkey RSA public key 4096 bit text YES NULL prvkey RSA private key 4096 bit text YES NULL spubkey text YES NULL sprvkey text YES NULL verified user is verified through email boolean NO 0 blocked 1 for user is blocked boolean NO 0 blockwall Prohibit contacts to post to the profile page of the user boolean NO 0 hidewall Hide profile details from unkown viewers boolean NO 0 blocktags Prohibit contacts to tag the post of this user boolean NO 0 unkmail Permit unknown people to send private mails to this user boolean NO 0 cntunkmail int unsigned NO 10 notify-flags email notification options smallint unsigned NO 65535 page-flags page/profile type tinyint unsigned NO 0 account-type tinyint unsigned NO 0 prvnets boolean NO 0 pwdreset Password reset request token varchar(255) YES NULL pwdreset_time Timestamp of the last password reset request datetime YES NULL maxreq int unsigned NO 10 expire int unsigned NO 0 account_removed if 1 the account is removed boolean NO 0 account_expired boolean NO 0 account_expires_on timestamp when account expires and will be deleted datetime NO 0001-01-01 00:00:00 expire_notification_sent timestamp of last warning of account expiration datetime NO 0001-01-01 00:00:00 def_gid int unsigned NO 0 allow_cid default permission for this user mediumtext YES NULL allow_gid default permission for this user mediumtext YES NULL deny_cid default permission for this user mediumtext YES NULL deny_gid default permission for this user mediumtext YES NULL openidserver text YES NULL","title":"Fields"},{"location":"de/spec/database/db_user/#indexes","text":"Name Fields PRIMARY uid nickname nickname(32) parent-uid parent-uid guid guid email email(64)","title":"Indexes"},{"location":"de/spec/database/db_user/#foreign-keys","text":"Field Target Table Target Field parent-uid user uid Return to database documentation","title":"Foreign Keys"},{"location":"de/spec/database/db_userd/","tags":["database","table","developer"],"text":"Table userd # Deleted usernames Fields # Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment username varchar(255) NO NULL Indexes # Name Fields PRIMARY id username username(32) Return to database documentation","title":"userd"},{"location":"de/spec/database/db_userd/#table-userd","text":"Deleted usernames","title":"Table userd"},{"location":"de/spec/database/db_userd/#fields","text":"Field Description Type Null Key Default Extra id sequential ID int unsigned NO PRI NULL auto_increment username varchar(255) NO NULL","title":"Fields"},{"location":"de/spec/database/db_userd/#indexes","text":"Name Fields PRIMARY id username username(32) Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_verb/","tags":["database","table","developer"],"text":"Table verb # Activity Verbs Fields # Field Description Type Null Key Default Extra id smallint unsigned NO PRI NULL auto_increment name varchar(100) NO Indexes # Name Fields PRIMARY id name name Return to database documentation","title":"verb"},{"location":"de/spec/database/db_verb/#table-verb","text":"Activity Verbs","title":"Table verb"},{"location":"de/spec/database/db_verb/#fields","text":"Field Description Type Null Key Default Extra id smallint unsigned NO PRI NULL auto_increment name varchar(100) NO","title":"Fields"},{"location":"de/spec/database/db_verb/#indexes","text":"Name Fields PRIMARY id name name Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_worker-ipc/","tags":["database","table","developer"],"text":"Table worker-ipc # Inter process communication between the frontend and the worker Fields # Field Description Type Null Key Default Extra key int NO PRI NULL jobs Flag for outstanding jobs boolean YES NULL Indexes # Name Fields PRIMARY key Return to database documentation","title":"worker-ipc"},{"location":"de/spec/database/db_worker-ipc/#table-worker-ipc","text":"Inter process communication between the frontend and the worker","title":"Table worker-ipc"},{"location":"de/spec/database/db_worker-ipc/#fields","text":"Field Description Type Null Key Default Extra key int NO PRI NULL jobs Flag for outstanding jobs boolean YES NULL","title":"Fields"},{"location":"de/spec/database/db_worker-ipc/#indexes","text":"Name Fields PRIMARY key Return to database documentation","title":"Indexes"},{"location":"de/spec/database/db_workerqueue/","tags":["database","table","developer"],"text":"Table workerqueue # Background tasks queue entries Fields # Field Description Type Null Key Default Extra id Auto incremented worker task id int unsigned NO PRI NULL auto_increment command Task command varchar(100) YES NULL parameter Task parameter mediumtext YES NULL priority Task priority tinyint unsigned NO 0 created Creation date datetime NO 0001-01-01 00:00:00 pid Process id of the worker int unsigned NO 0 executed Execution date datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 retrial Retrial counter tinyint NO 0 done Marked 1 when the task was done - will be deleted later boolean NO 0 Indexes # Name Fields PRIMARY id command command done_command_parameter done, command, parameter(64) done_executed done, executed done_priority_retrial_created done, priority, retrial, created done_priority_next_try done, priority, next_try done_pid_next_try done, pid, next_try done_pid_retrial done, pid, retrial done_pid_priority_created done, pid, priority, created Return to database documentation","title":"workerqueue"},{"location":"de/spec/database/db_workerqueue/#table-workerqueue","text":"Background tasks queue entries","title":"Table workerqueue"},{"location":"de/spec/database/db_workerqueue/#fields","text":"Field Description Type Null Key Default Extra id Auto incremented worker task id int unsigned NO PRI NULL auto_increment command Task command varchar(100) YES NULL parameter Task parameter mediumtext YES NULL priority Task priority tinyint unsigned NO 0 created Creation date datetime NO 0001-01-01 00:00:00 pid Process id of the worker int unsigned NO 0 executed Execution date datetime NO 0001-01-01 00:00:00 next_try Next retrial date datetime NO 0001-01-01 00:00:00 retrial Retrial counter tinyint NO 0 done Marked 1 when the task was done - will be deleted later boolean NO 0","title":"Fields"},{"location":"de/spec/database/db_workerqueue/#indexes","text":"Name Fields PRIMARY id command command done_command_parameter done, command, parameter(64) done_executed done, executed done_priority_retrial_created done, priority, retrial, created done_priority_next_try done, priority, next_try done_pid_next_try done, pid, next_try done_pid_retrial done, pid, retrial done_pid_priority_created done, pid, priority, created Return to database documentation","title":"Indexes"},{"location":"de/spec/protocol/protocol/","tags":["specification"],"text":"Used Protocols # Friendicas DFRN Protocol # Document with the DFRN specification Schema of the contact request process Schema of the contact request confirmation Description of the message flow ActivityStreams # Friendica is using ActivityStreams in version 1.0 for its activities and object types. Additional types are used for non-standard activities. Link to the specification List of used ActivityStreams verbs and object types. Salmon # Salmon is used as a message exchange protocol for replies and mentions. Link to the protocol summary Portable Contacts # Portable Contacts is used for friends lists. Link to the specification (Link to archive.org) pubsubhubbub # pubsubhubbub is used for OStatus. Link to the specification","title":"Protocols"},{"location":"de/spec/protocol/protocol/#used-protocols","text":"","title":"Used Protocols"},{"location":"de/spec/protocol/protocol/#friendicas-dfrn-protocol","text":"Document with the DFRN specification Schema of the contact request process Schema of the contact request confirmation Description of the message flow","title":"Friendicas DFRN Protocol"},{"location":"de/spec/protocol/protocol/#activitystreams","text":"Friendica is using ActivityStreams in version 1.0 for its activities and object types. Additional types are used for non-standard activities. Link to the specification List of used ActivityStreams verbs and object types.","title":"ActivityStreams"},{"location":"de/spec/protocol/protocol/#salmon","text":"Salmon is used as a message exchange protocol for replies and mentions. Link to the protocol summary","title":"Salmon"},{"location":"de/spec/protocol/protocol/#portable-contacts","text":"Portable Contacts is used for friends lists. Link to the specification (Link to archive.org)","title":"Portable Contacts"},{"location":"de/spec/protocol/protocol/#pubsubhubbub","text":"pubsubhubbub is used for OStatus. Link to the specification","title":"pubsubhubbub"},{"location":"de/user/accesskeys/","tags":["user","shortcuts","accesskeys"],"text":"Access-keys reference # Access keys are keyboard shortcuts that allow you to easily navigate the user interface. Access keys are currently not available with the Frio theme. The specific key combinations depend on how your browser's the modifier key setting. For an overview of modifier keys in different browsers, have a look at Wikipedia article. For example, for moving to profile page in Firefox, press these three keys simultaneously. [Shift] [Alt] [p] General # p - Profile n - Network c - Community s - Search a - Admin f - Notifications u - User menu community # l - Local community g - Global community profile # m - Status Messages and Posts r - Profile Details h - Photo Albums d - Media e - Events and Calendar t - Personal Notes o - Scheduled Posts k - View Contacts contacts (contact list) # g - Suggestions l - Show all Contacts o - Only show unblocked contacts b - Only show blocked contacts i - Only show ignored contacts y - Only show archived contacts h - Only show hidden contacts e - Edit contact groups contact (single contact view) # m - Status messages p - Posts and Comments d - Media o - Profile t - Contacts r - Advanced message # m - New message network # e - Sort by Comment Date t - Sort by Receipt Date q - Sort by Creation Date r - Conversation (Posts that mention or involve you) w - New posts m - Favourite Posts notifications # y - System w - Network r - Personal h - Home i - Introductions settings # o - Account 2 - Two-factor authentication p - Profiles t - Additional features w - Social Networks l - Addons d - Delegations b - Connected apps e - Export personal data r - Remove account","title":"Accesskeys"},{"location":"de/user/accesskeys/#access-keys-reference","text":"Access keys are keyboard shortcuts that allow you to easily navigate the user interface. Access keys are currently not available with the Frio theme. The specific key combinations depend on how your browser's the modifier key setting. For an overview of modifier keys in different browsers, have a look at Wikipedia article. For example, for moving to profile page in Firefox, press these three keys simultaneously. [Shift] [Alt] [p]","title":"Access-keys reference"},{"location":"de/user/accesskeys/#general","text":"p - Profile n - Network c - Community s - Search a - Admin f - Notifications u - User menu","title":"General"},{"location":"de/user/accesskeys/#community","text":"l - Local community g - Global community","title":"community"},{"location":"de/user/accesskeys/#profile","text":"m - Status Messages and Posts r - Profile Details h - Photo Albums d - Media e - Events and Calendar t - Personal Notes o - Scheduled Posts k - View Contacts","title":"profile"},{"location":"de/user/accesskeys/#contacts-contact-list","text":"g - Suggestions l - Show all Contacts o - Only show unblocked contacts b - Only show blocked contacts i - Only show ignored contacts y - Only show archived contacts h - Only show hidden contacts e - Edit contact groups","title":"contacts (contact list)"},{"location":"de/user/accesskeys/#contact-single-contact-view","text":"m - Status messages p - Posts and Comments d - Media o - Profile t - Contacts r - Advanced","title":"contact (single contact view)"},{"location":"de/user/accesskeys/#message","text":"m - New message","title":"message"},{"location":"de/user/accesskeys/#network","text":"e - Sort by Comment Date t - Sort by Receipt Date q - Sort by Creation Date r - Conversation (Posts that mention or involve you) w - New posts m - Favourite Posts","title":"network"},{"location":"de/user/accesskeys/#notifications","text":"y - System w - Network r - Personal h - Home i - Introductions","title":"notifications"},{"location":"de/user/accesskeys/#settings","text":"o - Account 2 - Two-factor authentication p - Profiles t - Additional features w - Social Networks l - Addons d - Delegations b - Connected apps e - Export personal data r - Remove account","title":"settings"},{"location":"de/user/keyboard-shortcuts/","tags":["user","accesskeys","shortcuts"],"text":"Keyboard shortcuts in Friendica # General # j: Scroll to next thread k: Scroll to previous thread","title":"Shortcuts"},{"location":"de/user/keyboard-shortcuts/#keyboard-shortcuts-in-friendica","text":"","title":"Keyboard shortcuts in Friendica"},{"location":"de/user/keyboard-shortcuts/#general","text":"j: Scroll to next thread k: Scroll to previous thread","title":"General"},{"location":"de/user/two-factor-authentication/","tags":["user"],"text":"Configuring two-factor authentication # You can configure two-factor authentication using a mobile app. A time-based one-time password (TOTP) application automatically generates an authentication code that changes after a certain period of time. Tip : To configure authentication via TOTP on multiple devices, during setup, scan the QR code using each device at the same time. If 2FA is already enabled, and you want to add another device, you must re-configure 2FA from your security settings. Enabling two-factor authentication # 1. Download an authenticator app # Any authenticator app should work with Friendica. Nonetheless, we recommend: For iOS, Matt Rubin's MIT-licensed Authenticator app . For Android, andOTP . 2. Record your one-use recovery codes # From your two-factor authentication user settings ( https://your-site.info/settings/2fa ), enter your password and click on \"Enable two-factor authentication\". You will be presented with a list of one-use recovery codes. Please save those in the same place you are saving your Friendica password (ideally, in a password manager like KeePass ). When you're done, click on \"Next\". 3. Set up your authenticator app # You have three methods to set up your authenticator app: Scan the QR Code with your device camera. This will automatically configure your account on the app. Click/tap on the provided totp:// URl. Ideally your authenticator app should be called with this URL and set up your account. Enter your account settings manually. Friendica is using default settings for token type, code digit count and hashing algorithm, but you may be required to enter them in your app. Tip : If you have multiple devices, configure them all at this point. Then verify your app is correctly configured by submitting a code provided by your app. This will conclude two-factor authentication configuration. Note: If you leave this screen at any point without having submitted a verification code, two-factor authentication won't be enabled on your account. To complete the configuration, just come back to your two-factor authentication user settings and click on \"Finish configuration\" after entering your current password. Disabling two-factor authentication # You can disable two-factor authentication at any time by going to your two-factor authentication user settings and click on \"Disable two-factor authentication\" after entering your current password. You should remove your Friendica account from your authenticator app as it won't work again even if you reenable two-factor authentication. In this case you will have to configure your authenticator app again using the process above. Managing your one-time recovery codes # When two-factor authentication is enabled, you can show your recovery codes, including the ones you've already used. You can freely regenerate a new set of fresh recovery codes, just be sure to replace the previous ones where you saved them as they won't be active anymore. Third-party applications and API # Third-party applications using the Friendica API can't accept two-factor time-based authentication codes. Instead, if you enabled two-factor authentication, you have to generate app-specific randomly generated long passwords to use in your apps instead of your regular account password. Note : Your regular password won't work at all when prompted in third-party apps if you enabled two-factor authentication. You can generate as many app-specific passwords as you want, they will be shown once to you just after you generated it. Just copy and paste it in your third-party app in the Friendica account password input field at this point. We recommend generating a single app-specific password for each separate third-party app you are using, using a meaningful description of the target app (like \"Frienqa on my Fairphone 2\"). You can also revoke any and all app-specific password you generated this way. This may log you out of the third-party application(s) you used the revoked app-specific password to log in with. Trusted browsers # As a convenience, during two-factor authentication it is possible to identify a browser as trusted. This will skip all further two-factor authentication prompt on this browser. You can remove any or all of these trusted browsers in the two-factor authentication settings.","title":"2FA"},{"location":"de/user/two-factor-authentication/#configuring-two-factor-authentication","text":"You can configure two-factor authentication using a mobile app. A time-based one-time password (TOTP) application automatically generates an authentication code that changes after a certain period of time. Tip : To configure authentication via TOTP on multiple devices, during setup, scan the QR code using each device at the same time. If 2FA is already enabled, and you want to add another device, you must re-configure 2FA from your security settings.","title":"Configuring two-factor authentication"},{"location":"de/user/two-factor-authentication/#enabling-two-factor-authentication","text":"","title":"Enabling two-factor authentication"},{"location":"de/user/two-factor-authentication/#1-download-an-authenticator-app","text":"Any authenticator app should work with Friendica. Nonetheless, we recommend: For iOS, Matt Rubin's MIT-licensed Authenticator app . For Android, andOTP .","title":"1. Download an authenticator app"},{"location":"de/user/two-factor-authentication/#2-record-your-one-use-recovery-codes","text":"From your two-factor authentication user settings ( https://your-site.info/settings/2fa ), enter your password and click on \"Enable two-factor authentication\". You will be presented with a list of one-use recovery codes. Please save those in the same place you are saving your Friendica password (ideally, in a password manager like KeePass ). When you're done, click on \"Next\".","title":"2. Record your one-use recovery codes"},{"location":"de/user/two-factor-authentication/#3-set-up-your-authenticator-app","text":"You have three methods to set up your authenticator app: Scan the QR Code with your device camera. This will automatically configure your account on the app. Click/tap on the provided totp:// URl. Ideally your authenticator app should be called with this URL and set up your account. Enter your account settings manually. Friendica is using default settings for token type, code digit count and hashing algorithm, but you may be required to enter them in your app. Tip : If you have multiple devices, configure them all at this point. Then verify your app is correctly configured by submitting a code provided by your app. This will conclude two-factor authentication configuration. Note: If you leave this screen at any point without having submitted a verification code, two-factor authentication won't be enabled on your account. To complete the configuration, just come back to your two-factor authentication user settings and click on \"Finish configuration\" after entering your current password.","title":"3. Set up your authenticator app"},{"location":"de/user/two-factor-authentication/#disabling-two-factor-authentication","text":"You can disable two-factor authentication at any time by going to your two-factor authentication user settings and click on \"Disable two-factor authentication\" after entering your current password. You should remove your Friendica account from your authenticator app as it won't work again even if you reenable two-factor authentication. In this case you will have to configure your authenticator app again using the process above.","title":"Disabling two-factor authentication"},{"location":"de/user/two-factor-authentication/#managing-your-one-time-recovery-codes","text":"When two-factor authentication is enabled, you can show your recovery codes, including the ones you've already used. You can freely regenerate a new set of fresh recovery codes, just be sure to replace the previous ones where you saved them as they won't be active anymore.","title":"Managing your one-time recovery codes"},{"location":"de/user/two-factor-authentication/#third-party-applications-and-api","text":"Third-party applications using the Friendica API can't accept two-factor time-based authentication codes. Instead, if you enabled two-factor authentication, you have to generate app-specific randomly generated long passwords to use in your apps instead of your regular account password. Note : Your regular password won't work at all when prompted in third-party apps if you enabled two-factor authentication. You can generate as many app-specific passwords as you want, they will be shown once to you just after you generated it. Just copy and paste it in your third-party app in the Friendica account password input field at this point. We recommend generating a single app-specific password for each separate third-party app you are using, using a meaningful description of the target app (like \"Frienqa on my Fairphone 2\"). You can also revoke any and all app-specific password you generated this way. This may log you out of the third-party application(s) you used the revoked app-specific password to log in with.","title":"Third-party applications and API"},{"location":"de/user/two-factor-authentication/#trusted-browsers","text":"As a convenience, during two-factor authentication it is possible to identify a browser as trusted. This will skip all further two-factor authentication prompt on this browser. You can remove any or all of these trusted browsers in the two-factor authentication settings.","title":"Trusted browsers"}]}