Salta al contenuto principale


Un server ActivityPub in un singolo file PHP? Ecco come fare... Il post di @tofeo

Qualsiasi programma per computer può essere progettato per essere eseguito da un singolo file, se la progettazione è abbastanza sbagliata! 🤣

Volevo creare il server #Fediverse più semplice possibile, che potesse essere utilizzato come strumento didattico per mostrare come funziona ActivityPub / Mastodon.

shkspr.mobi/blog/2024/02/activ…

@Che succede nel Fediverso?


ActivityPub Server in a Single PHP File


shkspr.mobi/blog/2024/02/activ…

Any computer program can be designed to run from a single file if you architect it wrong enough!

I wanted to create the simplest possible Fediverse server which can be used as an educational tool to show how ActivityPub / Mastodon works.

The design goals were:

  • Upload a single PHP file to the server.
  • No databases or separate config files.
  • Single Actor (i.e. not multi-user).
  • Allow the Actor to be followed.
  • Post plain-text messages to followers.
  • Be roughly standards compliant.

And those goals have all been met! Check it out on GitLab. I warn you though, it is the nadir of bad coding. There are no tests, bugger-all security, scalability isn't considered, and it is a mess. But it works.

You can follow the test user @[url=https://example.viii.fi/example]example@example.viii.fi[/url]

Architecture


Firstly, I've slightly cheated on my "single file" stipulation. There's an .htaccess file which turns example.com/whatever into example.com/index.php?path=whatever

The index.php file then takes that path and does stuff. It also contains all the configuration variables which is very bad practice.

Rather than using a database, it saves files to disk.

Again, this is not suitable for any real world use. This is an educational tool to help explain the basics of posting messages to the Fediverse. It requires absolutely no dependencies. You do not need to spin up a dockerised hypervisor to manage your node bundles and re-compile everything to WASM. Just FTP the file up to prod and you're done.

Walkthrough


This is a quick ramble through the code. It is reasonably well documented, I hope.

Preamble


This is where you set up your account's name and bio. You also need to provide a public/private keypair. The posting page is protected with a password that also needs to be set here.
PHP // Set up the Actor's information $username = rawurlencode("example"); // Encoded as it is often used as part of a URl $realName = "E. Xample. Jr."; $summary = "Some text about the user."; $server = $_SERVER["SERVER_NAME"]; // Domain name this is hosted on // Generate locally or from cryptotools.net/rsagen // Newlines must be replaced with "\n" $key_private = "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"; $key_public = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"; // Password for sending messages $password = "P4ssW0rd";

Logging


ActivityPub is a "chatty" protocol. This takes all the requests your server receives and saves them in /logs/ as a datestamped text file.
PHP // Get all headers and requests sent to this server $headers = print_r( getallheaders(), true ); $postData = print_r( $_POST, true ); $getData = print_r( $_GET, true ); $filesData = print_r( $_FILES, true ); $body = json_decode( file_get_contents( "php://input" ), true ); $bodyData = print_r( $body, true ); $requestData = print_r( $_REQUEST, true ); $serverData = print_r( $_SERVER, true ); // Get the type of request - used in the log filename if ( isset( $body["type"] ) ) { $type = " " . $body["type"]; } else { $type = ""; } // Create a timestamp in ISO 8601 format for the filename $timestamp = date( "c" ); // Filename for the log $filename = "{$timestamp}{$type}.txt"; // Save headers and request data to the timestamped file in the logs directory if( ! is_dir( "logs" ) ) { mkdir( "logs"); } file_put_contents( "logs/{$filename}", "Headers: \n$headers \n\n" . "Body Data: \n$bodyData \n\n" . "POST Data: \n$postData \n\n" . "GET Data: \n$getData \n\n" . "Files Data: \n$filesData \n\n" . "Request Data:\n$requestData\n\n" . "Server Data: \n$serverData \n\n" );

Routing


The .htaccess changes /whatever to /?path=whateverThis runs the function of the path requested.
PHP !empty( $_GET["path"] ) ? $path = $_GET["path"] : die(); switch ($path) { case ".well-known/webfinger": webfinger(); case rawurldecode( $username ): username(); case "following": following(); case "followers": followers(); case "inbox": inbox(); case "write": write(); case "send": send(); default: die(); }

WebFinger


The WebFinger Protocol is used to identify accounts.It is requested with example.com/.well-known/webfinger?resource=acct:username@example.comThis server only has one user, so it ignores the query string and always returns the same details.
PHP function webfinger() { global $username, $server; $webfinger = array( "subject" => "acct:{$username}@{$server}", "links" => array( array( "rel" => "self", "type" => "application/activity+json", "href" => "https://{$server}/{$username}" ) ) ); header( "Content-Type: application/json" ); echo json_encode( $webfinger ); die(); }

Username


Requesting example.com/username returns a JSON document with the user's information.
PHP function username() { global $username, $realName, $summary, $server, $key_public; $user = array( "@context" => [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1" ], "id" => "https://{$server}/{$username}", "type" => "Person", "following" => "https://{$server}/following", "followers" => "https://{$server}/followers", "inbox" => "https://{$server}/inbox", "preferredUsername" => rawurldecode($username), "name" => "{$realName}", "summary" => "{$summary}", "url" => "https://{$server}", "manuallyApprovesFollowers" => true, "discoverable" => true, "published" => "2024-02-12T11:51:00Z", "icon" => [ "type" => "Image", "mediaType" => "image/png", "url" => "https://{$server}/icon.png" ], "publicKey" => [ "id" => "https://{$server}/{$username}#main-key", "owner" => "https://{$server}/{$username}", "publicKeyPem" => $key_public ] ); header( "Content-Type: application/activity+json" ); echo json_encode( $user ); die(); }

Following & Followers


These JSON documents show how many users are following / followers-of this account.The information here is self-attested. So you can lie and use any number you want.
PHPfunction following() { global $server; $following = array( "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/following", "type" => "Collection", "totalItems" => 0, "items" => [] ); header( "Content-Type: application/activity+json" ); echo json_encode( $following ); die(); } function followers() { global $server; $followers = array( "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/followers", "type" => "Collection", "totalItems" => 0, "items" => [] ); header( "Content-Type: application/activity+json" ); echo json_encode( $followers ); die(); }

Inbox


The /inbox is the main server. It receives all requests. This server only responds to "Follow" requests.A remote server sends a follow request which is a JSON file saying who they are.This code does not cryptographically validate the headers of the received message.The name of the remote user's server is saved to a file so that future messages can be delivered to it.An accept request is cryptographically signed and POST'd back to the remote server.
PHP function inbox() { global $body, $server, $username, $key_private; // Get the message and type $inbox_message = $body; $inbox_type = $inbox_message["type"]; // This inbox only responds to follow requests if ( "Follow" != $inbox_type ) { die(); } // Get the parameters $inbox_id = $inbox_message["id"]; $inbox_actor = $inbox_message["actor"]; $inbox_host = parse_url( $inbox_actor, PHP_URL_HOST ); // Does this account have any followers? if( file_exists( "followers.json" ) ) { $followers_file = file_get_contents( "followers.json" ); $followers_json = json_decode( $followers_file, true ); } else { $followers_json = array(); } // Add user to list. Don't care about duplicate users, server is what's important $followers_json[$inbox_host]["users"][] = $inbox_actor; // Save the new followers file file_put_contents( "followers.json", print_r( json_encode( $followers_json ), true ) ); // Response Message ID // This isn't used for anything important so could just be a random number $guid = uuid(); // Create the Accept message $message = [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/{$guid}", "type" => "Accept", "actor" => "https://{$server}/{$username}", "object" => [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => $inbox_id, "type" => $inbox_type, "actor" => $inbox_actor, "object" => "https://{$server}/{$username}", ] ]; // The Accept is sent to the server of the user who requested the follow // TODO: The path doesn't *always* end with/inbox $host = $inbox_host; $path = parse_url( $inbox_actor, PHP_URL_PATH ) . "/inbox"; // Get the signed headers $headers = generate_signed_headers( $message, $host, $path ); // Specify the URL of the remote server's inbox // TODO: The path doesn't *always* end with /inbox $remoteServerUrl = $inbox_actor . "/inbox"; // POST the message and header to the requester's inbox $ch = curl_init( $remoteServerUrl ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($message) ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); $response = curl_exec( $ch ); // Check for errors if( curl_errno( $ch ) ) { file_put_contents( "error.txt", curl_error( $ch ) ); } curl_close($ch); die(); }

UUID


Every message sent should have a unique ID. This can be anything you like. Some servers use a random number.I prefer a date-sortable string.
PHP function uuid() { return sprintf( "%08x-%04x-%04x-%04x-%012x", time(), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffffffffffff) ); }

Signing Headers


Every message that your server sends needs to be cryptographically signed with your Private Key.This is a complicated process. Please read "How to make friends and verify requests" for more information.
PHP function generate_signed_headers( $message, $host, $path ) { global $server, $username, $key_private; // Encode the message to JSON $message_json = json_encode( $message ); // Location of the Public Key $keyId = "https://{$server}/{$username}#main-key"; // Generate signing variables $hash = hash( "sha256", $message_json, true ); $digest = base64_encode( $hash ); $date = date( "D, d M Y H:i:s \G\M\T" ); // Get the Private Key $signer = openssl_get_privatekey( $key_private ); // Sign the path, host, date, and digest $stringToSign = "(request-target): post $path\nhost: $host\ndate: $date\ndigest: SHA-256=$digest"; // The signing function returns the variable $signature // php.net/manual/en/function.ope… openssl_sign( $stringToSign, $signature, $signer, OPENSSL_ALGO_SHA256 ); // Encode the signature $signature_b64 = base64_encode( $signature ); // Full signature header $signature_header = 'keyId="' . $keyId . '",algorithm="rsa-sha256",headers="(request-target) host date digest",signature="' . $signature_b64 . '"'; // Header for POST reply $headers = array( "Host: {$host}", "Date: {$date}", "Digest: SHA-256={$digest}", "Signature: {$signature_header}", "Content-Type: application/activity+json", "Accept: application/activity+json", ); return $headers; }

User Interface for Writing


This creates a basic HTML form. Type in your message and your password. It then POSTs the data to the /send endpoint.
PHP function write() { // Display an HTML form for the user to enter a message.echo <<< HTML<![url=https://mastodon.social/users/doctype]Aleks Dorohovich[/url] html><html lang="en-GB"> <head> <meta charset="UTF-8"> <title>Send Message</title> <style> *{font-family:sans-serif;font-size:1.1em;} </style> </head> <body> <form action="/send" method="post" enctype="multipart/form-data"> <label for="content">Your message:</label><br> <textarea id="content" name="content" rows="5" cols="32"></textarea><br> <label for="password">Password</label><br> <input type="password" name="password" id="password" size="32"><br> <input type="submit" value="Post Message"> </form> </body></html>HTML; die(); }

Send Endpoint


This takes the submitted message and checks the password is correct.It reads the followers.json file and sends the message to every server that is following this account.
PHP function send() { global $password, $server, $username, $key_private; // Does the posted password match the stored password? if( $password != $_POST["password"] ) { die(); } // Get the posted content $content = $_POST["content"]; // Current time - ISO8601 $timestamp = date( "c" ); // Outgoing Message ID $guid = uuid(); // Construct the Note // contentMap is used to prevent unnecessary "translate this post" pop ups // hardcoded to English $note = [ "@context" => array( "https://www.w3.org/ns/activitystreams" ), "id" => "https://{$server}/posts/{$guid}.json", "type" => "Note", "published" => $timestamp, "attributedTo" => "https://{$server}/{$username}", "content" => $content, "contentMap" => ["en" => $content], "to" => ["https://www.w3.org/ns/activitystreams#Public"] ]; // Construct the Message $message = [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/posts/{$guid}.json", "type" => "Create", "actor" => "https://{$server}/{$username}", "to" => [ "https://www.w3.org/ns/activitystreams#Public" ], "cc" => [ "https://{$server}/followers" ], "object" => $note ]; // Create the context for the permalink $note = [ "@context" => "https://www.w3.org/ns/activitystreams", ...$note ]; // Save the permalink $note_json = json_encode( $note ); // Check for posts/ directory and create it if( ! is_dir( "posts" ) ) { mkdir( "posts"); } file_put_contents( "posts/{$guid}.json", print_r( $note_json, true ) ); // Read existing users and get their hosts $followers_file = file_get_contents( "followers.json" ); $followers_json = json_decode( $followers_file, true ); $hosts = array_keys( $followers_json ); // Prepare to use the multiple cURL handle $mh = curl_multi_init(); // Loop through all the severs of the followers // Each server needs its own cURL handle // Each POST to an inbox needs to be signed separately foreach ( $hosts as $host ) { $path = "/inbox"; // Get the signed headers $headers = generate_signed_headers( $message, $host, $path ); // Specify the URL of the remote server $remoteServerUrl = "https://{$host}{$path}"; // POST the message and header to the requester's inbox $ch = curl_init( $remoteServerUrl ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($message) ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); // Add the handle to the multi-handle curl_multi_add_handle( $mh, $ch ); } // Execute the multi-handle do { $status = curl_multi_exec( $mh, $active ); if ( $active ) { curl_multi_select( $mh ); } } while ( $active && $status == CURLM_OK ); // Close the multi-handle curl_multi_close( $mh ); // Render the JSON so the user can see the POST has worked header( "Location: https://{$server}/posts/{$guid}.json" ); die(); }

Next Steps


This is not intended to be used in production. Ever. But if you would like to contribute more simple examples of how the protocol works, please come and play on GitLab.

You can follow the test user @[url=https://example.viii.fi/example]example@example.viii.fi[/url]

#activitypub #mastodon #php


reshared this



Si possono portare i gruppi Facebook nel Fediverso? Certamente. Ma come utilizzare le categorie di citiverse.it (ossia #NodeBB) da poliverso.org (ossia #Friendica)? Ecco una breve guida

Come ormai @Le Alternative abbiamo iniziato a sperimentare su NodeBB con l’ambizione di creare un’alternativa federata ai gruppi Facebook, soprattutto quelli locali.

Per chi lo visita direttamente dal sito, Citiverse è semplicemente un Forum; ma per chi lo usa dal Fediverso, Citiverse è un’istanza qualsiasi, con le “categorie” del Forum che diventano “gruppi Activitypub”, come le comunità Lemmy o i gruppi Friendica.

@Che succede nel Fediverso?

Così come per gli utenti Lemmy le categorie NodeBB sono indistinguibili dalle comunità Lemmy, anche per un utente Friendica, sono indistinguibili dai gruppi Friendica!


Al momento abbiamo creato una settantina di comunità, suddivise per macrocategorie e abbiamo già creato una guida per gli utenti Mastodon e ovviamente una guida per gli utenti Lemmy.

Ecco quindi una guida per gli utenti Friendica: volete visualizzare le categorie NodeBB dal vostro account Poliverso? Allora è sufficiente:

1) cercare il link della categoria su Citiverse: per esempio https://citiverse.it/category/13/roma o https://citiverse.it/category/31/localhost
2) copiarlo nella casella di ricerca di Friendica (in alto al centro) e premere invio (NB: spesso è sufficiente scrivere l'handle @roma@citiverse.it o @localhost@citiverse.it ma quello del link è il modo più sicuro)
3) a quel punto potremmo cliccare sulla scheda conversazioni

NB: alcune potrebbero sembrarvi vuote, perché i messaggi che “contengono” si vedono solo dopo che le avete seguite.

Per aprire una comversazione sulle comunità è invece sufficiente menzionare la comunità, per esempio @roma@citiverse.it o @localhost@citiverse.it all'interno del messaggio (possibilmente non nel primo paragrafo del messaggio) e pubblicare, come abbiamo scritto qui.

Per i più pigri? Ecco qua le "categorie" che abbiamo creato finora:


1) GRUPPI LOCALI

- Abruzzo: @abruzzo@citiverse.it
- - L’Aquila: @l-aquila@citiverse.it
- Basilicata: @basilicata@citiverse.it
- - Potenza: @potenza@citiverse.it
- Calabria: @calabria@citiverse.it
- - Catanzaro: @catanzaro@citiverse.it
- Campania: @campania@citiverse.it
- - Napoli: @napoli@citiverse.it
- Emilia Romagna: @emilia-romagna@citiverse.it
- - Bologna: @bologna@citiverse.it
- Friuli Venezia Giulia: @friuli-venezia-giulia@citiverse.it
- - Trieste: @trieste@citiverse.it
- Lazio: @lazio@citiverse.it
- - Roma: @roma@citiverse.it
- Liguria: @liguria@citiverse.it
- - Genova: @genova@citiverse.it
- Lombardia: @lombardia@citiverse.it
- - Varese: @varese@citiverse.it
- - Como: @como@citiverse.it
- - Milano: @milano@citiverse.it
- Marche: @marche@citiverse.it
- - Ancona: @ancona@citiverse.it
- - - Senigallia: @senigallia@citiverse.it
- Molise: @molise@citiverse.it
- - Campobasso: @campobasso@citiverse.it
- Piemonte: @piemonte@citiverse.it
- - Torino: @torino@citiverse.it
- Puglia: @puglia@citiverse.it
- - Bari: @bari@citiverse.it
- Sardegna: @sardegna@citiverse.it
- - Cagliari: @cagliari@citiverse.it
- Sicilia: @sicilia@citiverse.it
- - Palermo: @palermo@citiverse.it
- Toscana: @toscana@citiverse.it
- - Pisa: @pisa@citiverse.it
- - Firenze: @firenze@citiverse.it
- - Siena: @siena@citiverse.it
- Trentino Alto Adige: @trentino-alto-adige@citiverse.it
- - Trento: @trento@citiverse.it
- - Bolzano: @trento@citiverse.it- Umbria: @umbria@citiverse.it
- - Perugia: @perugia@citiverse.it
- Val d’Aosta: @val-d-aosta@citiverse.it
- - Aosta: @aosta@citiverse.it
- Veneto: @veneto@citiverse.it
- - Verona: @verona@citiverse.it
- - Padova: @padova@citiverse.it
- - Venezia: @venezia@citiverse.it
- - Rovigo: @rovigo@citiverse.it

2) FEDIVERSO

- Fediverso: @fediverso@citiverse.it
- - Friendica: @friendica@citiverse.it
- - Poliverso: @poliverso@citiverse.it
- Lemmy: @lemmy@citiverse.it
- - Feddit.It: @feddit.it@citiverse.it
- Bluesky: @bluesky@citiverse.it
- Mastodon Glitch-Soc: @mastodon-glitch@citiverse.it
- - Poliversity: @poliversity@citiverse.it

3) GRUPPI E ASSOCIAZIONI

- Gruppi e associazioni: @gruppi-e-associazioni@citiverse.it
- - Fiab L’Aquila: @fiab-l-aquila@citiverse.it
- - Neverland: @neverland@citiverse.it
- - Vegan City: @vegan-city@citiverse.it


4) DEGOOGLIZZAZIONE


- Addio Big Tech: @addio-big-tech@citiverse.it
- - Browser: @browser@citiverse.it
- - Metaland: @metaland@citiverse.it
- - Localhost: @localhost@citiverse.it
- - Googlelandia: @googlelandia@citiverse.it
- - Amazon-ia: @amazon-ia@citiverse.it


5) ALTRO


- Annunci: @annunci@citiverse.it
- Test: @test@citiverse.it


Un mese di sperimentazione con Citiverse.it. Quali sono le comunità attive e, soprattutto, di cosa abbiamo bisogno?


@fediverso@feddit.it

Un mese fa @skariko e io abbiamo ininziato a sperimentare su NodeBB con l'ambizione di creare un'alternativa federata ai gruppi Facebook, soprattutto quelli locali.

Per chi lo visita direttamente dal sito, Citiverse è un Forum; ma per chi lo usa dal Fediverso, Citiverse è un'istanza qualsiasi, ma con le "categorie" del Forum che diventano "gruppi Activitypub", come le comunità Lemmy.

Al momento abbiamo creato una settantina di comunità, suddivise per macrocategorie.

Volete visualizzarle dal vostro account Mastodon? Eccole qua:


NB: alcune potrebbero sembrarvi vuote, perché i messaggi che "contengono" si vedono solo dopo che le avete seguite.


1) DISCUSSIONI GENERALI



2) LUOGHI E CITTA'



