-
-## Introduction
-
-A free and ethical photo sharing platform, powered by ActivityPub federation.
-
-Pixelfed is freely licensed under the AGPL license.
-
-
-
-## Communication
-
-The ways you can communicate on the project are below. Before interacting, please
-read through the [Code Of Conduct](https://github.com/pixelfed/pixelfed/blob/dev/CODE_OF_CONDUCT.md).
-
-* Project on Mastodon: [@pixelfed@mastodon.social](https://mastodon.social/@pixelfed)
-* E-mail: [hello@pixelfed.org](mailto:hello@pixelfed.org)
-
-
-## Pixelfed Sponsors
-
-We would like to extend our thanks to the following sponsors for funding Pixelfed development.
-
-- [NLnet Foundation](https://nlnet.nl) and [NGI0
-Discovery](https://nlnet.nl/discovery/), part of the [Next Generation
-Internet](https://ngi.eu) initiative.
-
-If you are interested in becoming a sponsor, please visit one of the following links:
-
-- [Patreon](https://www.patreon.com/dansup/overview)
-- [Liberapay](https://liberapay.com/pixelfed)
-- [OpenCollective](https://opencollective.com/pixelfed)
-
-## Development
-
-Run `hugo serve` to start a live development server.
\ No newline at end of file
diff --git a/content/en/developing-pixelfed/_index.md b/content/en/developing-pixelfed/_index.md
deleted file mode 100644
index 92fa612..0000000
--- a/content/en/developing-pixelfed/_index.md
+++ /dev/null
@@ -1,8 +0,0 @@
-+++
-title = "Developing for Pixelfed"
-summary = "Instructions for collaborating on the Pixelfed codebase and project"
-[menu]
-[menu.docs]
-identifier = "development"
-weight = 20
-+++
\ No newline at end of file
diff --git a/content/en/developing-pixelfed/intro.md b/content/en/developing-pixelfed/intro.md
deleted file mode 100644
index e7ed6ea..0000000
--- a/content/en/developing-pixelfed/intro.md
+++ /dev/null
@@ -1,33 +0,0 @@
-+++
-title = "Setting up your environment"
-summary = "Download and install the pre-requisites, then run these commands."
-weight = 10
-[menu]
-[menu.docs]
-identifier = "development/intro"
-parent = "development"
-+++
-
-## Requirements
-- [Git](https://git-scm.com/downloads)
-- [PHP](https://www.php.net/manual/en/install.php)
-- [Composer](https://getcomposer.org/download/)
-- [Node](https://nodejs.org/en/download/)
-- [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
-- Database
- - [MariaDB](https://mariadb.org/download/?t=mariadb)
- - [MySQL](https://www.mysql.com/downloads/)
- - [PostgreSQL](https://www.postgresql.org/download/)
-- [Redis](https://redis.io/docs/getting-started/)
-
-## Development Setup
-For local/non-production use only.
-```bash
-git clone https://github.com/pixelfed/pixelfed
-cd pixelfed
-composer install
-php artisan install
-php artisan serve
-```
-
-The development server will start on: http://localhost:8000
diff --git a/content/en/developing-pixelfed/testing.md b/content/en/developing-pixelfed/testing.md
deleted file mode 100644
index 961c0b9..0000000
--- a/content/en/developing-pixelfed/testing.md
+++ /dev/null
@@ -1,17 +0,0 @@
-+++
-title = "Running tests locally"
-summary = "Verify changes you are making using the automated test suites."
-weight = 11
-[menu]
-[menu.docs]
-identifier = "development/testing"
-parent = "development"
-+++
-
-Currently there are tests in place for the Laravel components. These can be run with the following command.
-
-```bash
-php artisan test
-```
-
-Further reading: [Testing with Laravel](https://laravel.com/docs/testing)
\ No newline at end of file
diff --git a/content/en/install-guides/_index.md b/content/en/install-guides/_index.md
deleted file mode 100644
index 2ff9ee7..0000000
--- a/content/en/install-guides/_index.md
+++ /dev/null
@@ -1,8 +0,0 @@
-+++
-title = "Distro-specific install guides"
-summary = "End-to-end guides for installing Pixelfed on the distribution of your choice."
-[menu]
-[menu.docs]
-identifier = "install-guides"
-weight = 99
-+++
\ No newline at end of file
diff --git a/content/en/install-guides/arch.md b/content/en/install-guides/arch.md
deleted file mode 100644
index 6e2a07a..0000000
--- a/content/en/install-guides/arch.md
+++ /dev/null
@@ -1,225 +0,0 @@
-+++
-title = "Deploying Pixelfed on Arch Linux"
-summary = "End-to-end guide for installing Pixelfed on Arch Linux"
-[menu]
-[menu.docs]
-identifier = "install-guides/arch"
-parent = "install-guides"
-name = "Arch Linux"
-+++
-
-## Assumptions
-These instructions will install Pixelfed with the following:
-- Nginx (instead of Apache)
-- MariaDB (instead of PostgreSQL)
-- PHP-FPM (latest version)
-- Redis and PHP-FPM running via sockets instead of TCP (same machine)
-- `pixelfed` user for running Horizon queues, `http` user for running web processes (Arch default)
-- Repo cloned at `/srv/http/pixelfed`
-- No other sites/services running on this machine
-
-## Preparing a machine
-
-You will need a machine running Arch Linux with access to the root account.
-
-1. Login as `root`.
-2. Create the `pixelfed` user and group:
-```bash
-useradd -rU -s /bin/bash -d /srv/http/pixelfed pixelfed
-```
-3. Install dependencies:
-```bash
-pacman -S --needed nginx mariadb redis git php-fpm php-intl php-gd php-imagick php-redis composer jpegoptim optipng pngquant imagemagick ffmpeg unzip certbot certbot-nginx
-```
-4. Setup database. During `mysql_secure_installation`, hit Enter to use the default options. Make sure to set a password for the SQL user `root` (as by default, there is no password).
-```bash
-mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
-systemctl enable --now mariadb
-mysql_secure_installation
-mysql -u root -p
-```
-```sql
-create database pixelfed;
-grant all privileges on pixelfed.* to 'pixelfed'@'localhost' identified by 'strong_password';
-flush privileges;
-exit
-```
-5. Edit `/etc/php/php.ini` and uncomment the following lines:
-```
-extension=bcmath
-extension=exif
-extension=gd
-extension=iconv
-extension=intl
-extension=mysqli
-extension=pdo_mysql
-```
-Edit the following lines to your desired upload limits:
-```
-post_max_size = 8M
-upload_max_filesize = 2M
-max_file_uploads = 20
-```
-Edit `/etc/php/conf.d/imagick.ini` and uncomment:
-```
-extension=imagick
-```
-Edit `/etc/php/conf.d/redis.ini` and uncomment:
-```
-extension=redis
-```
-Edit `/etc/php/conf.d/igbinary.ini` and uncomment:
-```
-extension=igbinary
-```
-Create a PHP-FPM pool for Pixelfed:
-```bash
-cd /etc/php/php-fpm.d/
-cp www.conf pixelfed.conf
-$EDITOR pixelfed.conf
-```
-Make the following changes to the PHP-FPM pool:
-```
-; use the username of the app-user as the pool name, e.g. pixelfed
-[pixelfed]
-user = pixelfed
-group = pixelfed
-; to use a tcp socket, e.g. if running php-fpm on a different machine than your app:
-; (note that the port 9001 is used, since php-fpm defaults to running on port 9000;)
-; (however, the port can be whatever you want)
-; listen = 127.0.0.1:9001;
-; but it's better to use a socket if you're running locally on the same machine:
-listen = /run/php-fpm/pixelfed.sock
-listen.owner = http
-listen.group = http
-listen.mode = 0660
-[...]
-```
-6. Edit `/etc/redis.conf` and edit the following lines:
-```
-port 6379 # change this to "port 0" to disable network packets
-unixsocket /run/redis/redis.sock #
-unixsocketperm 770 # give permission to "redis" user and group
-```
-7. Edit `/etc/nginx/nginx.conf`:
-```nginx
-worker_processes 1; # change to auto, or 1 x your CPU cores, but 1 is enough
-events {
- worker_connections 1024; # 512-1024 is fine for a small site, but you may want to use up to 10k or more, if running in production with many users
-}
-http {
- # [...]
- client_max_body_size 9m; # add this line to configure client upload file size
-
- gzip on; # uncomment this line
- server { # delete this entire block
- # [...]
- }
-
- include /srv/http/pixelfed/nginx.conf; # we will make this file later
-}
-```
-Generate SSL cert:
-```bash
-mkdir /etc/nginx/ssl
-openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.crt
-```
-8. Add users to groups:
-```bash
-usermod -aG redis pixelfed # give app user access to redis for queues
-```
-9. Enable services:
-```bash
-systemctl enable {nginx,redis,php-fpm}
-systemctl start {redis,php-fpm} # nginx will fail if started now
-```
-
-## Pixelfed setup
-1. Clone the repo:
-```
-cd /srv/http
-git clone -b dev https://github.com/pixelfed/pixelfed.git pixelfed
-```
-2. Setup environment variables and nginx:
-```bash
-cd pixelfed
-cp contrib/nginx.conf nginx.conf
-$EDITOR nginx.conf
-## in particular, set:
-### - the correct domain name
-### - client_max_body_size to your desired upload limit
-### - fastcgi_pass correct path (e.g. unix:/run/php-fpm/pixelfed.sock;)
-
-cp .env.example .env
-$EDITOR .env
-## in particular, set:
-### DB_SOCKET = /run/mysqld/mysqld.sock
-###
-### REDIS_HOST = /run/redis/redis.sock
-### REDIS_PORT = null
-###
-### IMAGE_DRIVER = imagick
-
-$EDITOR config/database.php
-## change predis to phpredis
-```
-3. Create the following file at `/etc/systemd/system/pixelfed.service`:
-```
-[Unit]
-Description=Pixelfed task queueing via Laravel Horizon
-After=network.target
-Requires=mariadb
-Requires=php-fpm
-Requires=redis
-Requires=nginx
-
-[Service]
-Type=simple
-ExecStart=/usr/bin/php /srv/http/pixelfed/artisan horizon
-User=pixelfed
-Restart=on-failure
-
-[Install]
-WantedBy=multi-user.target
-```
-4. Set permissions:
-```bash
-chown -R pixelfed:pixelfed .
-find . -type d -exec chmod 755 {} \;
-find . -type f -exec chmod 644 {} \;
-```
-5. Switch to the `pixelfed` user:
-```bash
-su - pixelfed
-```
-6. Deploy:
-```bash
-$EDITOR composer.json
-## change require php to >= instead of ^
-## remove beyondcode/laravel-self-diagnosis
-## change league/iso3166 to >= instead of ^
-## change spatie/laravel-image-optimizer to >= instead of ^
-## change laravel/ui to >= instead of ^
-composer update
-composer install --no-ansi --no-interaction --no-progress --no-scripts --optimize-autoloader
-php artisan key:generate
-php artisan storage:link
-php artisan horizon:install
-php artisan horizon:publish
-php artisan migrate --force
-```
-Optionally, use cache [NOTE: if you run these commands, you will need to run them every time you change .env or update Pixelfed]:
-```bash
-php artisan config:cache
-php artisan route:cache
-php artisan view:cache
-```
-Import Places data:
-```bash
-php artisan import:cities
-```
-7. Start web server and Horizon task queue:
-```bash
-exit
-systemctl enable --now {nginx,pixelfed}
-```
\ No newline at end of file
diff --git a/content/en/running-pixelfed/_index.md b/content/en/running-pixelfed/_index.md
deleted file mode 100644
index 75bf1d9..0000000
--- a/content/en/running-pixelfed/_index.md
+++ /dev/null
@@ -1,8 +0,0 @@
-+++
-title = "Run your own Pixelfed website"
-summary = "Instructions for installing and maintaining your own Pixelfed-powered website."
-weight = 10
-[menu]
-[menu.docs]
-identifier = "admin"
-+++
\ No newline at end of file
diff --git a/content/en/running-pixelfed/administration.md b/content/en/running-pixelfed/administration.md
deleted file mode 100644
index e7eb177..0000000
--- a/content/en/running-pixelfed/administration.md
+++ /dev/null
@@ -1,64 +0,0 @@
-+++
-title = "Administering your website"
-summary = "Tips and instructions for managing your Pixelfed installation"
-weight = 30
-[menu]
-[menu.docs]
-identifier = "admin/administration"
-parent = "admin"
-+++
-
-## Updating Pixelfed
-
-After you have installed Pixelfed, you may update to the latest commits by pulling the dev branch and doing necessary updates/migration/caching:
-
-```bash
-cd /path/to/pixelfed
-git pull origin dev
-composer install
-php artisan config:cache
-php artisan route:cache
-php artisan migrate --force
-```
-
-## Artisan commands
-
-### User management
-
-- `user:admin` Make a user an admin, or remove admin privileges.
-- `user:create` Create a new user
-- `user:delete` Delete account
-- `user:show` Show user info
-- `user:suspend` Suspend a local user.
-- `user:unsuspend` Unsuspend a local user.
-- `user:table` Display latest users
-
-
-For example, you can give a user the admin role with the following command:
-
-```bash
-php artisan user:admin username_here
-```
-
-### Fix accounts with reserved names
-
-You can run this command to fix accounts created before that username was reserved.
-```bash
-php artisan fix:usernames
-```
-
-### Remove unused media
-
-With this command you can trigger the garbage collection on the media files. This frees up disk space. All files being older than one hour and which are not used in any status are removed.
-
-```bash
-php artisan media:gc
-```
-
-### Create an OAuth client
-
-You can create an OAuth client from the command line using this command:
-
-```bash
-php artisan passport:client --personal
-```
\ No newline at end of file
diff --git a/content/en/running-pixelfed/optional-features/_index.md b/content/en/running-pixelfed/optional-features/_index.md
deleted file mode 100644
index be19f98..0000000
--- a/content/en/running-pixelfed/optional-features/_index.md
+++ /dev/null
@@ -1,9 +0,0 @@
-+++
-title = "Optional features"
-summary = "Functionality that can be optionally added to your Pixelfed website"
-weight = 40
-[menu]
-[menu.docs]
-identifier = "admin/optional"
-parent = "admin"
-+++
\ No newline at end of file
diff --git a/content/en/running-pixelfed/optional-features/ldap-authentication.md b/content/en/running-pixelfed/optional-features/ldap-authentication.md
deleted file mode 100644
index c4089c4..0000000
--- a/content/en/running-pixelfed/optional-features/ldap-authentication.md
+++ /dev/null
@@ -1,135 +0,0 @@
-+++
-title = "LDAP Authentication"
-summary = "You can configure your Pixelfed server to authenticate with an LDAP Server!"
-weight = 43
-[menu]
-[menu.docs]
-identifier = "admin/optional/ldap"
-parent = "admin/optional"
-+++
-
-## Prerequisites
-
-- Enable the `ext-ldap` PHP extension in your servers `php.ini` configuration
-
-- Run the following command in Pixelfed root directory (the one with app, bootstrap, public, storage)
-
-```
-composer require directorytree/ldaprecord-laravel
-```
-
-### Step 1: Updating user model
-
-You need to edit the `app/User.php` file and add the first two lines
-
-```php
-use LdapRecord\Laravel\Auth\LdapAuthenticatable;
-use LdapRecord\Laravel\Auth\AuthenticatesWithLdap;
-```
-
-Then change the following line to include `implements LdapAuthenticatable`
-
-```php
-class User extends Authenticatable implements LdapAuthenticatable
-```
-
-And finally add `AuthenticatesWithLdap` after the other traits.
-
-```php
-use Notifiable, SoftDeletes, HasApiTokens, UserRateLimit, HasFactory, AuthenticatesWithLdap;
-```
-
-Afterwards your `app/User.php` file should look like this:
-
-```php
- [
- 'driver' => 'eloquent',
- 'model' => App\User::class,
- ],
-```
-
-Insert the following code immediately after the previous lines you commented out or deleted:
-
-```php
-'users' => [
- 'driver' => 'ldap',
- 'model' => LdapRecord\Models\ActiveDirectory\User::class,
- 'rules' => [],
- 'database' => [
- 'model' => App\User::class,
- 'sync_passwords' => false,
- 'sync_attributes' => [
- 'name' => 'cn',
- 'email' => 'mail',
- ],
- ],
-],
-```
-
-### Step 3: Connecting to LDAP
-
-Configure your LDAP server settings.
-
-Add the following lines to your `.env` file and edit to your needs.
-
-```
-LDAP_LOGGING=true
-LDAP_CONNECTION=default
-LDAP_CONNECTIONS=default
-
-LDAP_DEFAULT_HOSTS=10.0.0.1
-LDAP_DEFAULT_USERNAME="cn=admin,dc=local,dc=com"
-LDAP_DEFAULT_PASSWORD=secret
-LDAP_DEFAULT_PORT=389
-LDAP_DEFAULT_BASE_DN="dc=local,dc=com"
-LDAP_DEFAULT_TIMEOUT=5
-LDAP_DEFAULT_SSL=false
-LDAP_DEFAULT_TLS=false
-```
-
-### Step 4: Finishing Up!
-
-You're almost ready! The last thing you need to do is flush the configuration cache by running
-
-```
-php artisan config:cache
-```
-
-You are now ready to login via LDAP!
-
-To test your connection you can run
-
-```
-php artisan ldap:test
-```
\ No newline at end of file
diff --git a/content/en/running-pixelfed/optional-features/livestreaming.md b/content/en/running-pixelfed/optional-features/livestreaming.md
deleted file mode 100644
index ab50d36..0000000
--- a/content/en/running-pixelfed/optional-features/livestreaming.md
+++ /dev/null
@@ -1,133 +0,0 @@
-+++
-title = "Livestreaming (Pixelfed Live)"
-summary = "Pixelfed Live is a mobile based livestreaming feature."
-weight = 41
-[menu]
-[menu.docs]
-identifier = "admin/optional/live"
-parent = "admin/optional"
-+++
-
-## Installing and Configuring Nginx-RTMP
-
-Begin by running the following commands as a non-root user to update your package listings and install the Nginx module:
-
-```bash
-sudo apt update
-sudo apt install libnginx-mod-rtmp
-```
-
-Installing the module won’t automatically start providing a stream. You’ll need to add a configuration block to your Nginx configuration file that defines where and how the stream will be available.
-
-Using nano or your favorite text editor, open Nginx’s main configuration file, /etc/nginx/nginx.conf, and add this configuration block to the end of the file:
-
-```bash
-sudo nano /etc/nginx/nginx.conf
-```
-
-Make sure you edit lines **16**, **17** with your domain (leave http:// and the path as is), and line **29** with the path to your `storage/app/public/live-hls` directory
-
-```bash
-rtmp {
- server {
- listen 1935;
- chunk_size 4096;
-
- application live {
- live on;
- record off;
- interleave on;
- wait_key on;
-
- deny play all;
-
- push rtmp://127.0.0.1:1935/hls-live flashver=FMLE/3.0;
-
- on_publish http://localhost/api/live/broadcast/publish;
- on_publish_done http://localhost/api/live/broadcast/finish;
- }
-
- application hls-live {
- live on;
- hls on;
- interleave on;
-
- deny play all;
- allow publish 127.0.0.1;
- deny publish all;
-
- hls_path /home/pixelfed/storage/app/public/live-hls;
-
- hls_nested on;
- hls_fragment 5s;
- hls_playlist_length 30s;
- hls_fragment_naming system;
- }
- }
-}
-```
-
-Save and close the file. If you are using `nano`, press Ctrl+X, then when prompted, Y and Enter.
-
-This provides the beginning of your RTMP configuration. By default, it listens on port 1935, which means you’ll need to open that port in your firewall. If you configured ufw as part of your initial server setup run the following command.
-
-```bash
-sudo ufw allow 1935/tcp
-```
-
-Now you can reload Nginx with your changes:
-
-```bash
-sudo systemctl reload nginx.service
-```
-
-You should now have a working RTMP server. In the next section, we’ll configure the environment settings.
-
-## Configure Livestreaming Settings
-
-Now you have the RTMP server setup, you can proceed to add the following environment variables to your `.env` file.
-
-### Basic configuration
-
-```bash
-// Enable Pixelfed Live
-HLS_LIVE=true
-
-// RTMP server domain
-HLS_LIVE_HOST=pixelfed.social
-
-// Enable livestreaming from the Pixelfed Live app
-HLS_LIVE_BROADCAST_SOURCE_APP=true
-```
-
-### Advanced configuration
-
-In addition to the basic configuration variables, the following variables can be used optionally
-
-#### Stream Limits
-
-```bash
-// Max concurrent live streams
-HLS_LIVE_BROADCAST_MAX_ACTIVE=10
-
-// Max stream duration in minutes
-HLS_LIVE_BROADCAST_MAX_DURATION=60
-```
-
-#### User Limits
-
-Advanced control over who can livestream
-
-```bash
-// Enable broadcast limits
-HLS_LIVE_BROADCAST_LIMITS=true
-
-// Only allow users with over 1000 followers to go live
-HLS_LIVE_BROADCAST_LIMITS_MIN_FOLLOWERS=1000
-
-// Only allow users with accounts older than 90 days to go live
-HLS_LIVE_BROADCAST_LIMITS_MIN_ACCOUNT_AGE=90
-
-// Only allow admin accounts to go live
-HLS_LIVE_BROADCAST_LIMITS_ADMINS_ONLY=true
-```
diff --git a/content/en/running-pixelfed/optional-features/websockets.md b/content/en/running-pixelfed/optional-features/websockets.md
deleted file mode 100644
index dd15360..0000000
--- a/content/en/running-pixelfed/optional-features/websockets.md
+++ /dev/null
@@ -1,385 +0,0 @@
-+++
-title = "Websockets"
-summary = "Websockets provide real time chat for Live Streaming and in the future, other aspects of the frontend UI and mobile apps."
-weight = 42
-[menu]
-[menu.docs]
-identifier = "admin/optional/websockets"
-parent = "admin/optional"
-+++
-
-{{}}
-When using websockets as a Pusher replacement without having used Pusher before, **it does not matter what you set as your `PUSHER_` variables. Just make sure they are unique and not empty**.
-{{}}
-
-## Pusher Configuration
-
-When broadcasting events from your Pixelfed server to your WebSocket server, the default behavior is to send the event information to the official Pusher server. But since the Pixelfed WebSockets package comes with its own Pusher API implementation, we need to tell Pixelfed to send the events to our own server.
-
-To do this, you should add the `host` and `port` configuration key to your `config/broadcasting.php` and add it to the `pusher` section. The default port of the Pixelfed WebSocket server is 6001.
-
-```php
-'pusher' => [
- 'driver' => 'pusher',
- 'key' => env('PUSHER_APP_KEY'),
- 'secret' => env('PUSHER_APP_SECRET'),
- 'app_id' => env('PUSHER_APP_ID'),
- 'options' => [
- 'cluster' => env('PUSHER_APP_CLUSTER'),
- 'encrypted' => true,
- 'host' => env('PUSHER_APP_HOST', '127.0.0.1'),
- 'port' => env('PUSHER_APP_PORT', 6001),
- 'scheme' => env('PUSHER_APP_SCHEME', 'http'),
- 'curl_options' => [
- CURLOPT_SSL_VERIFYHOST => 0,
- CURLOPT_SSL_VERIFYPEER => 0,
- ],
- ],
-],
-```
-
-## Starting the WebSocket server
-
-Once you have configured your WebSocket apps and Pusher settings, you can start the Pixelfed WebSocket server by issuing the artisan command:
-
-```bash
-php artisan websockets:serve
-```
-
-### Using a different port
-
-The default port of the Pixelfed WebSocket server is `6001`. You may pass a different port to the command using the `--port` option.
-
-```bash
-php artisan websockets:serve --port=3030
-```
-
-This will start listening on port `3030`.
-
-### Restricting the listening host
-
-By default, the Pixelfed WebSocket server will listen on `0.0.0.0` and will allow incoming connections from all networks. If you want to restrict this, you can start the server with a `--host` option, followed by an IP.
-
-For example, by using `127.0.0.1`, you will only allow WebSocket connections from localhost.
-
-```bash
-php artisan websockets:serve --host=127.0.0.1
-```
-
-## Restarting Server
-
-If you use Supervisor to keep your server alive, you might want to restart it just like `queue:restart` does.
-
-To do so, consider using the `websockets:restart`. In a maximum of 10 seconds since issuing the command, the server will be restarted.
-
-```bash
-php artisan websockets:restart
-```
-
-## SSL Support
-
-Since most of the web's traffic is going through HTTPS, it's also crucial to secure your WebSocket server. Luckily, adding SSL support to this package is really simple.
-
-### Configuration
-
-The SSL configuration takes place in your `config/websockets.php` file.
-
-The default configuration has a SSL section that looks like this:
-
-```php
-'ssl' => [
-
- 'local_cert' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT', null),
-
- 'capath' => env('LARAVEL_WEBSOCKETS_SSL_CA', null),
-
- 'local_pk' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_PK', null),
-
- 'passphrase' => env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null),
-
- 'verify_peer' => env('APP_ENV') === 'production',
-
- 'allow_self_signed' => env('APP_ENV') !== 'production',
-
-],
-```
-
-But this is only a subset of all the available configuration options.
-
-This packages makes use of the official PHP [SSL context options](http://php.net/manual/en/context.ssl.php).
-
-So if you find yourself in the need of adding additional configuration settings, take a look at the PHP documentation and simply add the configuration parameters that you need.
-
-After setting up your SSL settings, you can simply (re)start your WebSocket server using:
-
-```bash
-php artisan websockets:serve
-```
-
-### Server configuration
-
-When broadcasting events from your Pixelfed server to the WebSocket server, you also need to tell Pixelfed to make use of HTTPS instead of HTTP. You can do this by setting the `PUSHER_APP_SCHEME` variable to `https`
-
-```
-PUSHER_APP_SCHEME=https
-```
-
-Your connection from `config/broadcasting.php` would look like this:
-
-```php
-'pusher' => [
- 'driver' => 'pusher',
- 'key' => env('PUSHER_APP_KEY'),
- 'secret' => env('PUSHER_APP_SECRET'),
- 'app_id' => env('PUSHER_APP_ID'),
- 'options' => [
- 'cluster' => env('PUSHER_APP_CLUSTER'),
- 'encrypted' => true,
- 'host' => env('PUSHER_APP_HOST', '127.0.0.1'),
- 'port' => env('PUSHER_APP_PORT', 6001),
- 'scheme' => env('PUSHER_APP_SCHEME', 'http'),
- ],
-],
-```
-
-Since the SSL configuration can vary quite a lot, depending on your setup, let's take a look at the most common approaches.
-
-### Usage with a reverse proxy (like Nginx)
-
-Alternatively, you can also use a proxy service - like Nginx, HAProxy or Caddy - to handle the SSL configurations and proxy all requests in plain HTTP to your echo server.
-
-A basic Nginx configuration would look like this, but you might want to tweak the SSL parameters to your liking.
-
-```
-server {
- listen 443 ssl;
- listen [::]:443 ssl;
- server_name socket.yourapp.tld;
-
- # Start the SSL configurations
- ssl on;
- ssl_certificate /etc/letsencrypt/live/socket.yourapp.tld/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/socket.yourapp.tld/privkey.pem;
-
- location / {
- proxy_pass http://127.0.0.1:6001;
- proxy_read_timeout 60;
- proxy_connect_timeout 60;
- proxy_redirect off;
-
- # Allow the use of websockets
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection 'upgrade';
- proxy_set_header Host $host;
- proxy_cache_bypass $http_upgrade;
- }
-}
-```
-
-You can now talk HTTPS to `socket.yourapp.tld`. You would configure your `config/broadcasting.php` like the example above, treating your socket server as an `https` endpoint.
-
-#### Same location for websockets and web contents
-
-To have the websockets be served at the same location and port as your other web content, Nginx can be taught to map incoming requests based on their type to special sub-locations.
-
-```
-map $http_upgrade $type {
- default "web";
- websocket "ws";
-}
-
-server {
- # Your default configuration comes here...
-
- location / {
- try_files /nonexistent @$type;
- }
-
- location @web {
- try_files $uri $uri/ /index.php?$query_string;
- }
-
- location @ws {
- proxy_pass http://127.0.0.1:6001;
- proxy_set_header Host $host;
- proxy_read_timeout 60;
- proxy_connect_timeout 60;
- proxy_redirect off;
-
- # Allow the use of websockets
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection 'upgrade';
- proxy_set_header Host $host;
- proxy_cache_bypass $http_upgrade;
- }
-}
-```
-
-This configuration is useful if you do not want to open multiple ports or you are restricted to which ports are already opened on your server. Alternatively, a second Nginx location can be used on the server-side, while the Pusher configuration [`wsPath`](https://github.com/pusher/pusher-js#wspath) can be used on the client-side (_note: `"pusher-js": ">=4.2.2"` is required for this configuration option_).
-
-```
-server {
- # Your default configuration comes here...
-
- location /ws {
- proxy_pass http://127.0.0.1:6001;
- proxy_set_header Host $host;
- proxy_read_timeout 60;
- proxy_connect_timeout 60;
- proxy_redirect off;
-
- # Allow the use of websockets
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection 'upgrade';
- proxy_set_header Host $host;
- proxy_cache_bypass $http_upgrade;
- }
-}
-```
-
-#### Nginx worker connections
-
-Note that you might need to increase the amount of `worker_connections` in Nginx. Your WebSocket connections will now be sent to Nginx, which in turn will send those along to the websocket server.
-
-By default, that will have a sane limit of 1024 connections. If you are expecting more concurrent connections to your WebSockets, you can increase this in your global `nginx.conf`.
-
-```
-events {
- worker_connections 1024;
-}
-```
-
-You know you've reached this limit of your Nginx error logs contain similar messages to these:
-
-```
-[alert] 1024 worker_connections are not enough while connecting to upstream
-```
-
-Remember to restart your Nginx after you've modified the `worker_connections`.
-
-### Example using Caddy v2
-
-[Caddy](https://caddyserver.com) can also be used to automatically obtain a TLS certificate from Let's Encrypt and terminate TLS before proxying to your websocket server.
-
-An example configuration would look like this:
-
-```
-socket.yourapp.tld {
- @ws {
- header Connection *Upgrade*
- header Upgrade websocket
- }
- reverse_proxy @ws 127.0.0.1:6001
-}
-```
-
-Note that you should change `127.0.0.1` to the hostname of your websocket server. For example, if you're running in a Docker environment, this might be the container name of your websocket server.
-
-## Deploying
-
-When your application is ready to get deployed, here are some tips to improve your WebSocket server.
-
-### Open Connection Limit
-
-On Unix systems, every user that connects to your WebSocket server is represented as a file somewhere on the system.
-As a security measurement of every Unix based OS, the number of "file descriptors" an application may have open at a time is limited - most of the time to a default value of 1024 - which would result in a maximum number of 1024 concurrent users on your WebSocket server.
-
-In addition to the OS restrictions, this package makes use of an event loop called "stream_select", which has a hard limit of 1024.
-
-#### Increasing the maximum number of file descriptors
-
-The operating system limit of open "file descriptors" can be increased using the `ulimit` command. The `-n` option modifies the number of open file descriptors.
-
-```bash
-ulimit -n 10000
-```
-
-The `ulimit` command only **temporarily** increases the maximum number of open file descriptors. To permanently modify this value, you can edit it in your operating system `limits.conf` file.
-
-You are best to do so by creating a file in the `limits.d` directory. This will work for both Red Hat & Ubuntu derivatives.
-
-```bash
-$ cat /etc/security/limits.d/laravel-echo.conf
-laravel-echo soft nofile 10000
-```
-
-The above example assumes you will run your echo server as the `laravel-echo` user, you are free to change that to your liking.
-
-#### Changing the event loop
-
-To make use of a different event loop, that does not have a hard limit of 1024 concurrent connections, you can either install the `ev` or `event` PECL extension using:
-
-```bash
-sudo pecl install ev
-# or
-sudo pecl install event
-```
-
-#### Deploying on Laravel Forge
-
-If your are using [Laravel Forge](https://forge.laravel.com/) for the deployment [this article by Alex Bouma](https://alex.bouma.dev/installing-laravel-websockets-on-forge) might help you out.
-
-### Keeping the socket server running with supervisord
-
-The `websockets:serve` daemon needs to always be running in order to accept connections. This is a prime use case for `supervisor`, a task runner on Linux.
-
-First, make sure `supervisor` is installed.
-
-```bash
-# On Debian / Ubuntu
-apt install supervisor
-
-# On Red Hat / CentOS
-yum install supervisor
-systemctl enable supervisord
-```
-
-Once installed, add a new process that `supervisor` needs to keep running. You place your configurations in the `/etc/supervisor/conf.d` (Debian/Ubuntu) or `/etc/supervisord.d` (Red Hat/CentOS) directory.
-
-Within that directory, create a new file called `websockets.conf`.
-
-```bash
-[program:websockets]
-command=/usr/bin/php /home/laravel-echo/laravel-websockets/artisan websockets:serve
-numprocs=1
-autostart=true
-autorestart=true
-user=laravel-echo
-```
-
-Once created, instruct `supervisor` to reload its configuration files (without impacting the already running `supervisor` jobs).
-
-```bash
-supervisorctl update
-supervisorctl start websockets
-```
-
-Your echo server should now be running (you can verify this with `supervisorctl status`). If it were to crash, `supervisor` will automatically restart it.
-
-Please note that, by default, just like file descriptiors, `supervisor` will force a maximum number of open files onto all the processes that it manages. This is configured by the `minfds` parameter in `supervisord.conf`.
-
-If you want to increase the maximum number of open files, you may do so in `/etc/supervisor/supervisord.conf` (Debian/Ubuntu) or `/etc/supervisord.conf` (Red Hat/CentOS):
-
-```
-[supervisord]
-minfds=10240; (min. avail startup file descriptors;default 1024)
-```
-
-After changing this setting, you'll need to restart the supervisor process (which in turn will restart all your processes that it manages).
-
-### Cloudflare
-
-In some cases, you might use Cloudflare and notice that your production server does not seem to respond to your `:6001` port.
-
-This is because Cloudflare does not seem to open ports, [excepting a few of them](https://blog.cloudflare.com/cloudflare-now-supporting-more-ports/).
-
-To mitigate this issue, for example, you can run your server on port `2096`:
-
-```bash
-php artisan websockets:serve --port=2096
-```
-
-You will notice that the new `:2096` websockets server will work properly.
\ No newline at end of file
diff --git a/content/en/search/_index.md b/content/en/search/_index.md
deleted file mode 100644
index a7f481a..0000000
--- a/content/en/search/_index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-+++
-title = "Search"
-+++
\ No newline at end of file
diff --git a/content/en/technical-documentation/_index.md b/content/en/technical-documentation/_index.md
deleted file mode 100644
index db67fe9..0000000
--- a/content/en/technical-documentation/_index.md
+++ /dev/null
@@ -1,8 +0,0 @@
-+++
-title = "Technical documentation"
-summary = "Specifications and compatibility information for Pixelfed's inner workings."
-weight = 30
-[menu]
-[menu.docs]
-identifier = "tech"
-+++
\ No newline at end of file
diff --git a/content/en/technical-documentation/activitypub.md b/content/en/technical-documentation/activitypub.md
deleted file mode 100644
index 807d4e8..0000000
--- a/content/en/technical-documentation/activitypub.md
+++ /dev/null
@@ -1,257 +0,0 @@
-+++
-title = "ActivityPub"
-summary = "Information about how Pixelfed federates"
-[menu]
-[menu.docs]
-identifier = "tech/activitypub"
-parent = "tech"
-+++
-
-{{}}
-**WIP**
-
-This document is not yet finished.
-{{}}
-
-Pixelfed largely follows the ActivityPub server-to-server specification but it makes uses of some non-standard extensions, some of which are required for interacting with Pixelfed at all.
-
-[[toc]]
-
-## Caveats
-
-### TLS & URL Validation
-
-In Pixelfed, all activity object uris MUST begin with `https://`
-
-### sharedInbox
-
-In Pixelfed, users have an `inbox` and a communal `sharedInbox`. Other implementations MAY consolidate activity delivery to the `sharedInbox` rather than each individual user `inbox`.
-
-### Instance Actor
-
-An instance-wide actor is used in Pixelfed to sign `GET` requests to remote instances. The actor type is **Application** to differentiate from the **Person** type typically used by regular accounts.
-
-```json
-{
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "https://example.org/i/actor",
- "type": "Application",
- "inbox": "https://example.org/i/actor/inbox",
- "outbox": "https://example.org/i/actor/outbox",
- "preferredUsername": "example.org",
- "publicKey": {
- "id": "https://example.org/i/actor#main-key",
- "owner": "https://example.org/i/actor",
- "publicKeyPem": "-----BEGIN PUBLIC KEY-----..."
- },
- "manuallyApprovesFollowers": true,
- "url": "https://example.org/site/kb/instance-actor"
-}
-```
-
-## Extensions
-
-### Webfinger
-
-In Pixelfed, users are identified by a `username` and `domain` pair (e.g., `dansup@example.org`).
-This is used both for discovery and for unambiguously mentioning users across the fediverse. Furthermore, this is part of Pixelfed's database design from its very beginnings.
-
-As a result, Pixelfed requires that each ActivityPub actor uniquely maps back to an `acct:` URI that can be resolved via WebFinger.
-
-More information and examples are available at: https://docs.joinmastodon.org/spec/webfinger/
-
-### HTTP Signatures
-
-In order to authenticate activities, Pixelfed relies on HTTP Signatures, signing every `POST` and `GET` request to other ActivityPub implementations on behalf of the user authoring an activity (for `POST` requests) or an actor representing the Pixelfed server itself (for most `GET` requests).
-
-Pixelfed requires all `POST` requests to be signed, and MAY require `GET` requests to be signed, depending on the configuration of the Pixelfed server.
-
-More information on HTTP Signatures, as well as examples, can be found here: https://docs.joinmastodon.org/spec/security/#http
-
-## Hashtags
-
-Hashtags are represented by the `type` **Hashtag** and contain a `href` and `name` attribute like the example below.
-
-```json
-{
- "type": "Hashtag",
- "href": "https://pixelfed.social/discover/tags/mazda",
- "name": "#mazda"
-}
-```
-
-## Groups
-
-## Posts
-
-Posts are represented by the **Note** `type`. For more details see the [note](#note) section.
-
-## Profiles
-
-## Stories
-
-## Activity Types
-
-All Activity Types inherit the properties of the base Activity type. Some specific Activity Types are subtypes or specializations of more generalized Activity Types.
-
-### Add
-
-### Announce
-
-### Accept
-
-### Delete
-
-### Create
-
-Indicates that the actor has created the object. Supported object sub-types are **Note** and **Question**.
-
-```json
-{
- "@context": "https://www.w3.org/ns/activitystreams",
- "id": "https://example.org/p/dansup/2/activity",
- "type": "Create",
- "actor": "https://example.org/users/dansup",
- "object": {
- "id": "https://example.org/p/dansup/2",
- "type": "Note",
- "content": "This was my first IG post too...",
- ...
- }
-}
-```
-
-### Follow
-
-### Like
-
-### Reject
-
-### Undo
-
-### Question
-
-### Story:Reaction
-
-### Story:Reply
-
-### Update
-
-### View
-
-## Actor Types
-
-### Person
-
-## Object and Link Types
-
-
-
-
-
-### Document
-
-
-
-### Image
-
-Images are used to represent `Status` media
-
-```json
-{
- "type": "Image",
- "mediaType": "image/jpeg",
- "url": "https://example.org/s/...8o12Ji1A2x.jpeg",
- "name": null
-}
-```
-
-### Note
-
-Notes are converted to `Status` models internally
-
-```json
-{
- "@context": [
- "https://www.w3.org/ns/activitystreams",
- "https://w3id.org/security/v1",
- {
- "sc": "http://schema.org#",
- "Hashtag": "as:Hashtag",
- "sensitive": "as:sensitive",
- "commentsEnabled": "sc:Boolean",
- "capabilities": {
- "announce": {
- "@type": "@id"
- },
- "like": {
- "@type": "@id"
- },
- "reply": {
- "@type": "@id"
- }
- },
- "toot": "http://joinmastodon.org/ns#",
- "Emoji": "toot:Emoji"
- }
- ],
- "id": "https://example.org/p/dansup/2",
- "type": "Note",
- "summary": null,
- "content": "This was my first IG post too...",
- "inReplyTo": null,
- "published": "2018-06-01T05:16:51+00:00",
- "url": "https://example.org/p/dansup/2",
- "attributedTo": "https://example.org/users/dansup",
- "to": [
- "https://www.w3.org/ns/activitystreams#Public"
- ],
- "cc": [
- "https://example.org/users/dansup/followers"
- ],
- "sensitive": false,
- "attachment": [
- {
- "type": "Image",
- "mediaType": "image/jpeg",
- "url": "https://example.org/s/...Ji1A2x.jpeg",
- "name": null
- }
- ],
- "tag": [
- {
- "type": "Hashtag",
- "href": "https://example.org/discover/tags/mazda",
- "name": "#mazda"
- },
- {
- "type": "Hashtag",
- "href": "https://example.org/discover/tags/zoomzoom",
- "name": "#zoomzoom"
- }
- ],
- "commentsEnabled": false,
- "capabilities": {
- "announce": "https://www.w3.org/ns/activitystreams#Public",
- "like": "https://www.w3.org/ns/activitystreams#Public",
- "reply": null
- },
- "location": null
-}
-```
-
-
-
-
-
-
-### Video
-
-### Mention
-
-## Troubleshooting
-
-### Cloudflare
-
-Instances behind cloudflare may experience federation issues depending on the configuration. Check to ensure the `/f/sharedInbox`
\ No newline at end of file
diff --git a/content/en/technical-documentation/api.md b/content/en/technical-documentation/api.md
deleted file mode 100644
index 28a2491..0000000
--- a/content/en/technical-documentation/api.md
+++ /dev/null
@@ -1,35 +0,0 @@
-+++
-title = "API"
-summary = "Information about Pixelfed's REST API"
-[menu]
-[menu.docs]
-identifier = "tech/api"
-parent = "tech"
-+++
-
-Our v1 API is based on the [mastodon v1 API](https://docs.joinmastodon.org/methods/apps/). You can reference the Mastodon documentation, we listed the differences below.
-
-## Authorization
-We use OAuth for api authentication, you can create an OAuth app or Personal Access Token in the Account Settings on Pixelfed.
-
-To create a personal access client :
-
-Add `OAUTH_ENABLED=true` to .env
-```bash
-php artisan passport:keys
-php artisan config:cache
-php artisan route:cache
-php artisan passport:client --personal
-```
-You can then create a new token on this page `/settings/applications`
-
-## Differences with Mastodon API
-- Some endpoints return empty arrays as they are not applicable to Pixelfed
-- Link Header Pagination is not supported
-- Custom limits for captions and albums, they are listed on the /api/v1/instance endpoint
-- OAuth Tokens will expire after 15 days, and must be refreshed after that
-- Statuses do not honor the (optional) `idempotency-key`
-
-## Libraries
-### PHP
-- [dansup/pixelfed-php](https://github.com/dansup/pixelfed-php)
diff --git a/content/en/technical-documentation/config.md b/content/en/technical-documentation/config.md
deleted file mode 100644
index 78558fb..0000000
--- a/content/en/technical-documentation/config.md
+++ /dev/null
@@ -1,1529 +0,0 @@
-+++
-title = "Configuration"
-summary = "A list of environment variables"
-[menu]
-[menu.docs]
-identifier = "tech/config"
-parent = "tech"
-+++
-
-All configuration files are located in the `config/` folder of your Pixelfed installation. These are the environment variables you can set in your `.env` file; note that some variables are currently unused and do nothing.
-
-{{}}
-**Summary of important variables**
-
-For a user-facing guide to which environment variables you might want to set, check out the [installation guide](../running-pixelfed/installation.md#configure-environment-variables) instead.
-{{}}
-
-## APP
-
-### `APP_NAME`
-
-This value is the name of your application. This value is used when the framework needs to place the application's name in a notification or any other location as required by the application or its packages. Defaults to `"Pixelfed"`.
-
-### `APP_ENV`
-
-This value determines the "environment" your application is currently running in. This may determine how you prefer to configure various services your application utilizes. Set this in your ".env" file. Defaults to `"production"`.
-
-### `APP_DEBUG`
-
-When your application is in debug mode, detailed error messages with stack traces will be shown on every error that occurs within your application. If disabled, a simple generic error page is shown. Defaults to `false`.
-
-### `APP_URL`
-
-This URL is used by the console to properly generate URLs when using the Artisan command line tool. You should set this to the root of your application so that it is used when running Artisan tasks. Defaults to `"https://localhost"`.
-
-### `APP_TIMEZONE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"UTC"`. Do not edit your timezone or things will break!
-
-### `APP_LOCALE`
-
-The application locale determines the default locale that will be used by the translation service provider. You are free to set this value to any of the locales which will be supported by the application. Defaults to `"en"`.
-
-### `APP_FALLBACK_LOCALE`
-
-The fallback locale determines the locale to use when the current one is not available. You may change the value to correspond to any of the language folders that are provided through your application. Defaults to `"en"`.
-
-### `APP_KEY`
-
-(Not listed on Admin > Diagnostics.) A random 32-character string to be used as an encryption key. No default value; use `php artisan key:generate` to generate. This key is used by the Illuminate encrypter service and should be set to a random, 32 character string, otherwise these encrypted strings will not be safe. Please do this before deploying an application!
-
-## BACKUP
-
-(Not listed on Admin > Diagnostics.)
-
-### `BACKUP_ARCHIVE_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) The password to be used for archive encryption. Set to `null` to disable encryption.
-
-### `BACKUP_EMAIL_ADDRESS`
-
-(Not listed on Admin > Diagnostics.) Defaults to `""`.
-
-## BROADCASTING
-
-### `BROADCAST_DRIVER`
-
-This option controls the default broadcaster that will be used by the framework when an event needs to be broadcast. Possible values:
-
-- `"pusher"`
-- `"redis"`
-- `"log"`
-- `"null"` (default)
-
-### PUSHER
-
-#### `PUSHER_APP_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PUSHER_APP_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PUSHER_APP_ID`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PUSHER_APP_CLUSTER`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PUSHER_APP_ENCRYPTED`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-#### `PUSHER_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `APP_DOMAIN`.
-
-#### `PUSHER_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `443`.
-
-#### `PUSHER_SCHEME`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"https"`.
-
-## CACHE
-
-### `CACHE_DRIVER`
-
-This option controls the default cache connection that gets used while using this caching library. This connection is used when another is not explicitly specified when executing a given caching function. Possible values:
-
-- `"apc"`
-- `"array"`
-- `"database"`
-- `"file"` (default)
-- `"memcached"`
-- `"redis"`
-
-### `CACHE_PREFIX`
-
-(Not listed on Admin > Diagnostics.) Defaults to `${APP_NAME}_cache`, or `laravel_cache` if no `APP_NAME` is set.
-
-### MEMCACHED
-
-(Not listed on Admin > Diagnostics.)
-
-#### `MEMCACHED_PERSISTENT_ID`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `MEMCACHED_USERNAME`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `MEMCACHED_PASSWORD`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `MEMCACHED_HOST`
-
-Defaults to `"127.0.0.1"`.
-
-#### `MEMCACHED_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `11211`.
-
-### REDIS
-
-#### `REDIS_CLIENT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"phpredis"`.
-
-#### `REDIS_SCHEME`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"tcp"`.
-
-#### `REDIS_PATH`
-
-(Not listed on Admin > Diagnostics.) No default value.
-
-#### `REDIS_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"localhost"`.
-
-#### `REDIS_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-#### `REDIS_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `6379`.
-
-#### `REDIS_DATABASE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `0`.
-
-## CAPTCHA
-
-(Not listed on Admin > Diagnostics.) Use [hCaptcha](https://www.hcaptcha.com/) to protect your login from bots.
-
-### `CAPTCHA_ENABLED`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-### `CAPTCHA_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-### `CAPTCHA_SITEKEY`
-
-(Not listed on Admin > Diagnostics.)
-
-## COSTAR
-
-(Not listed on Admin > Diagnostics.) COSTAR - Confirm Object Sentiment Transform and Reduce
-
-### `CS_BLOCKED_DOMAINS`
-
-(Not listed on Admin > Diagnostics.) Comma-separated list of domains to block. Defaults to `null`.
-
-### `CS_CW_DOMAINS`
-
-(Not listed on Admin > Diagnostics.) Comma-separated list of domains to add warnings. Defaults to `null`.
-
-### `CS_UNLISTED_DOMAINS`
-
-(Not listed on Admin > Diagnostics.) Comma-separated list of domains to remove from public timelines. Defaults to `null`.
-
-### `CS_BLOCKED_KEYWORDS`
-
-(Not listed on Admin > Diagnostics.) Comma-separated list of keywords to block. Defaults to `null`.
-
-### `CS_CW_KEYWORDS`
-
-(Not listed on Admin > Diagnostics.) Comma-separated list of keywords to add warnings. Defaults to `null`.
-
-### `CS_UNLISTED_KEYWORDS`
-
-(Not listed on Admin > Diagnostics.) Comma-separated list of keywords to remove from public timelines. Defaults to `null`.
-
-### `CS_BLOCKED_ACTOR`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-### `CS_CW_ACTOR`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-### `CS_UNLISTED_ACTOR`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-## DATABASE
-
-### `DB_CONNECTION`
-
-Here you may specify which of the database connections below you wish to use as your default connection for all database work. Of course you may use many connections at once using the Database library. Possible values:
-
-- `"sqlite"`
-- `"mysql"` (default)
-- `"pgsql"`
-- `"sqlsrv"`
-
-### SQLITE
-
-(Not listed on Admin > Diagnostics.) When using `sqlite` for `DB_CONNECTION`.
-
-#### `DB_DATABASE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"database.sqlite"`.
-
-### MYSQL
-
-(Not listed on Admin > Diagnostics.) When using `"mysql"` for `DB_CONNECTION`.
-
-#### `DB_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"127.0.0.1"`.
-
-#### `DB_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"3306"`.
-
-#### `DB_DATABASE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"forge"`
-
-#### `DB_USERNAME`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"forge"`
-
-#### `DB_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `""`.
-
-#### `DB_SOCKET`
-
-(Not listed on Admin > Diagnostics.) Defaults to `""`.
-
-### PGSQL
-
-(Not listed on Admin > Diagnostics.) When using `"pgsql"` for `DB_CONNECTION`.
-
-#### `DB_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"127.0.0.1"`.
-
-#### `DB_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"5432"`.
-
-#### `DB_DATABASE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `forge`.
-
-#### `DB_USERNAME`
-
-(Not listed on Admin > Diagnostics.) Defaults to `forge`.
-
-#### `DB_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `""`.
-
-### SQLSRV
-
-When using `"sqlsrv"` for `DB_CONNECTION`.
-
-#### `DB_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"localhost"`.
-
-#### `DB_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"1433"`.
-
-#### `DB_DATABASE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `forge`.
-
-#### `DB_USERNAME`
-
-(Not listed on Admin > Diagnostics.) Defaults to `forge`.
-
-#### `DB_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `""`.
-
-### `REDIS_CLIENT`
-
-- `"predis"` (default)
-- `"phpredis"`
-
-#### `REDIS_SCHEME`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"tcp"`.
-
-#### `REDIS_PATH`
-
-(Not listed on Admin > Diagnostics.) No default value.
-
-#### `REDIS_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"127.0.0.1"`.
-
-#### `REDIS_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-#### `REDIS_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `6379`.
-
-#### `REDIS_DATABASE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `0`.
-
-## EXP
-
-Experimental configuration options. (Use at your own risk.)
-
-### `EXP_LC`
-
-Hidden like counts (deprecated). Defaults to `false`.
-
-### `EXP_REC`
-
-(Variable is ignored.) Recommendations (deprecated). Defaults to `false`.
-
-### `EXP_LOOPS`
-
-(Variable is ignored.) Loops feature (deprecated). Defaults to `false`.
-
-### `EXP_TOP`
-
-Text only posts (alpha). Defaults to `false`.
-
-### `EXP_POLLS`
-
-Poll statuses (alpha). Defaults to `false`.
-
-### `EXP_CPT`
-
-Cached public timeline for larger instances (beta). Defaults to `false`.
-
-### `EXP_GPS`
-
-Groups (unreleased). Defaults to `false`.
-
-### `spa`
-
-(Variable is ignored.) Single page application (beta). Defaults to `true`.
-
-### `EXP_EMC`
-
-Enforce Mastoapi Compatibility (alpha). Defaults to `true`.
-
-## FEDERATION
-
-### ACTIVITYPUB
-
-ActivityPub configuration.
-
-#### `ACTIVITY_PUB`
-
-Defaults to `false`.
-
-#### `AP_OUTBOX`
-
-Defaults to `true`.
-
-#### `AP_INBOX`
-
-Defaults to `true`.
-
-#### `AP_SHAREDINBOX`
-
-Defaults to `true`.
-
-#### `AP_REMOTE_FOLLOW`
-
-Defaults to `true`.
-
-#### `ACTIVITYPUB_DELIVERY_TIMEOUT`
-
-Defaults to `30.0`.
-
-#### `ACTIVITYPUB_DELIVERY_CONCURRENCY`
-
-Defaults to `10`.
-
-#### `AP_LOGGER_ENABLED`
-
-Defaults to `false`.
-
-### `ATOM_FEEDS`
-
-Defaults to `true`.
-
-### `REMOTE_AVATARS`
-
-Defaults to `true`.
-
-### `NODEINFO`
-
-Defaults to `true`.
-
-### `WEBFINGER`
-
-Defaults to `true`.
-
-### `PF_NETWORK_TIMELINE`
-
-Defaults to `true`.
-
-### `PF_NETWORK_TIMELINE_DAYS_FALLOFF`
-
-Defaults to `2`.
-
-### `CUSTOM_EMOJI`
-
-Defaults to `false`.
-
-### `CUSTOM_EMOJI_MAX_SIZE`
-
-Defaults to `2000000` (2MB).
-
-## FILESYSTEMS
-
-### `FILESYSTEM_DRIVER`
-
-Here you may specify the default filesystem disk that should be used by the framework. The "local" disk, as well as a variety of cloud based disks are available to your application. Just store away! Possible options:
-
-- `"local"` (default)
-- `"public"`
-- `"s3"`
-- `"spaces"`
-- `"backup"`
-
-### `FILESYSTEM_CLOUD`
-
-Many applications store files both locally and in the cloud. For this reason, you may specify a default "cloud" driver here. This driver will be bound as the Cloud disk implementation in the container. Defaults to `"s3"`.
-
-### S3
-
-(Not listed on Admin > Diagnostics.)
-
-#### `AWS_ACCESS_KEY_ID`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `AWS_SECRET_ACCESS_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `AWS_DEFAULT_REGION`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `AWS_BUCKET`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `AWS_URL`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `AWS_ENDPOINT`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `AWS_USE_PATH_STYLE_ENDPOINT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-### SPACES
-
-(Not listed on Admin > Diagnostics.)
-
-#### `DO_SPACES_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `DO_SPACES_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `DO_SPACES_ENDPOINT`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `DO_SPACES_REGION`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `DO_SPACES_BUCKET`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `DO_SPACES_ROOT`
-
-(Not listed on Admin > Diagnostics.)
-
-### BACKUP
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PF_BACKUP_DRIVER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"s3"`.
-
-#### `PF_BACKUP_ROOT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"/"`.
-
-#### `PF_BACKUP_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PF_BACKUP_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PF_BACKUP_ENDPOINT`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PF_BACKUP_REGION`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PF_BACKUP_BUCKET`
-
-(Not listed on Admin > Diagnostics.)
-
-## HASHIDS
-
-(Not listed on Admin > Diagnostics.)
-
-### `APP_HASHID_SALT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"v3MsJ1Hgnlma8YPrD3f4sW6vAn6zLnkuh6vOpKnR5IKkLqDGIk7TCADS2igpEN4ADrtXkkzV2E8HBfzpz7BreDzQqVOYDMeb4cJ1xhDhDwDeicZVUPyrxihHDaMWpTsP"`.
-
-## HASHING
-
-This option controls the default hash driver that will be used to hash passwords for your application. By default, the bcrypt algorithm is used; however, you remain free to modify this option if you wish. Possible drivers are `bcrypt` and `argon`, but this requires manual editing of `driver` (which is hardcoded as `bcrypt`).
-
-### BCRYPT
-
-#### `BCRYPT_COST`
-
-How many rounds of hashing to use. Defaults to `10`.
-
-### ARGON
-
-(Not listed on Admin > Diagnostics.)
-
-#### `ARGON_MEM`
-
-(Not listed on Admin > Diagnostics.) Defaults to `1024`.
-
-#### `ARGON_THREADS`
-
-(Not listed on Admin > Diagnostics.) Defaults to `2`.
-
-#### `ARGON_TIME`
-
-(Not listed on Admin > Diagnostics.) Defaults to `2`.
-
-## HORIZON
-
-### `HORIZON_PREFIX`
-
-This prefix will be used when storing all Horizon data in Redis. You may modify the prefix when you are running multiple installations of Horizon on the same server so that they don't have problems. Defaults to `"horizon-"`.
-
-### `HORIZON_MEMORY_LIMIT` (MB)
-
-This value describes the maximum amount of memory (in MB) the Horizon worker may consume before it is terminated and restarted. You should set this value according to the resources available to your server. Defaults to `64`.
-
-### `HORIZON_BALANCE_STRATEGY`
-
-Defaults to `"auto"`.
-
-### `HORIZON_MIN_PROCESSES`
-
-Defaults to `1`.
-
-### `HORIZON_MAX_PROCESSES`
-
-Defaults to `20`.
-
-### `HORIZON_SUPERVISOR_MEMORY`
-
-Defaults to `64`.
-
-### `HORIZON_SUPERVISOR_TRIES`
-
-Defaults to `3`.
-
-### `HORIZON_SUPERVISOR_NICE`
-
-Defaults to `0`.
-
-### `HORIZON_SUPERVISOR_TIMEOUT`
-
-Defaults to `300`.
-
-### `HORIZON_DARKMODE`
-
-Defaults to `false`.
-
-## IMAGE
-
-### `IMAGE_DRIVER`
-
-Pixelfed supports [GD](https://libgd.github.io/) or [ImageMagick](https://imagemagick.org/) to process images. Defaults to `gd`. Set `IMAGE_DRIVER=imagick` to use ImageMagick instead.
-
-## INSTANCE
-
-### `FORCE_HTTPS_URLS`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `INSTANCE_DESCRIPTION`
-
-Defaults to `"Pixelfed - Photo sharing for everyone"`.
-
-### `INSTANCE_CONTACT_FORM`
-
-Defaults to `false`.
-
-### `INSTANCE_CONTACT_MAX_PER_DAY`
-
-Defaults to `1`.
-
-### `INSTANCE_DISCOVER_PUBLIC`
-
-Defaults to `false`.
-
-### `EXP_LOOPS`
-
-See [`EXP`](#exp), although here it actually is used. Defaults to `false`.
-
-### `INSTANCE_PUBLIC_HASHTAGS`
-
-Defaults to `false`.
-
-### `INSTANCE_CONTACT_EMAIL`
-
-Defaults to `""`.
-
-### `PF_HOME_TIMELINE_CACHE`
-
-Defaults to `false`.
-
-### `PF_HOME_TIMELINE_CACHE_TTL`
-
-Defaults to `900`.
-
-### `INSTANCE_PUBLIC_LOCAL_TIMELINE`
-
-Defaults to `false`.
-
-### `INSTANCE_NETWORK_TIMELINE_CACHED`
-
-Defaults to `true`. Only used when [`PF_NETWORK_TIMELINE`](#pf_network_timeline) is `true`.
-
-### `INSTANCE_NETWORK_TIMELINE_CACHE_DROPOFF`
-
-Defaults to `100`.
-
-### `INSTANCE_NETWORK_TIMELINE_CACHE_MAX_HOUR_INGEST`
-
-Defaults to `6`.
-
-### `PAGE_404_HEADER`
-
-Defaults to `"Sorry, this page isn't available."`.
-
-### `PAGE_404_BODY`
-
-Defaults to `""The link you followed may be broken, or the page may have been removed. Go back to Pixelfed.""`.
-
-### `PAGE_503_HEADER`
-
-Defaults to `"Service Unavailable"`.
-
-### `PAGE_503_BODY`
-
-Defaults to `"Our service is in maintenance mode, please try again later."`.
-
-### `BANNED_USERNAMES`
-
-Defaults to `""`.
-
-### `USERNAME_REMOTE_FORMAT`
-
-Possible values:
-
-- `"@"` (default)
-- `"from"`
-- `"custom"`
-
-### `USERNAME_REMOTE_CUSTOM_TEXT`
-
-Used when `USERNAME_REMOTE_FORMAT="custom"`. Defaults to `null`.
-
-### `STORIES_ENABLED`
-
-Defaults to `false`.
-
-### `RESTRICTED_INSTANCE`
-
-Defaults to `false`. Level is hardcoded to `1`.
-
-### `OAUTH_TOKEN_DAYS`
-
-Defaults to `365`.
-
-### `OAUTH_REFRESH_DAYS`
-
-Defaults to `400`.
-
-### `OAUTH_PAT_ENABLED`
-
-Defaults to `false`.
-
-### `OAUTH_PAT_ID`
-
-Defaults to `""`.
-
-### `ENABLE_COVID_LABEL`
-
-Defaults to `true`.
-
-### `COVID_LABEL_URL`
-
-Defaults to `"https://www.who.int/emergencies/diseases/novel-coronavirus-2019/advice-for-public"`.
-
-### `COVID_LABEL_ORG`
-
-Defaults to `"visit the WHO website"`.
-
-### `ENABLE_CONFIG_CACHE`
-
-Whether Admin > Settings can be used to override your `.env`. Defaults to `false`.
-
-### `INSTANCE_LEGAL_NOTICE`
-
-Defaults to `false`.
-
-### `INSTANCE_PROFILE_EMBEDS`
-
-Defaults to `true`.
-
-### `INSTANCE_POST_EMBEDS`
-
-Defaults to `true`.
-
-### `PF_HIDE_NSFW_ON_PUBLIC_FEEDS`
-
-Defaults to `false`.
-
-### `PF_LOCAL_AVATAR_TO_CLOUD`
-
-Defaults to `false`.
-
-### `PF_ADMIN_INVITES_ENABLED`
-
-Defaults to `true`.
-
-## LDAP
-
-Here you may specify which of the LDAP connections below you wish to use as your default connection for all LDAP operations. Of course you may add as many connections you'd like below.
-
-### `LDAP_CONNECTION`
-
-Defaults to `"default"`.
-
-### DEFAULT
-
-(Not listed on Admin > Diagnostics.)
-
-#### `LDAP_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"127.0.0.1"`.
-
-#### `LDAP_USERNAME`
-
-(Not listed on Admin > Diagnostics.) Defaults `"cn=user,dc=local,dc=com"`.
-
-#### `LDAP_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"secret"`.
-
-#### `LDAP_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `389`.
-
-#### `LDAP_BASE_DN`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"dc=local,dc=com"`.
-
-#### `LDAP_TIMEOUT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `5`.
-
-#### `LDAP_SSL`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-#### `LDAP_TLS`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-### `LDAP_LOGGING`
-
-When LDAP logging is enabled, all LDAP search and authentication operations are logged using the default application logging driver. This can assist in debugging issues and more. Defaults to `true`.
-
-### CACHE
-
-LDAP caching enables the ability of caching search results using the
-query builder. This is great for running expensive operations that
-may take many seconds to complete, such as a pagination request.
-
-#### `LDAP_CACHE`
-
-Defaults to `false`.
-
-#### `CACHE_DRIVER`
-
-See [`CACHE`](#cache). Defaults to `"file"`.
-
-## LIVESTREAMING
-
-(Not listed on Admin > Diagnostics.)
-
-### `HLS_LIVE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-### `HLS_LIVE_HOST`
-
-(Not listed on Admin > Diagnostics.) Defaults to `APP_DOMAIN` or `"localhost"`.
-
-### `HLS_LIVE_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `1935`.
-
-### `HLS_LIVE_PATH`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"live"`.
-
-### `HLS_LIVE_BROADCAST_DELETE_TOKEN_AFTER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `HLS_LIVE_BROADCAST_MAX_DURATION`
-
-(Not listed on Admin > Diagnostics.) Defaults to `60`.
-
-### `HLS_LIVE_BROADCAST_MAX_ACTIVE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `10`.
-
-### `HLS_LIVE_BROADCAST_LIMITS`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `HLS_LIVE_BROADCAST_LIMITS_MIN_FOLLOWERS`
-
-(Not listed on Admin > Diagnostics.) Defaults to `100`.
-
-### `HLS_LIVE_BROADCAST_LIMITS_MIN_ACCOUNT_AGE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `14`.
-
-### `HLS_LIVE_BROADCAST_LIMITS_ADMINS_ONLY`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `HLS_LIVE_BROADCAST_SOURCE_APP`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-### `HLS_LIVE_BROADCAST_SOURCE_WEB`
-
-(Not listed on Admin > Diagnostics.) Defaults to `false`.
-
-### `HLS_LIVE_COMMENTS_MAX_FALLOFF`
-
-(Not listed on Admin > Diagnostics.) Defaults to `50`.
-
-## LOGGING
-
-### `LOG_CHANNEL`
-
-Possible values:
-
-- `"stack"` (default)
-- `"single"`
-- `"daily"`
-- `"slack"`
-- `"stderr"`
-- `"syslog"`
-- `"errorlog"`
-- `"null"`
-- `"emergency"`
-- `"media"`
-
-### `LOG_LEVEL`
-
-Used by `single`, `stderr` and `syslog`. Defaults to `"debug"` for all of those.
-
-### `LOG_SLACK_WEBHOOK_URL`
-
-(Not listed on Admin > Diagnostics.) Used by `slack`. Defaults to `""`.
-
-### `LOG_STDERR_FORMATTER`
-
-(Not listed on Admin > Diagnostics.) Used by `stderr`. Defaults to `""`.
-
-## MAIL
-
-### `MAIL_DRIVER`
-
-Laravel supports both SMTP and PHP's "mail" function as drivers for the sending of e-mail. You may specify which one you're using throughout your application here. Possible values:
-
-- `"smtp"` (default)
-- `"sendmail"`
-- `"mailgun"`
-- `"mandrill"`
-- `"ses"`
-- `"sparkpost"`
-- `"log"`
-- `"array"`
-
-### `MAIL_HOST`
-
-Here you may provide the host address of the SMTP server used by your applications. A default option is provided that is compatible with the Mailgun mail service which will provide reliable deliveries. Defaults to `"smtp.mailgun.org"`.
-
-### `MAIL_PORT`
-
-This is the SMTP port used by your application to deliver e-mails to users of the application. Like the host we have set this value to stay compatible with the Mailgun e-mail application by default. Defaults to `587`.
-
-### `MAIL_FROM_ADDRESS`
-
-You may wish for all e-mails sent by your application to be sent from the same address. Here, you may specify a name and address that is used globally for all e-mails that are sent by your application. Defaults to `"hello@example.com"`.
-
-### `MAIL_FROM_NAME`
-
-Defaults to `"Example"`.
-
-### `MAIL_ENCRYPTION`
-
-Here you may specify the encryption protocol that should be used when the application send e-mail messages. A sensible default using the transport layer security protocol should provide great security. Defaults to `"tls"`.
-
-### `MAIL_USERNAME`
-
-(Not listed on Admin > Diagnostics.) If your SMTP server requires a username for authentication, you should set it here. This will get used to authenticate with your server on connection. You may also set the "password" value below this one. Defaults to `""`.
-
-### `MAIL_PASSWORD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `""`.
-
-## MEDIA
-
-### `MEDIA_DELETE_LOCAL_AFTER_CLOUD`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `MEDIA_EXIF_DATABASE`
-
-Defaults to `false`.
-
-## PASSPORT
-
-(Not listed on Admin > Diagnostics.) Passport uses encryption keys while generating secure access tokens for your application. By default, the keys are stored as local files but can be set via environment variables when that is more convenient.
-
-### `PASSPORT_PRIVATE_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-### `PASSPORT_PUBLIC_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-## PIXELFED
-
-### `ADMIN_DOMAIN`
-
-Application domains used for routing.
-
-### `APP_DOMAIN`
-
-Application domains used for routing.
-
-### `MEMORY_LIMIT`
-
-This `memory_limit` value is only used for image processing. The default `memory_limit` in `php.ini` is used for the rest of the app. Defaults to `"1024M"`.
-
-### `OPEN_REGISTRATION`
-
-Enable/disable new local account registrations. Defaults to `true`.
-
-### `MAX_ACCOUNT_SIZE` (kB)
-
-Update the max account size, the per user limit of files in kB. Defaults to `1000000` (1GB).
-
-### `MAX_PHOTO_SIZE` (kB)
-
-Update the max photo size, in kB. Defaults to `15000` (15MB).
-
-### `MAX_AVATAR_SIZE` (kB)
-
-Update the max avatar size, in kB. Defaults to `2000` (2MB).
-
-### `MAX_CAPTION_LENGTH`
-
-Change the caption length limit for new local posts. Defaults to `500`.
-
-### `MAX_BIO_LENGTH`
-
-Change the bio length limit for user profiles. Defaults to `125`.
-
-### `MAX_NAME_LENGTH`
-
-Change the length limit for user names. Defaults to `30`.
-
-### `MIN_PASSWORD_LENGTH`
-
-Change the minimum length limit for user passwords. Defaults to `8`.
-
-### `MAX_ALBUM_LENGTH`
-
-The max number of photos allowed per post. Defaults to `4`.
-
-### `ENFORCE_EMAIL_VERIFICATION`
-
-Require email verification before a new user can do anything. Defaults to `true`.
-
-### `IMAGE_QUALITY`
-
-Set the image optimization quality, must be a value between 1-100. Defaults to `80`.
-
-### `ACCOUNT_DELETION`
-
-Enable account deletion. Defaults to `true`.
-
-### `ACCOUNT_DELETE_AFTER`
-
-Set account deletion queue after X days, set to false to delete accounts immediately. Defaults to `false`.
-
-### `PF_ENABLE_CLOUD`
-
-Store media on object storage like S3, Digital Ocean Spaces, Rackspace Defaults to `false`.
-
-### `PF_MAX_USERS`
-
-Allow a maximum number of user accounts. Defaults to `false`.
-
-### `PF_OPTIMIZE_IMAGES`
-
-Resize and optimize image uploads. Defaults to `true`.
-
-### `PF_OPTIMIZE_VIDEOS`
-
-Resize and optimize video uploads. Defaults to `true`.
-
-### `PF_USER_INVITES`
-
-Allow users to invite others via email. Will respect max user limit and prevent invites after the limit is reached. Defaults to `false`.
-
-### `PF_USER_INVITES_TOTAL_LIMIT`
-
-Defaults to `0`.
-
-### `PF_USER_INVITES_DAILY_LIMIT`
-
-Defaults to `0`.
-
-### `PF_USER_INVITES_MONTHLY_LIMIT`
-
-Defaults to `0`.
-
-### `PF_MAX_COLLECTION_LENGTH`
-
-Defaults to `100`.
-
-### `MEDIA_TYPES`
-
-Defaults to `"image/jpeg,image/png,image/gif"`.
-
-### `LIMIT_ACCOUNT_SIZE`
-
-Defaults to `true`.
-
-### `IMPORT_INSTAGRAM`
-
-Defaults to `false`.
-
-### `IMPORT_INSTAGRAM_POST_LIMIT`
-
-Defaults to `100`.
-
-### `IMPORT_INSTAGRAM_SIZE_LIMIT`
-
-Defaults to `5000`.
-
-### `OAUTH_ENABLED`
-
-Defaults to `false`.
-
-### `PF_BOUNCER_ENABLED`
-
-Defaults to `false`.
-
-### `PF_MEDIA_FAST_PROCESS`
-
-Don't require photos & video to finish optimization & upload to S3 if enabled before posting. If disabled users will have to wait until processed before posting, sacrificing the user experience to ensure media is federated using S3 urls (if enabled). Defaults to `true`.
-
-### `PF_MEDIA_MAX_ALTTEXT_LENGTH`
-
-Defaults to `1000`.
-
-### `PF_ALLOW_APP_REGISTRATION`
-
-Defaults to `true`.
-
-## PORTFOLIO
-
-(Not listed on Admin > Diagnostics.)
-
-### `PORTFOLIO_DOMAIN`
-
-(Not listed on Admin > Diagnostics.) This value is the domain used for the portfolio feature. Only change the default value if you have a subdomain configured. You must use a subdomain on the same app domain. Defaults to `APP_DOMAIN`.
-
-### `PORTFOLIO_PATH`
-
-(Not listed on Admin > Diagnostics.) This value is the path used for the portfolio feature. Only change the default value if you have a subdomain configured. If you want to use the root path of the subdomain, leave this value empty.
-
-WARNING: SETTING THIS VALUE WITHOUT A SUBDOMAIN COULD BREAK YOUR INSTANCE, SO ONLY CHANGE THIS IF YOU KNOW WHAT YOU'RE DOING.
-
-Defaults to `"/i/portfolio"`.
-
-## PURIFY
-
-### `RESTRICT_HTML_TYPES`
-
-Defaults to `true`.
-
-## `RESILIENT_MODE`
-
-(Not listed on Admin > Diagnostics.) This mode allows you to define up to 2 alternate S3 cloud providers for a total of 3 S3 providers for redundancy.
-
-To enable the primary alternate S3 driver, ensure you set the following .env variables:
-- `ALT_PRI_ENABLED=true`
-- `ALT_PRI_AWS_ACCESS_KEY_ID=KEYID`
-- `ALT_PRI_AWS_SECRET_ACCESS_KEY=SECRET`
-- `ALT_PRI_AWS_DEFAULT_REGION=REGION`
-- `ALT_PRI_AWS_URL=URL`
-- `ALT_PRI_AWS_ENDPOINT=ENDPOINT`
-
-To enable the secondary alternate S3 driver, ensure you set the following .env variables:
-- `ALT_SEC_ENABLED=true`
-- `ALT_SEC_AWS_ACCESS_KEY_ID=KEYID`
-- `ALT_SEC_AWS_SECRET_ACCESS_KEY=SECRET`
-- `ALT_SEC_AWS_DEFAULT_REGION=REGION`
-- `ALT_SEC_AWS_URL=URL`
-- `ALT_SEC_AWS_ENDPOINT=ENDPOINT`
-
-## QUEUE
-
-### `QUEUE_DRIVER`
-
-- `"sync"` (default)
-- `"database"`
-- `"beanstalkd"`
-- `"sqs"`
-- `"redis"`
-- `"null"`
-
-### SQS
-
-(Not listed on Admin > Diagnostics.)
-
-#### `SQS_KEY`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"your-public-key"`.
-
-#### `SQS_SECRET`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"your-secret-key"`.
-
-#### `SQS_PREFIX`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"https://sqs.us-east-1.amazonaws.com/your-account-id"`.
-
-#### `SQS_QUEUE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"your-queue-name"`.
-
-#### `SQS_REGION`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"us-east-1"`.
-
-### DB_CONNECTION
-
-(Not listed on Admin > Diagnostics.) See [`DB_CONNECTION`](#db_connection). These options configure the behavior of failed queue job logging so you can control which database and table are used to store the jobs that have failed. You may change them to any database / table you wish. Defaults to `"mysql"`.
-
-## SERVICES
-
-(Not listed on Admin > Diagnostics.)
-
-### MAILGUN
-
-(Not listed on Admin > Diagnostics.)
-
-#### `MAILGUN_DOMAIN`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `MAILGUN_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-### SES
-
-(Not listed on Admin > Diagnostics.)
-
-#### `SES_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `SES_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `SES_REGION`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"us-east-1"`.
-
-### SPARKPOST
-
-(Not listed on Admin > Diagnostics.)
-
-#### `SPARKPOST_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-### STRIPE
-
-(Not listed on Admin > Diagnostics.)
-
-#### `STRIPE_KEY`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `STRIPE_SECRET`
-
-(Not listed on Admin > Diagnostics.)
-
-## SESSION
-
-### `SESSION_DRIVER`
-
-This option controls the default session "driver" that will be used on requests. By default, we will use the lightweight native driver but you may specify any of the other wonderful drivers provided here.
-
-- `"file"`
-- `"cookie"`
-- `"database"` (default)
-- `"apc"`
-- `"memcached"`
-- `"redis"`
-- `"array"`
-
-### `SESSION_LIFETIME`
-
-Here you may specify the number of minutes that you wish the session to be allowed to remain idle before it expires. If you want them to immediately expire on the browser closing, set that option. Defaults to `86400`.
-
-### `SESSION_DOMAIN`
-
-Here you may change the domain of the cookie used to identify a session in your application. This will determine which domains the cookie is available to in your application. A sensible default has been set. Defaults to the value of `APP_DOMAIN`, or `null`.
-
-## VIDEO WEBP2P
-
-(Not listed on Admin > Diagnostics.) WebP2P support for local video that uses peer-to-peer technology to reduce load on individual servers when viewing video.
-
-### `MEDIA_HLS_ENABLED`
-
-Set to `true` to enable HLS generation, required for WebP2P support and alone allows for better viewing experiences. **Disabled by default.**
-
-### `MEDIA_HLS_P2P`
-
-Set to `true` to enable WebP2P support. Requires `MEDIA_HLS_ENABLED=true`. **Disabled by default.**
-
-### `MEDIA_HLS_BITRATE`
-
-Set the default HLS bitrate. We recommend using the default value of `1000` unless you know what you are doing.
-
-### `MEDIA_HLS_P2P_TRACKER`
-
-Set the WebP2P torrent tracker. The default tracker is `wss://tracker.webtorrent.dev`
-
-### `MEDIA_HLS_P2P_ICE_SERVER`
-
-Set the WebP2P signaling server. The default server is `stun:stun.l.google.com:19302`
-
-### `MEDIA_HLS_DEBUG`
-
-Set to `true` to enable debug mode that logs to browser console log. **Disabled by default.**
-
-### `MEDIA_HLS_P2P_DEBUG`
-
-Set to `true` to enable debug mode that logs WebP2P events to browser console log. **Disabled by default.**
-
-## TELESCOPE
-
-(Not listed on Admin > Diagnostics.)
-
-### `TELESCOPE_DRIVER`
-
-(Not listed on Admin > Diagnostics.) This configuration options determines the storage driver that will be used to store Telescope's data. In addition, you may set any custom options as needed by the particular driver you choose. Defaults to `"database"`.
-
-### `TELESCOPE_ENABLED`
-
-(Not listed on Admin > Diagnostics.) This option may be used to disable all Telescope watchers regardless of their individual configuration, which simply provides a single and convenient way to enable or disable Telescope data storage. Defaults to `false`.
-
-### `TELESCOPE_CACHE_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_COMMAND_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_DUMP_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_EVENT_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_EXCEPTION_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_JOB_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_LOG_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_MAIL_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_MODEL_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_NOTIFICATION_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_QUERY_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_REDIS_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_REQUEST_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_RESPONSE_SIZE_LIMIT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `64`.
-
-### `TELESCOPE_GATE_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-### `TELESCOPE_SCHEDULE_WATCHER`
-
-(Not listed on Admin > Diagnostics.) Defaults to `true`.
-
-## TRUSTEDPROXY
-
-### `TRUST_PROXIES`
-
-Set trusted proxy IP addresses.
-
-Both IPv4 and IPv6 addresses are supported, along with CIDR notation.
-
-The "*" character is syntactic sugar within TrustedProxy to trust any proxy that connects directly to your server, a requirement when you cannot know the address of your proxy (e.g. if using Rackspace balancers).
-
-The "**" character is syntactic sugar within TrustedProxy to trust not just any proxy that connects directly to your server, but also proxies that connect to those proxies, and all the way back until you reach the original source IP. It will mean that $request->getClientIp() always gets the originating client IP, no matter how many proxies that client's request has subsequently passed through.
-
-Defaults to `"*"`.
-
-## WEBSOCKETS
-
-(Not listed on Admin > Diagnostics.)
-
-### DASHBOARD SETTINGS
-
-(Not listed on Admin > Diagnostics.) You can configure the dashboard settings from here.
-
-#### `LARAVEL_WEBSOCKETS_PORT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `6001`.
-
-#### `LARAVEL_WEBSOCKETS_DOMAIN`
-
-(Not listed on Admin > Diagnostics.) Defaults to `""`.
-
-#### `LARAVEL_WEBSOCKETS_PATH`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"laravel-websockets"`.
-
-### APPLICATIONS REPOSITORY
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PUSHER_APP_ID`
-
-(Not listed on Admin > Diagnostics.) See [PUSHER](#pusher).
-
-#### `APP_NAME`
-
-(Not listed on Admin > Diagnostics.) See [APP](#app).
-
-#### `PUSHER_APP_HOST`
-
-(Not listed on Admin > Diagnostics.)
-
-#### `PUSHER_APP_KEY`
-
-(Not listed on Admin > Diagnostics.) See [PUSHER](#pusher).
-
-#### `PUSHER_APP_SECRET`
-
-(Not listed on Admin > Diagnostics.) See [PUSHER](#pusher).
-
-#### `PUSHER_APP_PATH`
-
-(Not listed on Admin > Diagnostics.)
-
-### BROADCASTING REPLICATION PUBSUB
-
-(Not listed on Admin > Diagnostics.) You can enable replication to publish and subscribe to messages across the driver.
-
-By default, it is set to `"local"`, but you can configure it to use drivers like Redis to ensure connection between multiple instances of WebSocket servers. Just set the driver to `"redis"` to enable the PubSub using Redis.
-
-#### `WEBSOCKETS_REPLICATION_MODE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `"local"`.
-
-#### `WEBSOCKETS_REDIS_REPLICATION_CONNECTION`
-
-(Not listed on Admin > Diagnostics.) See [REDIS](#redis). Defaults to `"default"`.
-
-### SSL CONFIGURATION
-
-(Not listed on Admin > Diagnostics.) By default, the configuration allows only on HTTP. For SSL, you need to set up the the certificate, the key, and optionally, the passphrase for the private key. You will need to restart the server for the settings to take place.
-
-#### `LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-#### `LARAVEL_WEBSOCKETS_SSL_CA`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-#### `LARAVEL_WEBSOCKETS_SSL_LOCAL_PK`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
-
-#### `LARAVEL_WEBSOCKETS_SSL_PASSPHRASE`
-
-(Not listed on Admin > Diagnostics.) Defaults to `null`.
diff --git a/index.md b/index.md
new file mode 100644
index 0000000..431e246
--- /dev/null
+++ b/index.md
@@ -0,0 +1,17 @@
+---
+# https://vitepress.dev/reference/default-theme-home-page
+layout: home
+
+hero:
+ name: "Pixelfed Docs"
+ text: ""
+ tagline: "The official Pixelfed documentation"
+ actions:
+ - theme: brand
+ text: Installation Guide
+ link: /running-pixelfed/prerequisites
+ - theme: alt
+ text: ActivityPub Documentation
+ link: /spec/ActivityPub.html
+---
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..604b9b7
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1567 @@
+{
+ "name": "pixelfed-docs",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "vitepress": "^1.0.0-rc.34"
+ }
+ },
+ "node_modules/@algolia/autocomplete-core": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz",
+ "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-plugin-algolia-insights": "1.9.3",
+ "@algolia/autocomplete-shared": "1.9.3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz",
+ "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.9.3"
+ },
+ "peerDependencies": {
+ "search-insights": ">= 1 < 3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-preset-algolia": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz",
+ "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.9.3"
+ },
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/autocomplete-shared": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz",
+ "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==",
+ "dev": true,
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/cache-browser-local-storage": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz",
+ "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-common": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/cache-common": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz",
+ "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==",
+ "dev": true
+ },
+ "node_modules/@algolia/cache-in-memory": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz",
+ "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-common": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/client-account": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz",
+ "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.22.1",
+ "@algolia/client-search": "4.22.1",
+ "@algolia/transporter": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/client-analytics": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz",
+ "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.22.1",
+ "@algolia/client-search": "4.22.1",
+ "@algolia/requester-common": "4.22.1",
+ "@algolia/transporter": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/client-common": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz",
+ "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.22.1",
+ "@algolia/transporter": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/client-personalization": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz",
+ "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.22.1",
+ "@algolia/requester-common": "4.22.1",
+ "@algolia/transporter": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/client-search": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz",
+ "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.22.1",
+ "@algolia/requester-common": "4.22.1",
+ "@algolia/transporter": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/logger-common": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz",
+ "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==",
+ "dev": true
+ },
+ "node_modules/@algolia/logger-console": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz",
+ "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/logger-common": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/requester-browser-xhr": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz",
+ "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/requester-common": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz",
+ "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==",
+ "dev": true
+ },
+ "node_modules/@algolia/requester-node-http": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz",
+ "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.22.1"
+ }
+ },
+ "node_modules/@algolia/transporter": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz",
+ "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-common": "4.22.1",
+ "@algolia/logger-common": "4.22.1",
+ "@algolia/requester-common": "4.22.1"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz",
+ "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz",
+ "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==",
+ "dev": true
+ },
+ "node_modules/@docsearch/js": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz",
+ "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==",
+ "dev": true,
+ "dependencies": {
+ "@docsearch/react": "3.6.0",
+ "preact": "^10.0.0"
+ }
+ },
+ "node_modules/@docsearch/react": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz",
+ "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-core": "1.9.3",
+ "@algolia/autocomplete-preset-algolia": "1.9.3",
+ "@docsearch/css": "3.6.0",
+ "algoliasearch": "^4.19.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 19.0.0",
+ "react": ">= 16.8.0 < 19.0.0",
+ "react-dom": ">= 16.8.0 < 19.0.0",
+ "search-insights": ">= 1 < 3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "search-insights": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
+ "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
+ "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
+ "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
+ "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
+ "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
+ "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
+ "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
+ "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
+ "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
+ "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
+ "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
+ "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
+ "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
+ "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
+ "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
+ "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
+ "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
+ "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
+ "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
+ "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
+ "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz",
+ "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz",
+ "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz",
+ "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz",
+ "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz",
+ "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz",
+ "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz",
+ "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz",
+ "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz",
+ "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz",
+ "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz",
+ "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz",
+ "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz",
+ "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.1.7.tgz",
+ "integrity": "sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==",
+ "dev": true
+ },
+ "node_modules/@shikijs/transformers": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.1.7.tgz",
+ "integrity": "sha512-lXz011ao4+rvweps/9h3CchBfzb1U5OtP5D51Tqc9lQYdLblWMIxQxH6Ybe1GeGINcEVM4goMyPrI0JvlIp4UQ==",
+ "dev": true,
+ "dependencies": {
+ "shiki": "1.1.7"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dev": true
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz",
+ "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==",
+ "dev": true
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "13.0.7",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz",
+ "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==",
+ "dev": true,
+ "dependencies": {
+ "@types/linkify-it": "*",
+ "@types/mdurl": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz",
+ "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==",
+ "dev": true
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+ "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
+ "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
+ "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.23.9",
+ "@vue/shared": "3.4.21",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz",
+ "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz",
+ "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.23.9",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.7",
+ "postcss": "^8.4.35",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz",
+ "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "7.0.16",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.16.tgz",
+ "integrity": "sha512-fZG2CG8624qphMf4aj59zNHckMx1G3lxODUuyM9USKuLznXCh66TP+tEbPOCcml16hA0GizJ4D8w6F34hrfbcw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-kit": "^7.0.16"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "7.0.16",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.16.tgz",
+ "integrity": "sha512-IA8SSGiZbNgOi4wLT3mRvd71Q9KE0KvMfGk6haa2GZ6bL2K/xMA8Fvvj3o1maspfUXrGcCXutaqbLqbGx/espQ==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-shared": "^7.0.16",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "7.0.16",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.16.tgz",
+ "integrity": "sha512-Lew4FrGjDjmanaUWSueNE1Rre83k7jQpttc17MaoVw0eARWU5DgZ1F/g9GNUMZXVjbP9rwE+LL3gd9XfXCfkvA==",
+ "dev": true,
+ "dependencies": {
+ "rfdc": "^1.3.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz",
+ "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+ "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/reactivity": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+ "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/runtime-core": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+ "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "vue": "3.4.21"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz",
+ "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==",
+ "dev": true
+ },
+ "node_modules/@vueuse/core": {
+ "version": "10.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz",
+ "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==",
+ "dev": true,
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.20",
+ "@vueuse/metadata": "10.9.0",
+ "@vueuse/shared": "10.9.0",
+ "vue-demi": ">=0.14.7"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/core/node_modules/vue-demi": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
+ "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/integrations": {
+ "version": "10.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz",
+ "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==",
+ "dev": true,
+ "dependencies": {
+ "@vueuse/core": "10.9.0",
+ "@vueuse/shared": "10.9.0",
+ "vue-demi": ">=0.14.7"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "async-validator": "*",
+ "axios": "*",
+ "change-case": "*",
+ "drauu": "*",
+ "focus-trap": "*",
+ "fuse.js": "*",
+ "idb-keyval": "*",
+ "jwt-decode": "*",
+ "nprogress": "*",
+ "qrcode": "*",
+ "sortablejs": "*",
+ "universal-cookie": "*"
+ },
+ "peerDependenciesMeta": {
+ "async-validator": {
+ "optional": true
+ },
+ "axios": {
+ "optional": true
+ },
+ "change-case": {
+ "optional": true
+ },
+ "drauu": {
+ "optional": true
+ },
+ "focus-trap": {
+ "optional": true
+ },
+ "fuse.js": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "jwt-decode": {
+ "optional": true
+ },
+ "nprogress": {
+ "optional": true
+ },
+ "qrcode": {
+ "optional": true
+ },
+ "sortablejs": {
+ "optional": true
+ },
+ "universal-cookie": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/integrations/node_modules/vue-demi": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
+ "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "10.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz",
+ "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "10.9.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz",
+ "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==",
+ "dev": true,
+ "dependencies": {
+ "vue-demi": ">=0.14.7"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared/node_modules/vue-demi": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
+ "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/algoliasearch": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz",
+ "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-browser-local-storage": "4.22.1",
+ "@algolia/cache-common": "4.22.1",
+ "@algolia/cache-in-memory": "4.22.1",
+ "@algolia/client-account": "4.22.1",
+ "@algolia/client-analytics": "4.22.1",
+ "@algolia/client-common": "4.22.1",
+ "@algolia/client-personalization": "4.22.1",
+ "@algolia/client-search": "4.22.1",
+ "@algolia/logger-common": "4.22.1",
+ "@algolia/logger-console": "4.22.1",
+ "@algolia/requester-browser-xhr": "4.22.1",
+ "@algolia/requester-common": "4.22.1",
+ "@algolia/requester-node-http": "4.22.1",
+ "@algolia/transporter": "4.22.1"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
+ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.19.12",
+ "@esbuild/android-arm": "0.19.12",
+ "@esbuild/android-arm64": "0.19.12",
+ "@esbuild/android-x64": "0.19.12",
+ "@esbuild/darwin-arm64": "0.19.12",
+ "@esbuild/darwin-x64": "0.19.12",
+ "@esbuild/freebsd-arm64": "0.19.12",
+ "@esbuild/freebsd-x64": "0.19.12",
+ "@esbuild/linux-arm": "0.19.12",
+ "@esbuild/linux-arm64": "0.19.12",
+ "@esbuild/linux-ia32": "0.19.12",
+ "@esbuild/linux-loong64": "0.19.12",
+ "@esbuild/linux-mips64el": "0.19.12",
+ "@esbuild/linux-ppc64": "0.19.12",
+ "@esbuild/linux-riscv64": "0.19.12",
+ "@esbuild/linux-s390x": "0.19.12",
+ "@esbuild/linux-x64": "0.19.12",
+ "@esbuild/netbsd-x64": "0.19.12",
+ "@esbuild/openbsd-x64": "0.19.12",
+ "@esbuild/sunos-x64": "0.19.12",
+ "@esbuild/win32-arm64": "0.19.12",
+ "@esbuild/win32-ia32": "0.19.12",
+ "@esbuild/win32-x64": "0.19.12"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/focus-trap": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz",
+ "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==",
+ "dev": true,
+ "dependencies": {
+ "tabbable": "^6.2.0"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.8",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
+ "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "dev": true
+ },
+ "node_modules/minisearch": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz",
+ "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==",
+ "dev": true
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/postcss": {
+ "version": "8.4.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
+ "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/preact": {
+ "version": "10.19.6",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz",
+ "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
+ "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
+ "dev": true
+ },
+ "node_modules/rollup": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz",
+ "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.12.1",
+ "@rollup/rollup-android-arm64": "4.12.1",
+ "@rollup/rollup-darwin-arm64": "4.12.1",
+ "@rollup/rollup-darwin-x64": "4.12.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.12.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.12.1",
+ "@rollup/rollup-linux-arm64-musl": "4.12.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.12.1",
+ "@rollup/rollup-linux-x64-gnu": "4.12.1",
+ "@rollup/rollup-linux-x64-musl": "4.12.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.12.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.12.1",
+ "@rollup/rollup-win32-x64-msvc": "4.12.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/search-insights": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz",
+ "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/shiki": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.1.7.tgz",
+ "integrity": "sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==",
+ "dev": true,
+ "dependencies": {
+ "@shikijs/core": "1.1.7"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "dev": true
+ },
+ "node_modules/vite": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz",
+ "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.19.3",
+ "postcss": "^8.4.35",
+ "rollup": "^4.2.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitepress": {
+ "version": "1.0.0-rc.45",
+ "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.45.tgz",
+ "integrity": "sha512-/OiYsu5UKpQKA2c0BAZkfyywjfauDjvXyv6Mo4Ra57m5n4Bxg1HgUGoth1CLH2vwUbR/BHvDA9zOM0RDvgeSVQ==",
+ "dev": true,
+ "dependencies": {
+ "@docsearch/css": "^3.5.2",
+ "@docsearch/js": "^3.5.2",
+ "@shikijs/core": "^1.1.5",
+ "@shikijs/transformers": "^1.1.5",
+ "@types/markdown-it": "^13.0.7",
+ "@vitejs/plugin-vue": "^5.0.4",
+ "@vue/devtools-api": "^7.0.14",
+ "@vueuse/core": "^10.7.2",
+ "@vueuse/integrations": "^10.7.2",
+ "focus-trap": "^7.5.4",
+ "mark.js": "8.11.1",
+ "minisearch": "^6.3.0",
+ "shiki": "^1.1.5",
+ "vite": "^5.1.3",
+ "vue": "^3.4.19"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4.3.2",
+ "postcss": "^8.4.35"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz",
+ "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/runtime-dom": "3.4.21",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..e646bfb
--- /dev/null
+++ b/package.json
@@ -0,0 +1,10 @@
+{
+ "scripts": {
+ "docs:dev": "vitepress dev",
+ "docs:build": "vitepress build",
+ "docs:preview": "vitepress preview"
+ },
+ "devDependencies": {
+ "vitepress": "^1.0.0-rc.34"
+ }
+}
diff --git a/public/assets/favicon.png b/public/assets/favicon.png
new file mode 100644
index 0000000..7fc0db7
Binary files /dev/null and b/public/assets/favicon.png differ
diff --git a/public/logo-black.png b/public/logo-black.png
new file mode 100644
index 0000000..37a3546
Binary files /dev/null and b/public/logo-black.png differ
diff --git a/public/logo-white.png b/public/logo-white.png
new file mode 100644
index 0000000..6ae5bde
Binary files /dev/null and b/public/logo-white.png differ
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..f10c467
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /
\ No newline at end of file
diff --git a/running-pixelfed/administration.md b/running-pixelfed/administration.md
new file mode 100644
index 0000000..6a74fa6
--- /dev/null
+++ b/running-pixelfed/administration.md
@@ -0,0 +1,24 @@
+---
+title = "Administering your website"
+summary = "Tips and instructions for managing your Pixelfed installation"
+weight = 30
+[menu]
+[menu.docs]
+identifier = "admin/administration"
+parent = "admin"
+---
+
+# Administration
+
+## Updating Pixelfed
+
+After you have installed Pixelfed, you may update to the latest commits by pulling the dev branch and doing necessary updates/migration/caching:
+
+```bash
+cd /path/to/pixelfed
+git pull origin dev
+composer install
+php artisan config:cache
+php artisan route:cache
+php artisan migrate --force
+```
\ No newline at end of file
diff --git a/content/en/technical-documentation/artisan.md b/running-pixelfed/cli-cheatsheet.md
similarity index 87%
rename from content/en/technical-documentation/artisan.md
rename to running-pixelfed/cli-cheatsheet.md
index c1ab0d2..e92f313 100644
--- a/content/en/technical-documentation/artisan.md
+++ b/running-pixelfed/cli-cheatsheet.md
@@ -1,17 +1,67 @@
-+++
-title = "CLI"
-summary = "Laravel Artisan is a command line tool that you use to run migrations, cache the config and more."
-autonumbering = false
-[menu]
-[menu.docs]
-identifier = "tech/artisan"
-parent = "tech"
-+++
+# CLI Cheatsheet
-All commands are prefixed with `php artisan`
+
+
+## CLI Commands
+
+All commands are prefixed with `php artisan`
+
+## Basic
### clear-compiled
Remove the compiled class file
### db
@@ -44,6 +94,7 @@ Swap the front-end scaffolding for the application
Bring the application out of maintenance mode
### update
Run pixelfed schema updates between versions.
+
## auth
### auth:clear-resets
Flush expired password reset tokens
diff --git a/running-pixelfed/configuration.md b/running-pixelfed/configuration.md
new file mode 100644
index 0000000..7f43cc4
--- /dev/null
+++ b/running-pixelfed/configuration.md
@@ -0,0 +1,14 @@
+---
+title = "Pixelfed Configuration"
+summary = "A list of configuration settings for Pixelfed"
+---
+
+# Configuration
+
+## Server Settings
+
+| .env key | Default | Description | Type |
+| ------------- | :-----------: | :----: | :----: |
+| APP_DOMAIN | NULL | The app domain | String |
+| APP_NAME | "Pixelfed" | The name of your server | String |
+| OPEN_REGISTRATION | true | If your server allows new account registrations | Boolean |
diff --git a/content/en/running-pixelfed/installation.md b/running-pixelfed/installation.md
similarity index 95%
rename from content/en/running-pixelfed/installation.md
rename to running-pixelfed/installation.md
index 187a213..bddf543 100644
--- a/content/en/running-pixelfed/installation.md
+++ b/running-pixelfed/installation.md
@@ -1,4 +1,4 @@
-+++
+---
title = "Generic installation guide"
summary = "How to set up everything you need to run your own Pixelfed instance."
weight = 20
@@ -6,11 +6,11 @@ weight = 20
[menu.docs]
identifier = "admin/installation"
parent = "admin"
-+++
-
-Make sure you have all prerequisites installed and the appropriate services running/enabled before continuing.
+---
+# Installation
+Make sure you have all [prerequisites](./prerequisites) installed and the appropriate services running/enabled before continuing.
## Setting up Pixelfed files
@@ -18,7 +18,7 @@ Make sure you have all prerequisites installed and the appropriate services runn
Pixelfed Beta currently uses the `dev` branch for deployable code. When v1.0 is released, the stable branch will be changed to `stable`, with `dev` branch being used for development and testing.
-```bash {hl_lines=[1]}
+```shellscript
cd /usr/share/webapps # or wherever you choose to install web applications
git clone -b dev https://github.com/pixelfed/pixelfed.git pixelfed # checkout dev branch into "pixelfed" folder
```
@@ -27,24 +27,23 @@ git clone -b dev https://github.com/pixelfed/pixelfed.git pixelfed # checkout de
Your web server and app processes need to be able to write to the Pixelfed directory. Make sure to set the appropriate permissions. For example, if you are running your processes through the `http` user/group, then run the following:
-```bash {hl_lines=[2]}
+```shellscript
cd pixelfed
sudo chown -R http:http . # change user/group to http user and http group
sudo find . -type d -exec chmod 755 {} \; # set all directories to rwx by user/group
sudo find . -type f -exec chmod 644 {} \; # set all files to rw by user/group
```
-{{}}
+::: danger
**User and group permissions**
-
Make sure to use the correct user/group name for your system. This may be `http`, `www-data`, or `pixelfed` (if using a dedicated user).
-{{}}
+:::
### Initialize PHP dependencies
Run `composer install` to fetch the dependencies needed by Pixelfed. It is recommended to run with the following flags:
-```bash
+```shellscript
composer install --no-ansi --no-interaction --optimize-autoloader
```
@@ -52,19 +51,13 @@ composer install --no-ansi --no-interaction --optimize-autoloader
By default Pixelfed comes with a `.env.example` file for production deployments, and a `.env.testing` file for debug deployments. You'll need to rename or copy one of these files to `.env` regardless of which environment you're working on.
-```bash
+```shellscript
cp .env.example .env # for production deployments
cp .env.testing .env # for debug deployments
```
You can now edit `.env` and change values for your setup.
-{{}}
-**List of environment variables**
-
-You can find a list of additional configuration settings in-depth on the [Configuration](../technical-documentation/env.md) page, but the important variables will be listed in the below subsections.
-{{}}
-
### App variables
- Set `APP_NAME` to your desired title, e.g. `Pixelfed`. This will be shown in the header bar and other places.
@@ -111,7 +104,7 @@ If you are using a Unix socket for Redis, then:
- Set `REDIS_HOST` to the path of the socket, e.g. `/run/redis/redis.sock`
- Set `REDIS_PORT` to `0`
-{{}}
+::: tip
**TCP server vs. Unix socket**
Redis usually comes pre-configured to listen for TCP requests on the local machine over port 6379. In your Redis configuration, typically at `/etc/redis.conf`, the relevant lines are `bind 127.0.0.1` and `port 6379`.
@@ -119,7 +112,7 @@ Redis usually comes pre-configured to listen for TCP requests on the local machi
Changing the latter line to `port 0` will disable TCP listening, in which case Redis must be configured for socket access. Lines such as `unixsocket /run/redis/redis.sock` and `unixsocketperm 770` must be set to enable socket access. Additionally, both the app user and web user should have permission to access the socket, e.g. by being added to the `redis` group.
Using a Unix socket is optional, but may provide faster access since it does not have to create TCP packets. TCP is usually used over a network, and would be required if Redis were running on a different machine than your web server.
-{{}}
+:::
### Email variables
@@ -152,7 +145,7 @@ Create an account with [Mailgun](https://mailgun.com/).
If you are not using the "US" [Mailgun region](https://documentation.mailgun.com/en/latest/api-intro.html#mailgun-regions), you may define your region's endpoint in the `services.php` configuration file located in the `config/` directory:
-```php {hl_lines=[4]}
+```php
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
@@ -254,7 +247,7 @@ Every time you edit your .env file, you must run this command to have the change
php artisan config:cache
```
-{{}}
+::: tip
**Running Pixelfed without a cache**
It is possible to not use a cache by not running the above cache commands, but it is recommended to run these for production deployments. If you choose not to run these commands, then you can freely edit the .env file and source code instead, and your changes will be reflected instantly, but performance may take a slight hit. You can also undo these commands by running `:clear` commands:
@@ -264,7 +257,7 @@ php artisan route:clear
php artisan view:clear
php artisan config:clear
```
-{{}}
+:::
### Job queueing
@@ -285,7 +278,7 @@ If you are running in production, it is more ideal to create a background servic
Most distributions will already come with systemd, so you may set up this unit file at `/etc/systemd/system/pixelfed.service`:
-```ini {hl_lines=["4-7","11-12"]}
+```ini
[Unit]
Description=Pixelfed task queueing via Laravel Horizon
After=network.target
@@ -304,7 +297,7 @@ Restart=on-failure
WantedBy=multi-user.target
```
-{{}}
+::: tip
**Using correct paths and service names**
The example above assumes you are using MariaDB and Nginx, that your distribution's PHP packages do not have versioned names, and that your distribution uses the `http` user to serve Nginx. It also assumes that you have installed Pixelfed in /usr/share/webapps/pixelfed in accordance with the rest of the installation process documentation. Some changes you may need to make include:
@@ -314,7 +307,7 @@ The example above assumes you are using MariaDB and Nginx, that your distributio
- Replacing `nginx` with `apache`, or replacing `Requires` with `Wants` if you are not running in a production environment
- Replacing `/usr/bin/php` or `/usr/share/webapps/pixelfed/artisan` with the correct paths, e.g. `/usr/bin/php8.1` or `/path/to/pixelfed/artisan`
- Replacing `User=http` to reflect the app user, e.g. `User=pixelfed` or commenting this line in order to run in the system slice.
-{{}}
+:::
You can now use systemd to manage Pixelfed like any other background service:
@@ -324,7 +317,7 @@ sudo systemctl enable --now pixelfed
Alternatively, if you do not wish to use systemd, then you can install Supervisor and create this sample Supervisor configuration file at `/etc/supervisor/conf.d/pixelfed.conf`, making sure to use the correct path to your Pixelfed installation and the appropriate app-user:
-```ini {hl_lines=[2,3,6]}
+```ini
[program:pixelfed]
command=/usr/bin/php /usr/share/webapps/pixelfed/artisan horizon
user=http
@@ -333,11 +326,11 @@ redirect_stderr=true
stdout_logfile=/usr/share/webapps/pixelfed/horizon.log
stopwaitsecs=3600
```
-{{}}
+::: tip
**Using correct paths**
You may need to replace `/usr/bin/php` or `/usr/share/webapps/pixelfed/artisan` with the correct paths, e.g. `/usr/bin/php8.1` or `/path/to/pixelfed/artisan`
-{{}}
+:::
You will then need to run these commands:
@@ -372,11 +365,11 @@ Paste the following cronjob into your crontab:
* * * * * /usr/bin/php /usr/share/webapps/pixelfed/artisan schedule:run >> /dev/null 2>&1
```
-{{}}
+::: tip
**Using correct paths**
You may need to replace `/usr/bin/php` or `/usr/share/webapps/pixelfed/artisan` with the correct paths, e.g. `/usr/bin/php7.3` or `/path/to/pixelfed/artisan`
-{{}}
+:::
### Handling web requests
@@ -403,7 +396,7 @@ RewriteRule ^ index.php [L]
Pixelfed includes a sample NGINX configuration at `contrib/nginx.conf`. You can copy the contents of this file or include it within your `nginx.conf`. Take note of the comments, and make sure to set the correct domain name and root path.
-```nginx {hl_lines=[4,5,7,8,34,37,46]}
+```nginx{4,5,7,8,34,37,46}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
@@ -456,13 +449,13 @@ server { # Redirect http to https
}
```
-{{}}
+::: tip
**FastCGI path**
Make sure to use the correct `fastcgi_pass` socket path for your distribution and version of PHP-FPM. For example, on Arch, this is `/run/php-fpm/php-fpm.sock`, but on Ubuntu it may be `/run/php/php8.1-fpm.sock`, on Debian it may be `/var/run/php/php8.1-fpm.sock`, and so on. If you have configured a PHP server over TCP, you may also pass to its IP and port, e.g. `localhost:9000` by default.
-{{}}
+:::
-{{}}
+::: warning
**Nginx web root**
Make sure to use the `/public` folder as your server root. For example:
@@ -473,15 +466,15 @@ server {
````
If you set root to the install directory (example: `root /var/www/pixelfed;`) Pixelfed will not work.
-{{}}
+:::
-{{}}
+::: tip
**Nginx client max body size**
Make sure to set an appropriate `client_max_body_size` setting in the `nginx.conf` file. Set this slightly greater than your desired post size limit for file uploads. The `nginx.conf` file location will vary based on your server. `/etc/nginx/nginx.conf`
Example:`http {client_max_body_size 9m;}`
-{{}}
+:::
#### Obtaining an HTTPS certificate
diff --git a/content/en/running-pixelfed/prerequisites.md b/running-pixelfed/prerequisites.md
similarity index 96%
rename from content/en/running-pixelfed/prerequisites.md
rename to running-pixelfed/prerequisites.md
index d57e1b8..89c06d1 100644
--- a/content/en/running-pixelfed/prerequisites.md
+++ b/running-pixelfed/prerequisites.md
@@ -1,4 +1,4 @@
-+++
+---
title = "Preparing your machine"
summary = "Download, install, and configure some pre-requisites."
weight = 10
@@ -6,7 +6,9 @@ weight = 10
[menu.docs]
identifier = "admin/prerequisites"
parent = "admin"
-+++
+---
+
+# Prerequisites
Before you install Pixelfed, you will need to setup a webserver with the required dependencies:
@@ -22,13 +24,13 @@ Before you install Pixelfed, you will need to setup a webserver with the require
- [PNGQuant](https://pngquant.org/), for lossy PNG
- [ffmpeg](https://ffmpeg.org/), for generating video thumbnails
-{{}}
+::: warning
**Shared Hosting**
At this stage, it's not possible to install Pixelfed by downloading a ZIP file and uploading the files to your web server. This is because Composer needs to run on the command line.
This doesn't necessarily mean you need a VPS. Some shared hosts give you SSH access, through which you should be able to install Composer and Pixelfed just fine.
-{{}}
+:::
## PHP-FPM
@@ -62,11 +64,11 @@ Finally, make sure to set the desired upload limits for your PHP processes. You
- `max_file_uploads` (default 20, but make sure it is >= your desired attachment limit)
- `max_execution_time` (default 30, consider raising this to 600 or more so that longer tasks aren't interrupted)
-{{}}
+::: tip
**Instagram imports**
Instagram imports are also affected by these settings. If you enable imports, you will want to raise `post_max_size` to the maximum size you expect an Instagram archive to be, `upload_max_filesize` to the maximum size you expect individual Instagram photos to be, and `max_file_uploads` to the maximum number of photos (not posts) you'd expect an Instagram archive to contain.
-{{}}
+:::
## Database
@@ -83,7 +85,7 @@ sudo mysql -u root -p
You can then create a database and grant privileges to your SQL user. The following SQL commands will create a database named `pixelfed` and allow it to be managed by a user `pixelfed` with password `strong_password`:
-```sql {linenos=inline,hl_lines=["1-2"]}
+```sql
create database pixelfed;
grant all privileges on pixelfed.* to 'pixelfed'@'localhost' identified by 'strong_password';
flush privileges;
@@ -102,11 +104,11 @@ CREATE USER pixelfed CREATEDB;
\q
```
-{{}}
+::: warning
**Changing database drivers**
If you decide to change database drivers later, please run a backup first! You can do this with `php artisan backup:run --only-db`
-{{}}
+:::
## HTTP Web server
@@ -132,14 +134,14 @@ cp www.conf pixelfed.conf
$EDITOR pixelfed.conf
```
-{{}}
+::: tip
**Where to define custom PHP-FPM pools**
The exact directory you should `cd` to will vary according to your distribution:
- Arch Linux uses `/etc/php/php-fpm.d`
- Debian and Ubuntu use `/etc/php/8.1/fpm/pool.d/` (dependent on PHP version)
- For other distributions, check your php-fpm.conf to see where exactly you can define `*.conf` with `include=`
-{{}}
+:::
Make the following changes to the PHP-FPM pool:
@@ -171,11 +173,11 @@ unixsocket /run/redis/redis.sock #
unixsocketperm 770 # give permission to "redis" user and group
```
-{{}}
+::: tip
**Where to find redis.conf**
The exact location will vary according to your distribution:
- Arch Linux uses `/etc/redis.conf`
- Debian and Ubuntu use `/etc/redis/redis.conf`
- For other distributions, check your documentation
-{{}}
+:::
diff --git a/content/en/running-pixelfed/troubleshooting.md b/running-pixelfed/troubleshooting.md
similarity index 97%
rename from content/en/running-pixelfed/troubleshooting.md
rename to running-pixelfed/troubleshooting.md
index 8e3981e..c0200ef 100644
--- a/content/en/running-pixelfed/troubleshooting.md
+++ b/running-pixelfed/troubleshooting.md
@@ -1,4 +1,4 @@
-+++
+---
title = "Troubleshooting"
summary = "Frequently asked questions about things going wrong"
weight = 50
@@ -6,7 +6,9 @@ weight = 50
[menu.docs]
identifier = "admin/troubleshooting"
parent = "admin"
-+++
+---
+
+# Troubleshooting
## Horizon is not working
This means that your permissions are wrong somewhere. Make sure that you have run `php artisan horizon` as a user that has access to both your repo and to Redis.
diff --git a/snippets/activitypub/accept_follow.json b/snippets/activitypub/accept_follow.json
new file mode 100644
index 0000000..81f1a65
--- /dev/null
+++ b/snippets/activitypub/accept_follow.json
@@ -0,0 +1,12 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Accept",
+ "id": "https://pixelfed.test/users/john#accepts/follows/2985",
+ "actor": "https://pixelfed.test/users/john",
+ "object": {
+ "type": "Follow",
+ "id": "https://other.test/35860bf0-9930-4131-b5b4-31d2f31df873",
+ "actor": "https://other.test/users/jane",
+ "object": "https://pixelfed.test/users/john"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/actor_object.json b/snippets/activitypub/actor_object.json
new file mode 100644
index 0000000..536c9dd
--- /dev/null
+++ b/snippets/activitypub/actor_object.json
@@ -0,0 +1,30 @@
+{
+ "id": "https://example.org/users/dansup",
+ "type": "Person",
+ "following": "https://example.org/users/dansup/following",
+ "followers": "https://example.org/users/dansup/followers",
+ "inbox": "https://example.org/users/dansup/inbox",
+ "outbox": "https://example.org/users/dansup/outbox",
+ "preferredUsername": "dansup",
+ "name": "dansup",
+ "summary": "Example summary",
+ "url": "https://example.org/dansup",
+ "manuallyApprovesFollowers": false,
+ "indexable": true,
+ "publicKey": {
+ "id": "https://example.org/users/dansup#main-key",
+ "owner": "https://example.org/users/dansup",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY--..."
+ },
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://example.org/avatars/avatar.jpg"
+ },
+ "endpoints": {
+ "sharedInbox": "https://example.org/f/inbox"
+ },
+ "alsoKnownAs": [
+ "https://example.net/users/dansup"
+ ]
+}
\ No newline at end of file
diff --git a/snippets/activitypub/add_story.json b/snippets/activitypub/add_story.json
new file mode 100644
index 0000000..8db66be
--- /dev/null
+++ b/snippets/activitypub/add_story.json
@@ -0,0 +1,14 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/stories/dansup/123456/activity",
+ "type": "Add",
+ "actor": "https://pixelfed.test/users/dansup",
+ "to": [
+ "https://pixelfed.test/users/dansup/followers"
+ ],
+ "object": {
+ "id": "https://pixelfed.test/stories/dansup/123456",
+ "type": "Story",
+ "object": "bear:?t=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&u=https://pixelfed.test/stories/dansup/123456"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/announce.json b/snippets/activitypub/announce.json
new file mode 100644
index 0000000..d0bef9f
--- /dev/null
+++ b/snippets/activitypub/announce.json
@@ -0,0 +1,15 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/p/mike/631334127931904009/activity",
+ "type": "Announce",
+ "actor": "https://pixelfed.test/users/mike",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://pixelfed.test/users/mike",
+ "https://pixelfed.test/users/mike/followers"
+ ],
+ "published": "2023-11-18T03:36:25+0000",
+ "object": "https://pixelfed.test/p/dansup/630671772572999686"
+}
\ No newline at end of file
diff --git a/snippets/activitypub/blurhash_note.json b/snippets/activitypub/blurhash_note.json
new file mode 100644
index 0000000..36a1cc6
--- /dev/null
+++ b/snippets/activitypub/blurhash_note.json
@@ -0,0 +1,21 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "toot": "http://joinmastodon.org/ns#",
+ "blurhash": "toot:blurhash"
+ }
+ ],
+
+ "id": "https://pixelfed.test/p/dansup/618893826647911311",
+ "type": "Note",
+ "content": "Happy #caturday!",
+ "attachment": [
+ {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://example.org/media/caturday.jpg",
+ "blurhash": "UEE:0k_2oexa~pIVtRM{oH%L?bM{9F4nWB~W", // [!code focus]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/snippets/activitypub/create_note.json b/snippets/activitypub/create_note.json
new file mode 100644
index 0000000..aa81edf
--- /dev/null
+++ b/snippets/activitypub/create_note.json
@@ -0,0 +1,89 @@
+{
+ "@context": [
+ "https://w3id.org/security/v1",
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "Hashtag": "as:Hashtag",
+ "sensitive": "as:sensitive",
+ "schema": "http://schema.org/",
+ "pixelfed": "http://pixelfed.org/ns#",
+ "commentsEnabled": {
+ "@id": "pixelfed:commentsEnabled",
+ "@type": "schema:Boolean"
+ },
+ "capabilities": {
+ "@id": "pixelfed:capabilities",
+ "@container": "@set"
+ },
+ "announce": {
+ "@id": "pixelfed:canAnnounce",
+ "@type": "@id"
+ },
+ "like": {
+ "@id": "pixelfed:canLike",
+ "@type": "@id"
+ },
+ "reply": {
+ "@id": "pixelfed:canReply",
+ "@type": "@id"
+ },
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "blurhash": "toot:blurhash"
+ }
+ ],
+ "id": "https://pixelfed.test/p/admin/1/activity",
+ "type": "Create",
+ "actor": "https://pixelfed.test/users/admin",
+ "published": "2018-05-31T21:57:27+00:00",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://pixelfed.test/users/admin/followers"
+ ],
+ "object": {
+ "id": "https://pixelfed.test/p/admin/1",
+ "type": "Note",
+ "summary": null,
+ "content": "Hello Fediverse! #pixelfed#dogsOfPixelFed",
+ "inReplyTo": null,
+ "published": "2018-05-31T21:57:27+00:00",
+ "url": "https://pixelfed.test/p/admin/1",
+ "attributedTo": "https://pixelfed.test/users/admin",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://pixelfed.test/users/admin/followers"
+ ],
+ "sensitive": false,
+ "attachment": [
+ {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://pixelfed.test/storage/m/image.jpeg",
+ "name": null
+ }
+ ],
+ "tag": [
+ {
+ "type": "Hashtag",
+ "href": "https://pixelfed.test/discover/tags/pixelfed",
+ "name": "#pixelfed"
+ },
+ {
+ "type": "Hashtag",
+ "href": "https://pixelfed.test/discover/tags/dogsofpixelfed",
+ "name": "#dogsOfPixelFed"
+ }
+ ],
+ "commentsEnabled": true,
+ "capabilities": {
+ "announce": "https://www.w3.org/ns/activitystreams#Public",
+ "like": "https://www.w3.org/ns/activitystreams#Public",
+ "reply": "https://www.w3.org/ns/activitystreams#Public"
+ },
+ "location": null
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/custom_emoji.json b/snippets/activitypub/custom_emoji.json
new file mode 100644
index 0000000..b7fd96b
--- /dev/null
+++ b/snippets/activitypub/custom_emoji.json
@@ -0,0 +1,26 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji", // [!code focus]
+ }
+ ],
+
+ "id": "https://pixelfed.test/p/dansup/647727972628135937",
+ "type": "Note",
+ "content": "test :pixelfed: custom emoji", // [!code focus]
+ "tag": [
+ {
+ "id": "https://pixelfed.test/emojis/12",
+ "type": "Emoji",
+ "name": ":pixelfed:", // [!code focus]
+ "updated": "2022-01-21T02:01:03+00:00",
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/png",
+ "url": "https://pixelfed.test/storage/emoji/12.png"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/snippets/activitypub/delete_note.json b/snippets/activitypub/delete_note.json
new file mode 100644
index 0000000..5d7af0e
--- /dev/null
+++ b/snippets/activitypub/delete_note.json
@@ -0,0 +1,10 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/p/admin/1#delete",
+ "type": "Delete",
+ "actor": "https://pixelfed.test/users/admin",
+ "object": {
+ "id": "https://pixelfed.test/p/admin/1",
+ "type": "Tombstone"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/delete_story.json b/snippets/activitypub/delete_story.json
new file mode 100644
index 0000000..51a58d9
--- /dev/null
+++ b/snippets/activitypub/delete_story.json
@@ -0,0 +1,10 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/stories/dansup/123456#delete",
+ "type": "Delete",
+ "actor": "https://pixelfed.test/users/dansup",
+ "object": {
+ "id": "https://pixelfed.test/stories/dansup/123456",
+ "type": "Story"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/follow.json b/snippets/activitypub/follow.json
new file mode 100644
index 0000000..85d8813
--- /dev/null
+++ b/snippets/activitypub/follow.json
@@ -0,0 +1,6 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Follow",
+ "actor": "https://pixelfed.test/users/pixelfed",
+ "object": "https://pixelfed.test/users/admin"
+}
\ No newline at end of file
diff --git a/snippets/activitypub/followers_collection.json b/snippets/activitypub/followers_collection.json
new file mode 100644
index 0000000..5dd0ffe
--- /dev/null
+++ b/snippets/activitypub/followers_collection.json
@@ -0,0 +1,6 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/users/pixelfed/followers",
+ "type": "OrderedCollection",
+ "totalItems": 18189
+}
\ No newline at end of file
diff --git a/snippets/activitypub/following_collection.json b/snippets/activitypub/following_collection.json
new file mode 100644
index 0000000..736575b
--- /dev/null
+++ b/snippets/activitypub/following_collection.json
@@ -0,0 +1,6 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/users/pixelfed/following",
+ "type": "OrderedCollection",
+ "totalItems": 2
+}
\ No newline at end of file
diff --git a/snippets/activitypub/like.json b/snippets/activitypub/like.json
new file mode 100644
index 0000000..b9acf59
--- /dev/null
+++ b/snippets/activitypub/like.json
@@ -0,0 +1,7 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/users/admin#likes/1",
+ "type": "Like",
+ "actor": "https://pixelfed.test/users/admin",
+ "object": "https://pixelfed.test/p/admin/1"
+}
\ No newline at end of file
diff --git a/snippets/activitypub/location_note.json b/snippets/activitypub/location_note.json
new file mode 100644
index 0000000..6387263
--- /dev/null
+++ b/snippets/activitypub/location_note.json
@@ -0,0 +1,16 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ ],
+ "id": "https://pixelfed.test/p/dansup/75783646421848064",
+ "type": "Note",
+ "summary": null,
+ "content": "Menlo Park, aka Pixelfed Park",
+ "location": { // [!code focus]
+ "type": "Place", // [!code focus]
+ "name": "Menlo Park", // [!code focus]
+ "longitude": "-122.182190", // [!code focus]
+ "latitude": "37.453830", // [!code focus]
+ "country": "USA" // [!code focus]
+ } // [!code focus]
+}
\ No newline at end of file
diff --git a/snippets/activitypub/note_capabilities.json b/snippets/activitypub/note_capabilities.json
new file mode 100644
index 0000000..35f3f49
--- /dev/null
+++ b/snippets/activitypub/note_capabilities.json
@@ -0,0 +1,36 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "pixelfed": "http://pixelfed.org/ns#",
+ "commentsEnabled": {
+ "@id": "pixelfed:commentsEnabled",
+ "@type": "schema:Boolean"
+ },
+ "capabilities": {
+ "@id": "pixelfed:capabilities",
+ "@container": "@set"
+ },
+ "announce": {
+ "@id": "pixelfed:canAnnounce",
+ "@type": "@id"
+ },
+ "like": {
+ "@id": "pixelfed:canLike",
+ "@type": "@id"
+ },
+ "reply": {
+ "@id": "pixelfed:canReply",
+ "@type": "@id"
+ },
+ }
+ ],
+ "id": "https://pixelfed.test/p/dansup/618893826647911311",
+ "type": "Note",
+ "content": "Happy #caturday!",
+ "capabilities": {
+ "announce": "https://www.w3.org/ns/activitystreams#Public", // [!code focus]
+ "like": "https://www.w3.org/ns/activitystreams#Public", // [!code focus]
+ "reply": "https://www.w3.org/ns/activitystreams#Public" // [!code focus]
+ },
+}
\ No newline at end of file
diff --git a/snippets/activitypub/note_sensitive.json b/snippets/activitypub/note_sensitive.json
new file mode 100644
index 0000000..bc7e1ac
--- /dev/null
+++ b/snippets/activitypub/note_sensitive.json
@@ -0,0 +1,13 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "sensitive": "as:sensitive", // [!code focus]
+ }
+ ],
+ "id": "https://pixelfed.test/p/dansup/618893826647911311",
+ "type": "Note",
+ "summary": null,
+ "content": "Happy #caturday!",
+ "sensitive": false // [!code focus]
+}
\ No newline at end of file
diff --git a/snippets/activitypub/outbox_collection.json b/snippets/activitypub/outbox_collection.json
new file mode 100644
index 0000000..54d0b59
--- /dev/null
+++ b/snippets/activitypub/outbox_collection.json
@@ -0,0 +1,6 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/users/pixelfed/outbox",
+ "type": "OrderedCollection",
+ "totalItems": 22
+}
\ No newline at end of file
diff --git a/snippets/activitypub/reject_follow.json b/snippets/activitypub/reject_follow.json
new file mode 100644
index 0000000..473d42d
--- /dev/null
+++ b/snippets/activitypub/reject_follow.json
@@ -0,0 +1,12 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Reject",
+ "id": "https://pixelfed.test/users/example#rejects/follows/4284",
+ "actor": "https://pixelfed.test/users/example",
+ "object": {
+ "type": "Follow",
+ "id": "https://other.test/follows/9k2hoq7pj105mcdm",
+ "actor": "https://other.test/users/john",
+ "object": "https://pixelfed.test/users/example"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/status_context.json b/snippets/activitypub/status_context.json
new file mode 100644
index 0000000..1315708
--- /dev/null
+++ b/snippets/activitypub/status_context.json
@@ -0,0 +1,33 @@
+"@context": [
+ "https://w3id.org/security/v1",
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "Hashtag": "as:Hashtag",
+ "sensitive": "as:sensitive",
+ "schema": "http://schema.org/",
+ "pixelfed": "http://pixelfed.org/ns#",
+ "commentsEnabled": {
+ "@id": "pixelfed:commentsEnabled",
+ "@type": "schema:Boolean"
+ },
+ "capabilities": {
+ "@id": "pixelfed:capabilities",
+ "@container": "@set"
+ },
+ "announce": {
+ "@id": "pixelfed:canAnnounce",
+ "@type": "@id"
+ },
+ "like": {
+ "@id": "pixelfed:canLike",
+ "@type": "@id"
+ },
+ "reply": {
+ "@id": "pixelfed:canReply",
+ "@type": "@id"
+ },
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "blurhash": "toot:blurhash"
+ }
+]
\ No newline at end of file
diff --git a/snippets/activitypub/undo_announce.json b/snippets/activitypub/undo_announce.json
new file mode 100644
index 0000000..49fb485
--- /dev/null
+++ b/snippets/activitypub/undo_announce.json
@@ -0,0 +1,20 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/p/dansup/12345/undo",
+ "actor": "https://pixelfed.test/users/dansup",
+ "type": "Undo",
+ "object": {
+ "id": "https://pixelfed.test/p/dansup/12345/activity",
+ "type": "Announce",
+ "actor": "https://pixelfed.test/users/dansup",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://pixelfed.test/users/dansup",
+ "https://pixelfed.test/users/dansup/followers"
+ ],
+ "published": "2018-09-10T00:03:25+0000",
+ "object": "https://pixelfed.test/p/dansup/11767"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/undo_follow.json b/snippets/activitypub/undo_follow.json
new file mode 100644
index 0000000..04c92b2
--- /dev/null
+++ b/snippets/activitypub/undo_follow.json
@@ -0,0 +1,12 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/users/pixelfed#follow/1/undo",
+ "type": "Undo",
+ "actor": "https://pixelfed.test/users/pixelfed",
+ "object": {
+ "id": "https://pixelfed.test/users/pixelfed#follows/1",
+ "actor": "https://pixelfed.test/users/pixelfed",
+ "object": "https://pixelfed.test/users/admin",
+ "type": "Follow"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/undo_like.json b/snippets/activitypub/undo_like.json
new file mode 100644
index 0000000..de1a25e
--- /dev/null
+++ b/snippets/activitypub/undo_like.json
@@ -0,0 +1,12 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "https://pixelfed.test/users/admin#likes/1/undo",
+ "type": "Undo",
+ "actor": "https://pixelfed.test/users/admin",
+ "object": {
+ "id": "https://pixelfed.test/users/admin#likes/1",
+ "type": "Like",
+ "actor": "https://pixelfed.test/users/admin",
+ "object": "https://pixelfed.test/p/admin/1"
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/update_note.json b/snippets/activitypub/update_note.json
new file mode 100644
index 0000000..122aad6
--- /dev/null
+++ b/snippets/activitypub/update_note.json
@@ -0,0 +1,92 @@
+{
+ "@context": [
+ "https://w3id.org/security/v1",
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "Hashtag": "as:Hashtag",
+ "sensitive": "as:sensitive",
+ "schema": "http://schema.org/",
+ "pixelfed": "http://pixelfed.org/ns#",
+ "commentsEnabled": {
+ "@id": "pixelfed:commentsEnabled",
+ "@type": "schema:Boolean"
+ },
+ "capabilities": {
+ "@id": "pixelfed:capabilities",
+ "@container": "@set"
+ },
+ "announce": {
+ "@id": "pixelfed:canAnnounce",
+ "@type": "@id"
+ },
+ "like": {
+ "@id": "pixelfed:canLike",
+ "@type": "@id"
+ },
+ "reply": {
+ "@id": "pixelfed:canReply",
+ "@type": "@id"
+ },
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji"
+ }
+ ],
+ "id": "https://pixelfed.test/p/dansup/567257798031955417#updates/4269",
+ "type": "Update",
+ "actor": "https://pixelfed.test/users/dansup",
+ "published": "2023-05-26T21:01:10+00:00",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://pixelfed.test/users/dansup/followers",
+ "https://example.net/users/pixelfed"
+ ],
+ "object": {
+ "id": "https://pixelfed.test/p/dansup/567257798031955417",
+ "type": "Note",
+ "summary": null,
+ "content": "Don't mind me, just testing post editing on @pixelfed@example.net \ud83d\ude09 \n \nEdit: It works!!",
+ "inReplyTo": null,
+ "published": "2023-05-25T01:59:58+00:00",
+ "url": "https://pixelfed.test/p/dansup/567257798031955417",
+ "attributedTo": "https://pixelfed.test/users/dansup",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://pixelfed.test/users/dansup/followers",
+ "https://example.net/users/pixelfed"
+ ],
+ "sensitive": false,
+ "attachment": [
+ {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://example.org/m/1.jpg",
+ "name": "Night sky"
+ },
+ {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://example.org/m/2.jpg",
+ "name": "Sunrise at dawn"
+ }
+ ],
+ "tag": [
+ {
+ "type": "Mention",
+ "href": "https://example.net/users/pixelfed",
+ "name": "@pixelfed@example.net"
+ }
+ ],
+ "commentsEnabled": true,
+ "updated": "2023-05-26T21:01:10+00:00",
+ "capabilities": {
+ "announce": "https://www.w3.org/ns/activitystreams#Public",
+ "like": "https://www.w3.org/ns/activitystreams#Public",
+ "reply": "https://www.w3.org/ns/activitystreams#Public"
+ },
+ "location": null
+ }
+}
\ No newline at end of file
diff --git a/snippets/activitypub/update_person.json b/snippets/activitypub/update_person.json
new file mode 100644
index 0000000..98e9e87
--- /dev/null
+++ b/snippets/activitypub/update_person.json
@@ -0,0 +1,49 @@
+{
+ "@context": [
+ "https://w3id.org/security/v1",
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "pixelfed": "http://pixelfed.org/ns#",
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "alsoKnownAs": {
+ "@id": "as:alsoKnownAs",
+ "@type": "@id"
+ },
+ "movedTo": {
+ "@id": "as:movedTo",
+ "@type": "@id"
+ },
+ "indexable": "pixelfed:indexable"
+ }
+ ],
+ "id": "https://pixelfed.test/users/admin#updates/1704185077",
+ "actor": "https://pixelfed.test/users/admin",
+ "type": "Update",
+ "object": {
+ "id": "https://pixelfed.test/users/admin",
+ "type": "Person",
+ "following": "https://pixelfed.test/users/admin/following",
+ "followers": "https://pixelfed.test/users/admin/followers",
+ "inbox": "https://pixelfed.test/users/admin/inbox",
+ "outbox": "https://pixelfed.test/users/admin/outbox",
+ "preferredUsername": "admin",
+ "name": "Admin",
+ "summary": "pixelfed.social Admin. Managed by @dansup",
+ "url": "https://pixelfed.test/admin",
+ "manuallyApprovesFollowers": false,
+ "indexable": false,
+ "publicKey": {
+ "id": "https://pixelfed.test/users/admin#main-key",
+ "owner": "https://pixelfed.test/users/admin",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwrugl5+u144q5Lkpfajl\ntx32cSFxYoA0BpMCEThiq195kpMw3h7kAUIOatI9IpoXb70mQr27l1L7kMXoj3nQ\nGy1EvIpZ/8tjH6cGxh65Ld+PXI42qyjyHeGRXWpfKqVxiB3ip9gtDQyWSAjVbt33\nfjJcMXFQXxUeX8eUZ/EJ/6hlK7okfzP55w1UGBfrQETCmf7P2egqM1dCbx7cfZdJ\n4dcGULEAxwYSTtfmUTih/djT5oE7kif8GIr9pdMuobiHrI6BP/ELwFU9t3nIQhjv\nfYGS/I5qIMeF/hvZDcak3aXXejcAwF8MJSiqDJtWeB2t8+xi8HsfMm5NbSmFv6o5\nBwIDAQAB\n-----END PUBLIC KEY-----\n"
+ },
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://pixelfed.test/storage/avatars/avatar.png"
+ },
+ "endpoints": {
+ "sharedInbox": "https://pixelfed.test/f/inbox"
+ }
+ }
+}
\ No newline at end of file
diff --git a/spec/ActivityPub.md b/spec/ActivityPub.md
new file mode 100644
index 0000000..8faf38b
--- /dev/null
+++ b/spec/ActivityPub.md
@@ -0,0 +1,315 @@
+# ActivityPub
+
+A decentralized social networking protocol based upon the ActivityStreams 2.0 data format and JSON-LD. Pixelfed uses ActivityPub to send and recieve activities from other Pixelfed servers and other fediverse software like Mastodon.
+
+## Context
+
+::: details Click to expand status context example
+<<< @/snippets/activitypub/status_context.json
+:::
+
+
+## Actors
+
+::: details Click to expand actor example
+<<< @/snippets/activitypub/actor_object.json
+:::
+
+::: details Click to expand actor attributes
+| Field | Type | Description |
+| ------------- | :-----------: | -----------: |
+| id | String | ID of the user |
+| type | String | The object type, always set to `Person` |
+| following | String | The [`following`](#following) collection |
+| followers | String | The [`followers`](#followers) collection |
+| inbox | String | The `inbox` collection |
+| outbox | String | The [`outbox`](#outbox) collection |
+| preferredUsername | String | The account username |
+| name | String | The account display name |
+| summary | String | The account bio, may contain HTML |
+| url | String | The account url |
+| manuallyApprovesFollowers | Boolean | If the account is private, this value is set to `true` |
+| indexable | Boolean | If the account allows crawling, this value is set to `true` |
+| publicKey | Object | The public key data used for federation |
+| icon | Object | The account avatar object |
+| endpoints | Object | The `sharedInbox` will be set if configured |
+| alsoKnownAs | Array | A list of account aliases if applicable |
+:::
+
+## Activities
+
+Supported ActivityPub Activities
+
+::: details Click to expand Activities
+
+### Accept
+
+`object.type` if `Follow` is transformed into a `FollowRequest` or `Follow` model.
+
+### Add
+
+If `type` is `Story` then `object` object is transformed into `Story` model.
+
+### Announce
+
+`object` object is transformed into a `reblog_of_id` `Status` model.
+
+### Create
+
+`Note` and `Question` objects are transformed into `statuses` database models.
+
+### Delete
+
+`Person`, `Tombstone` and `Story` objects with cached models are deleted.
+
+### Flag
+
+Used for federated Reports.
+
+### Like
+
+`object` object is transformed into a `StatusLike` model.
+
+### Reject
+
+Used to reject or deny `FollowRequest`.
+
+### Story:Reaction
+
+Transformed into `StoryReaction` model.
+
+### Story:Reply
+
+Transformed into `StoryReaction` model.
+
+### Update
+
+Used for ...
+
+### Undo
+
+Used for ...
+
+### View
+
+Transformed into `StoryView` model.
+:::
+
+## Collections
+
+### Following
+
+The user `following` collection is comprised of accounts that this account follows. You may use the `totalItems` to get the following count for this account, it may return `0` if the account has opted to hide their following.
+
+::: details Click to expand following example
+<<< @/snippets/activitypub/following_collection.json
+:::
+
+### Followers
+
+The user `followers` collection is comprised of accounts that follow this account. You may use the `totalItems` to get the followers count for this account, it may return `0` if the account has opted to hide their followers.
+
+::: details Click to expand followers example
+<<< @/snippets/activitypub/followers_collection.json
+:::
+
+### Outbox
+
+The user `outbox` collection is comprised of statuses authored by this account. You may use the `totalItems` to get the status count for this account, it may return `0` if the account is private.
+
+::: details Click to expand outbox example
+<<< @/snippets/activitypub/outbox_collection.json
+:::
+
+## Objects
+
+### Accept
+
+#### Accept.Follow
+
+Approve/accept follow requests
+
+::: details Click to expand
+<<< @/snippets/activitypub/accept_follow.json
+:::
+
+### Announce
+
+Announce (also known as boosting or re-tooting) a status to your followers
+
+::: details Click to expand
+<<< @/snippets/activitypub/announce.json
+:::
+
+### Add
+
+#### Add.Story
+
+This object is used for federating new Stories, and uses Bearcaps. We currently deliver this activity to known Pixelfed instances only.
+
+::: details Click to expand
+<<< @/snippets/activitypub/add_story.json
+:::
+
+### Create
+
+#### Create.Note
+
+Share a new status to your followers.
+
+::: details Click to expand
+<<< @/snippets/activitypub/create_note.json
+:::
+
+### Delete
+
+#### Delete.Note
+
+Delete a status by the object id.
+
+::: details Click to expand
+<<< @/snippets/activitypub/delete_note.json
+:::
+
+#### Delete.Story
+
+Delete a story by the object id.
+
+::: details Click to expand
+<<< @/snippets/activitypub/delete_story.json
+:::
+
+### Follow
+
+Follow a specific account as described by the `object` attribute.
+
+::: details Click to expand
+<<< @/snippets/activitypub/follow.json
+:::
+
+### Like
+
+Like a specific status as described by the `object` attribute.
+
+::: details Click to expand
+<<< @/snippets/activitypub/like.json
+:::
+
+### Reject
+
+#### Reject.Follow
+
+Reject/deny a follow request by the `actor`.
+
+::: details Click to expand
+<<< @/snippets/activitypub/reject_follow.json
+:::
+
+### Undo
+
+#### Undo.Announce
+
+Undo the announce/boost activity as described by the `object.object` attribute.
+
+::: details Click to expand
+<<< @/snippets/activitypub/undo_announce.json
+:::
+
+#### Undo.Follow
+
+::: details Click to expand
+<<< @/snippets/activitypub/undo_follow.json
+:::
+
+#### Undo.Like
+
+::: details Click to expand
+<<< @/snippets/activitypub/undo_like.json
+:::
+
+### Update
+
+#### Update.Note
+
+::: details Click to expand
+<<< @/snippets/activitypub/update_note.json
+:::
+
+#### Update.Person
+
+::: details Click to expand
+<<< @/snippets/activitypub/update_person.json
+:::
+
+## Extensions
+
+### Blurhash
+
+Pixelfed supports the [blurhash](https://blurha.sh) algorithm to generate efficient image previews to show as a placeholder while content is loading, or for sensitive statuses.
+
+::: details Click to expand blurhash example
+<<< @/snippets/activitypub/blurhash_note.json
+:::
+
+### Capabilities (Comment Controls)
+
+Pixelfed supports basic comment controls, allowing users to disable `Announce`, `Like` and reply activities. The `announce`, `like` and `reply` attributes will be either `NULL` or `https://www.w3.org/ns/activitystreams#Public` to represent basic ACL.
+
+::: details Click to expand capabilities example
+<<< @/snippets/activitypub/note_capabilities.json
+:::
+
+### Content Warnings
+
+Pixelfed employs the `as:sensitive` extension property, similar to Mastodon, for indicating sensitive content in posts. When this property is applied to a post in Pixelfed, any associated media will be concealed by default. Additionally, if the post includes a summary, the main content of the post will be collapsed behind this summary, functioning as a content warning. This feature ensures that sensitive material is not immediately visible to viewers, requiring an action to view it.
+
+::: details Click to expand content warnings example
+<<< @/snippets/activitypub/note_sensitive.json
+:::
+
+### Custom Emoji
+
+Pixelfed, akin to [Mastodon](https://docs.joinmastodon.org/spec/activitypub/#Emoji), accommodates custom emojis through the integration of an `Emoji` type tag. This feature operates similarly to the handling of mentions and hashtags.
+
+In this system, the custom emoji is recognized as a substring within the natural language elements (such as the name, summary, or content) of a post. This substring, representing the emoji's shortcode, is then dynamically linked to its corresponding visual representation. Specifically, the shortcode name is substituted in the post with the HTML code for an inline image, which is derived from the icon property of the emoji. The icon's URL directly links to the image resource, ensuring that the custom emoji is properly displayed within the content.
+
+::: details Click to expand custom emoji example
+<<< @/snippets/activitypub/custom_emoji.json
+:::
+
+### Location (Geo-tagging)
+
+Pixelfed supports location geo-tagging statuses by selecting a location from a shared dataset. The `location` object contains a `type` attribute which is always `Place`, a `name` attribute of the location city, the `longitude` and `latitude` attributes describe the geographic location and finally the `country` attribute is the location country.
+
+::: details Click to expand location example
+<<< @/snippets/activitypub/location_note.json
+:::
+
+## Authorized Fetch
+
+Pixelfed, like other platforms in the Fediverse including Mastodon, uses digital signatures to ensure secure and authenticated federation requests. This compatibility with Mastodon's Authorized Fetch protocol is a crucial aspect of maintaining a secure and interoperable federated network.
+
+::: details Click to learn more
+
+Here's how Pixelfed signs federation requests to align with Mastodon's Authorized Fetch mechanism:
+
+1. **HTTP Signatures**: Pixelfed employs HTTP Signatures to sign federation requests. This is a standard method used across the Fediverse for authenticating HTTP requests, ensuring that the request is sent by a known and verified entity.
+
+2. **Digital Signature Creation**: When Pixelfed sends a federation request (like a post or an activity), it generates a digital signature using the private key of the sending user or server. This signature is unique to each request and is based on the content of the HTTP request.
+
+3. **Including Public Key Information**: Pixelfed includes information in its federation requests about how to find the public key needed to verify the signature. This is usually a URL pointing to an actor's profile where the public key can be fetched.
+
+4. **Verification on the Receiving End**: When Mastodon, or any other compatible platform in the Fediverse, receives a request from Pixelfed, it uses the provided information to fetch the public key and verify the signature. This process ensures that the request is indeed from the claimed source and has not been tampered with during transmission.
+
+5. **Timestamps and Replay Prevention**: To prevent replay attacks, Pixelfed includes timestamps in its signed requests. Mastodon and other platforms check these timestamps to ensure that the request is recent and not a replay of an old request.
+
+6. **Compliance with ActivityPub Protocol**: Both Pixelfed and Mastodon adhere to the ActivityPub protocol, which standardizes the way federated services communicate. The use of HTTP Signatures for authentication is a part of this protocol.
+
+7. **Authorized Fetch Compatibility**: For Mastodon's Authorized Fetch, when Pixelfed sends a request to Mastodon (like accessing a post or user data), Mastodon checks the signature to authenticate the request. Only if the signature is valid and the request is authorized, Mastodon will fulfill the request, aligning with its privacy and security standards.
+
+By following these steps, Pixelfed ensures that its federation requests to Mastodon and other Fediverse platforms are secure, authenticated, and in line with the privacy standards set by these platforms. This method effectively maintains user privacy and data integrity across different services in the federated network.
+:::
+
+
+
+
\ No newline at end of file
diff --git a/static/images/pixelfed-profile.png b/static/images/pixelfed-profile.png
deleted file mode 100644
index 3a7ec3d..0000000
Binary files a/static/images/pixelfed-profile.png and /dev/null differ
diff --git a/themes/paradox b/themes/paradox
deleted file mode 160000
index 577d45d..0000000
--- a/themes/paradox
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 577d45d74e9faf9fedc98140dd41d98f1f449f5c