3) FEDIVERSO



GRUPPI E ASSOCIAZIONI



4) ALTRO



DI COSA ABBIAMO BISOGNO


Vogliamo far diventare Citiverse un'alternativa ai gruppi Facebook, ma per farlo abbiamo bisogno che sia una comunità attiva:
Se la discussione è scarsa, nessuno prenderà in considerazione citiverse.it! Quindi:

1) seguite le comunità e partecipate alle discussioni con il vostro account federato
2) se volete una nuova comunità, chiedetecela
3) e se volete iscrivervi al forum, in questa fase, dobbiamo inviarvi l'invito via email


Questa voce è stata modificata (4 mesi fa)
in reply to Max - Poliverso 🇪🇺🇮🇹

@Massimiliano Polito 🇪🇺🇮🇹 @Le Alternative

Questa cosa mi interessa molto, qualche domanda:

1) perché sconsigliate di menzionare la comunità nella prima riga?

Perché viene una schifezza: la prima riga infatti diventa un titolo nelle piattaforme forum-like, quindi scrivere la menzione all'inizio rende orripilante il post. La cosa migliore è scrivere un primo paragrafo con un titolo riassuntivo della conversazione, poi la menzione e poi il resto del testo

Me ne scordo di cosa? 😁

😂😭

2) è possibile vedere da citiverse.it quale sia l'handle di una comunità

Generalmente è lo stesso nome della categoria. Per esempio se la categoria è https://citiverse.it/category/13/NOMECATEGORIA allora l'handle è al 99% @NOMECATEGORIA@citiverse.it ma quando è la prima volta che usi una comunità, ti conviene fare prima la ricerca, perché la comunità potrebbe non essere ancora stata collegata dalla tua istanza

3) giorni fa ho creato un account su citiverse.it per poter interagire con le comunità, a questo punto mi viene il dubbio che avrei potuto fare tutto con il mio account su poliverso.org senza farne uno nuovo anche lì. Corretto?

Non necessariamente: per esempio io presefrisco utilizzare un account social (Mastodon o Friendica) per scrivere nuovi post su citiverse.it perché lo trovo più comodo. Ma l'esperienza Forum è molto più ordinata e, soprattutto, NodeBB recupera molto bene i contenuti dalle altre istanze. Quindi in un cero senso è vantaggioso usare un account NodeBB.
Inoltre se vuoi moderare una comunità, avere un account NodeBB è fondamentale.

Per concludere, direi che avere due account è meglio che averne uno solo

in reply to Max - Poliverso 🇪🇺🇮🇹

@Massimiliano Polito 🇪🇺🇮🇹 @Le Alternative

1) quindi il titolo del post, per chi usa Friendica, viene ignorato da nodeBB?

No, in effetti non dovrebbe affatto essere ignorato, ma siccome il titolo non lo uso quasi mai, non saprei risponderti... Magari prova a pubblicare un nuovo post con Titolo e vedi che succede

in reply to Poliverso - notizie dal Fediverso ⁂

@Poliverso - notizie dal Fediverso ⁂ @Le Alternative

Volevo mettere un messaggio di prova, sono andato a cercare il link del forum di test su citiverse.it e mi sono accorto che avevo mandato un messaggio di prova giorni fa per vedere come funzionava e manco a farlo a posta quel messaggio aveva un titolo.

NodeBB ha usato il titolo che avevo messo su Friendica come titolo del post che ha creato su citiverse ma anche come prima riga del suo testo.



Cinque passi per iniziare a utilizzare al meglio Friendica (e un'idea per una passeggiata diversa nel Fediverso)

Questo post è rivolto soprattutto agli utenti Friendica e in particolare a quelli di Poliverso, ma consigliamo di leggerlo a tutti gli abitanti del Fediverso.
Se non ti interessa, ignoralo, altrimenti guardalo come a un modo insolito di guardare le cose.
Se invece ti piace così tanto il nostro progetto da volerci aiutare finanziandolo, puoi farlo attraverso Liberapay o Ko-Fi

@Che succede nel Fediverso?

Ma veniamo ai cinque passi per iniziare a utilizzare al meglio Friendica:

1) Primo passo


Leggi la sezione dedicata ai nuovi iscritti (ma è utile anche a quelli meno nuovi)


2) Secondo passo


Accedi alla pagina di modifica del tuo profilo
Dalla sezione "PERSONALE" puoi aggiungere una descrizione breve
Dalla sezione "VARIE" puoi aggiungere link alle tue pagine e ai tuoi profili social
Dalla sezione "Campi profilo personalizzati" puoi inserire quello che ti pare...


3) Terzo passo


Accedi alla pagina di gestione dell'Account
Da qui ricorda di impostare il fuso orario della tua località perché ti sarà utile per la gestione del calendario eventi (sì, Friendica può gestire anche gli eventi Mobilizon e Gancio!)


4) Quarto passo


Visita la directory dei profili pubblici di Poliverso e segui i profili che ti interessano. Esiste una pagina anche per i gruppi Friendica.
Se vuoi, puoi anche scaricare la lista completa di tutti gli account gestiti dallo staff di Poliverso e subito dopo, importala dalla sezione "Importa contatti" della pagina apposita.
Puoi trovare una lista di utenti interessanti di tutto il fediverso italiano a questa pagina


5) Quinto passo


Se hai un account Bluesky, dalla sezione Social Networks puoi collegare il tuoi account Bluesky per utilizzarlo attraverso il tuo Friendica.


E ADESSO...
...è il momento di una passeggiata di allenamento nel Fediverso!
Di seguito troverai alcuni link utili:
A) Termini di servizio (può sembrare banale, ma non tutti li leggono)
B) Guida generale a Friendica
C) directory dei profili pubblici dell'istanza
D) Note generali su Friendica
E) Come evitare problemi di visibilità del proprio profilo
F) Fediquette, la fediquette del fediverso
G) Risorse informative sul fediverso italiano
H) Una guida a mastodon che può essere utile anche per chi è entrato a far parte del mondo di Friendica
I) Note sui "gruppi" Friendica (= gruppi facebook)
L) Interoperabilità tra friendica e le piattaforme meno complete
M) Friendica e Lemmy, una coppia fantastica
N) Un articolo sulla socialità del Fediverso
O) Alcune considerazioni sulla moderazione scritte dallo staff di mastodon.uno più grande istanza italiana

informapirata.it/2022/03/22/fe…


Mi sono iscritto a Friendica, ma non c’è nessuno! No, non è così…

Friendica è un progetto nato per dare agli utenti di Facebook un ambiente social rispettoso del principio “privacy by default”.
Ma l’utente che non lo sa, rischia di trovarsi solo e non sapere perché…

informapirata.it/2021/09/03/mi…

#Friendica #ImpostazioniDiPrivacy #Poliverso

[ap_content




Questa magari la "pinniamo", eh


Risposta alla domanda "perché nessuna istanza elimina gli utenti inattivi?"

Diverse risposte, su piani diversi:

1) come ha detto qui @Il Fediverso fa schifo? gli amministratori preferiscono far vedere di avere centinaia di utenti, quando invece ne hanno solo qualche decina o millemila utenti quando invece ne hanno solo qualche centinaio
2) come ha detto qui @Lorenzo avere un numero di utenti complessivi più alto ti pone più in alto nelle tabella internazionali e quindi tra i primi a essere scelto dagli utenti (una bella coccolina per l'ego degli amministratori)
3) come ha detto qui @Piero Bosio è anche una rottura di palle eliminare gli utenti inattivi, soprattutto in mancanza di apposite funzioni messe a disposizione dagli svilupatori
4) come ha detto qui @Luca Sironi quasi nessuno ha preventivamente impostato regole di cancellazione e pertanto questo rende meno facile programmare un'eliminazione degli utenti inattivi (noi l'abbiamo fatto praticamente solo dopo tre avvisi)
5) come ho ricordato qui ultimo (e più importante) motivo è il fatto che per primi gli sviluppatori non vogliono creare tool di cancellazione massiva degli utenti inattivi e, a differenza degli amministratori, non lo fanno solo per avere coccole per l'ego, ma anche per dimostrare a donatori e investitori di essere un investimento interessante ("ehi, guarda quanti utenti abbiamo!"). Finché le cose staranno così, è impossibile che gli amministratori si mettano a cancellare utenti a caso



@Eleonora @Lorenzo

Diverse risposte, su piani diversi:

1) come ha detto qui @Il Fediverso fa schifo? gli amministratori preferiscono far vedere di avere centinaia di utenti, quando invece ne hanno solo qualche decina o millemila utenti quando invece ne hanno solo qualche centinaio
2) come ha detto qui @Lorenzo avere un numero di utenti complessivi più alto ti pone più in alto nelle tabella internazionali e quindi tra i primi a essere scelto dagli utenti (una bella coccolina per l'ego degli amministratori)
3) come ha detto qui @Piero Bosio è anche una rottura di palle eliminare gli utenti inattivi, soprattutto in mancanza di apposite funzioni messe a disposizione dagli svilupatori
4) come ha detto qui @Luca Sironi quasi nessuno ha preventivamente impostato regole di cancellazione e pertanto questo rende meno facile programmare un'eliminazione degli utenti inattivi (noi l'abbiamo fatto praticamente solo dopo tre avvisi)
5) come ho ricordato qui ultimo (e più importante) motivo è il fatto che per primi gli sviluppatori non vogliono creare tool di cancellazione massiva degli utenti inattivi e, a differenza degli amministratori, non lo fanno solo per avere coccole per l'ego, ma anche per dimostrare a donatori e investitori di essere un investimento interessante ("ehi, guarda quanti utenti abbiamo!"). Finché le cose staranno così, è impossibile che gli amministratori si mettano a cancellare utenti a caso


Poliverso & Poliversity reshared this.



Poliverso è un progetto indipendente per mettere a disposizione modi alternativi di usare il Fediverso. Ecco i motivi per cui è importante sostenerlo. Anche se sei un utente di altre istanze

Il progetto Poliverso, da cui nasce lo stesso progetto feddit.it, è stato creato per mettere a disposizione degli utenti italiani un'intera istanza basata su Friendica, che non è solo la più completa alternativa a Facebook, ma è anche il software più potente per l'esplorazione del Fediverso!

Con poliverso.org puoi interagire con tutti i profili delle Fediverso, ma puoi anche collegare il tuo account Bluesky; a differenza di Mastodon puoi scrivere post lunghi con il testo formattato e le immagini in linea, ma puoi anche creare eventi o interagire con gli eventi di Mobilizon, seguire il feed RSS di altri siti web o addirittura di canali telegram e puoi impostarne anche la pubblicazione automatica dal tuo profilo.
Con Friendica è possibile anche creare utenti di servizio gestiti da uno staff di più utenti ognuno con un proprio account.
Infine è possibile creare gruppi del Fediverso, come i gruppi Facebook, ossia degli account che quando vengono menzionati ricondividono automaticamente il post pubblicato, cosicché venga visto da tutti gli utenti (utenti di tutto il fediverso!) che seguono quel gruppo.

Ma il progetto Poliverso non si ferma qui: insieme al blog lealternative.net abbiamo aperto feddit.it, la prima istanza italiana basata su Lemmy, un'alternativa a reddit perfettamente federata con il resto del Fediverso.
Su feddit.it puoi scegliere una delle tante comunità tematiche presenti e aprire un nuovo thread, come su un subreddit, e segnalare o commentare i link di articoli di giornale o di post interessanti, visualizzandoli in un interfaccia che ricorda quella di un forum.
Feddit.it non è soltanto uno spazio a disposizione dei suoi utenti, ma tutti coloro che dispongono di un account Mastodon, Friendica, Pleroma, Misskey o Pixelfed [b]possono aprire un nuovo thread (anche dal tuo blog WordPress!) creando un nuovo post e menzionando la comunità di proprio interesse![/b]

E questo è esattamente quello che abbiamo fatto con questo post che è stato creato da Friendica, menzionando l'account Lemmy @Che succede nel Fediverso? e che può essere visualizzato nella relativa comunità.

Il terzo progetto di Poliverso è costituito da poliversity.it, la prima istanza Mastodon in Italia dedicata al mondo dell'università e della ricerca ma anche a quello del giornalismo. Se sei un ricercatore, uno studente, un giornalista o se semplicemente sei interessato a questi temi, poi iscriverti e partecipare alle discussioni.

Poliverso vuole essere un servizio non solo per i suoi utenti ma per tutto il Fediverso italiano, grazie agli account di informazione di Poliverso (come il nostro bollettino sul Fediverso, la rassegna sulla Cybersecurity, quella sulla Privacy e quella sulle notizie dei Pirati internazionali), i gruppi Friendica e le comunità Lemmy.
Per questo motivo, saremmo molto lieti di ricevere un contributo anche da parte di utenti italiani di altre istanze, italiane e straniere. Se vuoi contribuire al progetto Poliverso, puoi fare una donazione su questi due canali di raccolta:
1) Ko-fi
2) Liberapay

Se invece vuoi contribuire in maniera specifica al solo progetto feddit.it, puoi offrire un contributo economico di sostegno al manutenzione dei server a questa pagina Liberapay

Grazie di cuore ❤

ko-fi.com/poliverso

in reply to Poliverso - notizie dal Fediverso ⁂

La più grande pecca di friendica è la mancanza di un app decente e l'interfaccia web anni 2000 secondo me😅
in reply to Man

@Man

> La più grande pecca di friendica è la mancanza di un app decente

Sì, vero, ma funziona così discretamente bene da browser mobile che la mancanza di un'app non è tutta questa grande tragedia

> e l'interfaccia web anni 2000

Diciamo 2010... dài! 😁
E comunque qui hai totalmente ragione: l'interfaccia è davvero retrò, ma qui su Poliverso stiamo valutando la possibilità di creare un accesso alternativo attraverso Soapbox o Semaphore (grazie a un'idea di @Chiara [Ainur] [Айнұр] ❤️). Questi strati applicativi sono molto interessanti e forniscono addirittura un'interfaccia molto più bella e moderna rispetto a quella dello stesso Mastodon, ma dobbiamo prima capire bene come farci girare le funzionalità più avanzate di Friendica, perché sono quelle funzionalità che rendono questo software così unico e vantaggioso rispetto agli altri software del fediverso

@Man
in reply to Poliverso - notizie dal Fediverso ⁂

Mai usato Friendica, ho giusto dato uno sguardo all'API per un'applicazione a cui ho lavorato (wink wink), ma consultando la documentazione ho notato che implementa l'API di Mastodon. Non basterebbe utilizzare uno dei tanti frontend già disponibili per Mastodon? O per caso Friendica ha delle funzionalità in più che non sarebbero disponibili su tali frontend?
in reply to Nerd02

@Nerd02 hai compreso perfettamente il problema: è vero, Friendica implementa l'api di Mastodon, ma per far funzionare alcune funzionalità devono essere tarati gli strati applicativi che oggi vanno bene per mastodon o per pleroma. Questo è il problema che, discutendo con @Fabio è emerso come Maggiore criticità.

Non sono un talebano di Friendica, ma bisogna fare una analisi funzionale per capire quali sono le cose alle quali poter rinunciare e quali no. Sì siamo costretti a eliminare alcune peculiarità distintive del sistema per far somigliare tutto a mastodon o misskey, Allora tanto varrebbe utilizzare mastodon o misskey 😅

Friendica è un software eccezionale nel quale c'è tutto o quasi, ma è chiaramente stato realizzato da sviluppatori eccezionali che tuttavia mancavano di una cultura adeguata nella gestione di prodotto.

Friendica sembra essere stato sviluppato Per esaudire tutti ma proprio tutti i desideri di tutti i potenziali utenti...

In pratica, si è voluto realizzare un gigantesco e potentissimo Mecha modulare come Voltron

Purtuttavia il risultato estetico ed ergonomico è stato più simile a uno di quei mostri Goffi e dimenticabili che venivano spediti a ogni puntata per sconfiggere il robottone protagonista...😁 😄 🤣

in reply to Poliverso - notizie dal Fediverso ⁂

Ahahaha splendida analogia.

Non metto in dubbio i vantaggi di Friendica. Anzi, volendomi avvicinare al mondo del microblogging (dal quale ahimé sono tagliato fuori, usando Lemmy) stavo giusto pensando di aprirmi un'istanza con Friendica, piuttosto che Mastodon. Però personalmente trovo l'UI davvero DAVVERO brutta, è ciò che finora mi ha allontanato dal provarlo.

Se si riuscisse ad avere un backend come l'attuale Friendica e un'UI bella moderna come Soapbox o Misskey sarebbe davvero il meglio dei due mondi.

in reply to Poliverso - notizie dal Fediverso ⁂

Ed usare i vecchi script Greasemonkey per personalizzare l'interfaccia? Troppo complicato 🤔🤔?
Unknown parent

@Antonino Campaniolo 👣 :birra: sì, Infatti mi sembra chiaro che attualmente non ci siano energie nella community di Friendica per realizzare una nuova interfaccia...

Purtroppo noi siamo ancora nella fase 1, ossia quella per individuare uno strato applicativo versatile e affidabile. Sull'affidabilità, ovviamente, soapbox è avvantaggiato, considerando la sua maturità e la qualità del prodotto.
Il problema è che dobbiamo valutare anche la versatilità e per farlo ci serve tempo.

Una volta Superata la fase 1 bisogna passare alla fase 2 che è la valutazione della fattibilità di un'operazione del genere sulla base degli strumenti che abbiamo a disposizione.

Poi c'è la fase 3 che non consiste ancora nel mettere le mani sul codice, perché non abbiamo la forza per farlo, ma piuttosto di iniziare una campagna di coinvolgimento di persone disposte a contribuire allo sviluppo di una versione beta... in questa fase sarà importante coinvolgere sia la comunità di Friendica sia quella di Soapbox.

Solo dopo si può iniziare a fare qualcosa... 😭

@Man



"La scelta di convogliare di default sulla tua istanza gli utenti dell'app ufficiale è sbagliata!" L'appello di Aral Balkan al fondatore di Mastodon Eugen Gargron

@Che succede nel Fediverso?

Carissimo @Eugen Rochko
Ti prego di rivalutare la decisione di incentivare la centralizzazione sul mastodon.social nell'app ufficiale.

Questo è il tipo di progettazione che una startup finanziata da Venture Capital avrebbe implementato, non una no-profit che agisce nell'interesse di un bene comune.

Sono sicuro che non vuoi che mastodon.social diventi un mini-Twitter e non desideri diventare un mini-Musk.

Non è così che vinceremo.

Più istanze, non più grandi istanze: questa è la chiave.

mstdn.social/@feditips/1102332…

#decentralisation #fediverse #staySmall


Dear @Gargron,

Please reevaluate your decision to incentivise centralisation on mastodon.social in the official app.

This is the sort of design a VC-funded startup would implement, not a non-profit acting in the interests of a healthy commons.

I’m sure you don’t want mastodon.social to become mini-Twitter and you don’t want to become mini-Musk.

That’s not how we win this.

More instances, not larger instances is the key.

mastodon.ar.al/@feditips@mstdn…

#decentralisation #fediverse #staySmall


Unknown parent

@Steffy anch'io preferisco il browser per tutti i servizi del fediverso, mastodon compreso. Tuttavia l'app di mastodon è ben fatta e altre come Fedilab ti danno anche la possibilità di seguire intere istanze. Inoltre l'utente standard di qualsiasi smartphone preferisce sempre l'app

@informapirata :privacypride: @Naixke :mastodon: @Eugen Rochko

reshared this

Unknown parent

mastodon - Collegamento all'originale
informapirata ⁂

@naixke saranno le mie origini venete, ma trovo decisamente intrigante un'app con un nome del genere... 😅

@steffy @notizie @Gargron






Nasce un EuroPoliverso!

ResPublicae.eu è stato lanciato! I loro amministratori vogliono facilitare l'adesione al #discorso politico dell'UE sul #fediverso .

Per ora si limiteranno a creare su # Mastodon un mirror dei 1500 account #Twitter di funzionari ed eurodeputati dell'UE elencati da Wikidata e european-union.europa.eu/conta…

Argomenti di esempio:
respublicae.eu/tags/IPCC
respublicae.eu/tags/EPlenary

Un ringraziamento speciale a @Masto.host per l'eccellente servizio ea @robertoszek@respublicae.eu per essere stato di grande aiuto con #Stork / #pleromabot .
pleromabot.robertoszek.xyz

(notizia segnalataci da @:fedora: filippo db :gnu: )


ResPublicae.eu has launched! We want to make it easier to join the #EU policy discourse on the #fediverse.

For now we just mirror on #Mastodon about 1500 #Twitter accounts of EU officials and MEPs as listed by Wikidata and european-union.europa.eu/conta….

Example topics:
respublicae.eu/tags/IPCC
respublicae.eu/tags/EPlenary

Special thanks to @mastohost for the excellent service and @robertoszek for being so helpful with #Stork / #pleromabot.
pleromabot.robertoszek.xyz





@ggreenwald It is not advisable to rely only on social networks and proprietary messaging systems, without having an alternative option: people must take refuge in #fediverse! And you journalists and editors should be the first to set a good example ...
informapirata.it/la-nave-dei-fo…