浏览代码

Staging (#5674)

* Update .env.docker

Registry has changed. Old registry has been discontinued in August 2024. New Registry added, format of Docker tag has been adjusted as it now contains the Debian Release as well.

Sample Version is set to current stable but can be adjusted to any of the available branches.

* Update .env.docker

Stick major.minor according to https://jippi.github.io/docker-pixelfed/customize/tags/#pixelfed-version

Disable Debian Release Check until it's solved in dottie.

Closes https://github.com/pixelfed/pixelfed/issues/5264

* New translations web.php (Finnish)
[ci skip]

* New translations web.php (Finnish)
[ci skip]

* fix: don't restore memory limit after cities import

Since this command can only be invoked by CLI, the process will exit after a successful import, so restoring the transient PHP memory limit doesn't really have any affect.

In PHP 8.4, this throws the following error (which doesn't happen in 8.3 and below)

> [entrypoint / 11-first-time-setup.sh] - (stderr) 128769/128769 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%[2025-01-20 11:29:23] production.ERROR: Failed to set memory limit to 134217728 bytes (Current memory usage is 134746112 bytes) {"exception":"[object] (ErrorException(code: 0): Failed to set memory limit to 134217728 bytes (Current memory usage is 134746112 bytes) at /var/www/app/Console/Commands/ImportCities.php:140)

It seems to be a 8.4 behavior change, so removing the logic would make it go away

* New translations web.php (Finnish)
[ci skip]

* New translations web.php (Finnish)
[ci skip]

* New translations web.php (Portuguese)
[ci skip]

* New translations web.php (Portuguese)
[ci skip]

* fix(compose-modal): avoid WebGL if it's not needed

* fix(compose-modal): update webgl-media-editor

* New translations web.php (Hungarian)
[ci skip]

* New translations web.php (Russian)
[ci skip]

* New translations web.php (Russian)
[ci skip]

* Update .env.example

Adding the parameter INSTANCE_DISCOVER_PUBLIC="true" to prevent a HTTP 403 error at the explorer tab in the instance preview.

* New variable for lang spanish

* Variable for lang spanish

* Update Dockerfile, fixes #5535 #5559

* Fix #5582

* Fix #5632

* Update status twitter:card to summary_large_image for images/albums

* Update changelog

---------

Co-authored-by: Lioh Moeller <lioh.moeller@gmx.net>
Co-authored-by: Christian Winther <jippignu@gmail.com>
Co-authored-by: Taye Adeyemi <dev@taye.me>
Co-authored-by: stemy2 <stemy2@users.noreply.github.com>
Co-authored-by: Uthanien <feldarec@gmail.com>
daniel 5 月之前
父节点
当前提交
6276d3539a

+ 4 - 4
.env.docker

@@ -964,7 +964,7 @@ TZ="${APP_TIMEZONE}"
 # Combined with [DOCKER_APP_RUNTIME] and [PHP_VERSION] configured
 # Combined with [DOCKER_APP_RUNTIME] and [PHP_VERSION] configured
 # elsewhere in this file, the final Docker tag is computed.
 # elsewhere in this file, the final Docker tag is computed.
 # @dottie/validate required
 # @dottie/validate required
-DOCKER_APP_RELEASE="branch-jippi-fork"
+DOCKER_APP_RELEASE="v0.12"
 
 
 # The PHP version to use for [web] and [worker] container
 # The PHP version to use for [web] and [worker] container
 #
 #
@@ -981,7 +981,7 @@ DOCKER_APP_RELEASE="branch-jippi-fork"
 # *only* the version part. The rest of the full tag is derived from
 # *only* the version part. The rest of the full tag is derived from
 # the [DOCKER_APP_RUNTIME] and [PHP_DEBIAN_RELEASE] settings
 # the [DOCKER_APP_RUNTIME] and [PHP_DEBIAN_RELEASE] settings
 # @dottie/validate required
 # @dottie/validate required
-DOCKER_APP_PHP_VERSION="8.2"
+DOCKER_APP_PHP_VERSION="8.3"
 
 
 # The container runtime to use.
 # The container runtime to use.
 #
 #
@@ -993,7 +993,7 @@ DOCKER_APP_RUNTIME="apache"
 #
 #
 # Examlpe: [bookworm] or [bullseye]
 # Examlpe: [bookworm] or [bullseye]
 # @dottie/validate required,oneof=bookworm bullseye
 # @dottie/validate required,oneof=bookworm bullseye
-DOCKER_APP_DEBIAN_RELEASE="bullseye"
+DOCKER_APP_DEBIAN_RELEASE="bookworm"
 
 
 # The [php] Docker image base type
 # The [php] Docker image base type
 #
 #
@@ -1010,7 +1010,7 @@ DOCKER_APP_BASE_TYPE="apache"
 #   * "your/fork"                 to pull from a custom fork
 #   * "your/fork"                 to pull from a custom fork
 #
 #
 # @dottie/validate required
 # @dottie/validate required
-DOCKER_APP_IMAGE="ghcr.io/jippi/pixelfed"
+DOCKER_APP_IMAGE="ghcr.io/jippi/docker-pixelfed"
 
 
 # Pixelfed version (image tag) to pull from the registry.
 # Pixelfed version (image tag) to pull from the registry.
 #
 #

+ 1 - 0
.env.example

@@ -9,6 +9,7 @@ ENFORCE_EMAIL_VERIFICATION="false"
 PF_MAX_USERS="1000"
 PF_MAX_USERS="1000"
 OAUTH_ENABLED="true"
 OAUTH_ENABLED="true"
 ENABLE_CONFIG_CACHE=true
 ENABLE_CONFIG_CACHE=true
+INSTANCE_DISCOVER_PUBLIC="true"
 
 
 # Media Configuration
 # Media Configuration
 PF_OPTIMIZE_IMAGES="true"
 PF_OPTIMIZE_IMAGES="true"

+ 1 - 0
CHANGELOG.md

@@ -40,6 +40,7 @@
 - Update ComposeController, add max_media_attachments attribute ([17918cbe](https://github.com/pixelfed/pixelfed/commit/17918cbe))
 - Update ComposeController, add max_media_attachments attribute ([17918cbe](https://github.com/pixelfed/pixelfed/commit/17918cbe))
 - Fix GroupController, move groups enabled check to each method to fix route:list ([f260572e](https://github.com/pixelfed/pixelfed/commit/f260572e))
 - Fix GroupController, move groups enabled check to each method to fix route:list ([f260572e](https://github.com/pixelfed/pixelfed/commit/f260572e))
 - Update MediaStorageService, handle local media deletes after successful S3 upload ([280f63dc](https://github.com/pixelfed/pixelfed/commit/280f63dc))
 - Update MediaStorageService, handle local media deletes after successful S3 upload ([280f63dc](https://github.com/pixelfed/pixelfed/commit/280f63dc))
+- Update status twitter:card to summary_large_image for images/albums ([9a5a9f55](https://github.com/pixelfed/pixelfed/commit/9a5a9f55))
 -  ([](https://github.com/pixelfed/pixelfed/commit/))
 -  ([](https://github.com/pixelfed/pixelfed/commit/))
 
 
 ## [v0.12.4 (2024-11-08)](https://github.com/pixelfed/pixelfed/compare/v0.12.4...dev)
 ## [v0.12.4 (2024-11-08)](https://github.com/pixelfed/pixelfed/compare/v0.12.4...dev)

+ 2 - 2
Dockerfile

@@ -28,11 +28,11 @@ ARG DOTTIE_VERSION="v0.9.5"
 ###
 ###
 
 
 # See: https://hub.docker.com/_/php/tags
 # See: https://hub.docker.com/_/php/tags
-ARG PHP_VERSION="8.1"
+ARG PHP_VERSION="8.3"
 
 
 # See: https://github.com/docker-library/docs/blob/master/php/README.md#image-variants
 # See: https://github.com/docker-library/docs/blob/master/php/README.md#image-variants
 ARG PHP_BASE_TYPE="apache"
 ARG PHP_BASE_TYPE="apache"
-ARG PHP_DEBIAN_RELEASE="bullseye"
+ARG PHP_DEBIAN_RELEASE="bookworm"
 
 
 ARG RUNTIME_UID=33 # often called 'www-data'
 ARG RUNTIME_UID=33 # often called 'www-data'
 ARG RUNTIME_GID=33 # often called 'www-data'
 ARG RUNTIME_GID=33 # often called 'www-data'

+ 0 - 2
app/Console/Commands/ImportCities.php

@@ -74,7 +74,6 @@ class ImportCities extends Command
      */
      */
     public function handle()
     public function handle()
     {
     {
-        $old_memory_limit = ini_get('memory_limit');
         ini_set('memory_limit', '256M');
         ini_set('memory_limit', '256M');
         $path = storage_path('app/cities.json');
         $path = storage_path('app/cities.json');
 
 
@@ -137,7 +136,6 @@ class ImportCities extends Command
         $this->line('');
         $this->line('');
         $this->info('Successfully imported ' . $cityCount . ' entries!');
         $this->info('Successfully imported ' . $cityCount . ' entries!');
         $this->line('');
         $this->line('');
-        ini_set('memory_limit', $old_memory_limit);
         return;
         return;
     }
     }
 
 

+ 1 - 1
app/Console/Commands/TransformImports.php

@@ -103,7 +103,7 @@ class TransformImports extends Command
                 continue;
                 continue;
             }
             }
 
 
-            $caption = $ip->caption;
+            $caption = $ip->caption ?? "";
             $status = new Status;
             $status = new Status;
             $status->profile_id = $pid;
             $status->profile_id = $pid;
             $status->caption = $caption;
             $status->caption = $caption;

+ 32 - 5
package-lock.json

@@ -44,7 +44,7 @@
 				"vue-loading-overlay": "^3.3.3",
 				"vue-loading-overlay": "^3.3.3",
 				"vue-timeago": "^5.1.2",
 				"vue-timeago": "^5.1.2",
 				"vue-tribute": "^1.0.7",
 				"vue-tribute": "^1.0.7",
-				"webgl-media-editor": "^0.0.1",
+				"webgl-media-editor": "^0.0.6",
 				"zuck.js": "^1.6.0"
 				"zuck.js": "^1.6.0"
 			},
 			},
 			"devDependencies": {
 			"devDependencies": {
@@ -2323,6 +2323,12 @@
 				"m3u8-parser": "~4.7.1"
 				"m3u8-parser": "~4.7.1"
 			}
 			}
 		},
 		},
+		"node_modules/@reactively/core": {
+			"version": "0.0.8",
+			"resolved": "https://registry.npmjs.org/@reactively/core/-/core-0.0.8.tgz",
+			"integrity": "sha512-5uAnNf2gQSm3gM7z6Lx079H1/MuDQQI+5aYfwyDFGR9nHZj8yblLY/6aOJVWp+NcBwXVBKuWQ28qWHD9F1qN1w==",
+			"license": "ISC"
+		},
 		"node_modules/@thaunknown/simple-peer": {
 		"node_modules/@thaunknown/simple-peer": {
 			"version": "10.0.11",
 			"version": "10.0.11",
 			"resolved": "https://registry.npmjs.org/@thaunknown/simple-peer/-/simple-peer-10.0.11.tgz",
 			"resolved": "https://registry.npmjs.org/@thaunknown/simple-peer/-/simple-peer-10.0.11.tgz",
@@ -5645,6 +5651,15 @@
 				"node": ">=8"
 				"node": ">=8"
 			}
 			}
 		},
 		},
+		"node_modules/fine-jsx": {
+			"version": "0.0.5",
+			"resolved": "https://registry.npmjs.org/fine-jsx/-/fine-jsx-0.0.5.tgz",
+			"integrity": "sha512-UKQ0ymyZnA605yf7np/wAv3iTs6i9oRKgyYmz+dX+F3VanYEBr60zRQ+WPcYzXMtl9NghNxT736qHfDBjoXVDg==",
+			"license": "AGPL-3.0-only",
+			"dependencies": {
+				"@reactively/core": "^0.0.8"
+			}
+		},
 		"node_modules/fizzy-ui-utils": {
 		"node_modules/fizzy-ui-utils": {
 			"version": "2.0.7",
 			"version": "2.0.7",
 			"resolved": "https://registry.npmjs.org/fizzy-ui-utils/-/fizzy-ui-utils-2.0.7.tgz",
 			"resolved": "https://registry.npmjs.org/fizzy-ui-utils/-/fizzy-ui-utils-2.0.7.tgz",
@@ -10749,16 +10764,28 @@
 				"node": ">= 8"
 				"node": ">= 8"
 			}
 			}
 		},
 		},
+		"node_modules/webgl-effects": {
+			"version": "0.0.3",
+			"resolved": "https://registry.npmjs.org/webgl-effects/-/webgl-effects-0.0.3.tgz",
+			"integrity": "sha512-P+qxcO0QyydUnHHwnsge2ckou85Pnsdgn0BKAjrhD9LiPFz5i2hq8rT8AdS7wNdXrXyqlM1Y0id+AB0gKTDtpQ==",
+			"license": "AGPL-3.0-only",
+			"dependencies": {
+				"gl-matrix": "^3.4.3",
+				"twgl.js": "^5.5.4"
+			}
+		},
 		"node_modules/webgl-media-editor": {
 		"node_modules/webgl-media-editor": {
-			"version": "0.0.1",
-			"resolved": "https://registry.npmjs.org/webgl-media-editor/-/webgl-media-editor-0.0.1.tgz",
-			"integrity": "sha512-TxnuRl3rpWa1Cia/pn+vh+0iz3yDNwzsrnRGJ61YkdZAYuimu2afBivSHv0RK73hKza6Y/YoRCkuEcsFmtxPNw==",
+			"version": "0.0.6",
+			"resolved": "https://registry.npmjs.org/webgl-media-editor/-/webgl-media-editor-0.0.6.tgz",
+			"integrity": "sha512-hqpIY+a+ay3QzXKECC4pFSHS0dVogV3GlBWzuSwBzEeGZcs7MeEYxLhFdqUa1D2xFtNnXb0pAo+1lCndYDKP2A==",
 			"license": "AGPL-3.0-only",
 			"license": "AGPL-3.0-only",
 			"dependencies": {
 			"dependencies": {
 				"cropperjs": "^1.6.2",
 				"cropperjs": "^1.6.2",
+				"fine-jsx": "^0.0.5",
 				"gl-matrix": "^3.4.3",
 				"gl-matrix": "^3.4.3",
 				"throttle-debounce": "^5.0.2",
 				"throttle-debounce": "^5.0.2",
-				"twgl.js": "^5.5.4"
+				"twgl.js": "^5.5.4",
+				"webgl-effects": "^0.0.3"
 			}
 			}
 		},
 		},
 		"node_modules/webidl-conversions": {
 		"node_modules/webidl-conversions": {

+ 1 - 1
package.json

@@ -71,7 +71,7 @@
 		"vue-loading-overlay": "^3.3.3",
 		"vue-loading-overlay": "^3.3.3",
 		"vue-timeago": "^5.1.2",
 		"vue-timeago": "^5.1.2",
 		"vue-tribute": "^1.0.7",
 		"vue-tribute": "^1.0.7",
-		"webgl-media-editor": "^0.0.1",
+		"webgl-media-editor": "^0.0.6",
 		"zuck.js": "^1.6.0"
 		"zuck.js": "^1.6.0"
 	},
 	},
 	"collective": {
 	"collective": {

+ 58 - 21
resources/assets/js/components/ComposeModal.vue

@@ -1015,19 +1015,29 @@ export default {
 	},
 	},
 
 
     created() {
     created() {
-        this.editor = new MediaEditor({
-            effects: filterEffects,
-		    onEdit: (index, {effect, intensity, crop}) => {
-			    if (index >= this.files.length) return
-			    const file = this.files[index]
-
-			    this.$set(file, 'editState', { effect, intensity, crop })
-		    },
-		    onRenderPreview: (sourceIndex, previewUrl) => {
-				const media = this.media[sourceIndex]
-				if (media) media.preview_url = previewUrl
-		    },
-        })
+        try {
+            this.editor = new MediaEditor({
+                effects: filterEffects,
+                onEdit: (sourceIndex, {effect, intensity, crop}) => {
+                    if (sourceIndex >= this.files.length) return
+                    const file = this.files[sourceIndex]
+
+                    this.$set(file, 'editState', { effect, intensity, crop })
+                },
+                onRenderPreview: (sourceIndex, previewUrl) => {
+                    if (sourceIndex >= this.files.length) return
+                    const file = this.files[sourceIndex]
+                    const { editState } = file
+                    const media = this.media[sourceIndex]
+
+                    // If the image was edited, use the preview image from the editor.
+                    if (editState && (editState.crop || editState.effect !== -1)) media.preview_url = previewUrl
+                    // When no edits are applied, use the original media URL.
+                    // This limits broken previews with firefox's resistFingerprinting setting.
+                    else media.preview_url = media.url
+                },
+            })
+        } catch {}
     },
     },
 
 
 	computed: {
 	computed: {
@@ -1054,8 +1064,9 @@ export default {
 	},
 	},
 
 
 	destroyed() {
 	destroyed() {
-		this.files.forEach(fileInfo => {
-            URL.revokeObjectURL(fileInfo.url);
+		this.media.forEach(media => {
+            URL.revokeObjectURL(media.url);
+            URL.revokeObjectURL(media.preview_url);
         })
         })
 		this.files.length = this.media.length = 0
 		this.files.length = this.media.length = 0
 		this.editor = undefined
 		this.editor = undefined
@@ -1161,7 +1172,7 @@ export default {
 
 
                 const type = file.type.replace(/\/.*/, '')
                 const type = file.type.replace(/\/.*/, '')
 				const url = URL.createObjectURL(file)
 				const url = URL.createObjectURL(file)
-                const preview_url = type === 'image' ? url : '/storage/no-preview.png'
+                const preview_url = type === 'image' ? URL.createObjectURL(file) : '/storage/no-preview.png'
 
 
 				this.files.push({ file, editState: undefined })
 				this.files.push({ file, editState: undefined })
 				this.media.push({ url, preview_url, type })
 				this.media.push({ url, preview_url, type })
@@ -1182,7 +1193,16 @@ export default {
 				const media = this.media[i]
 				const media = this.media[i]
 
 
 				if (media.type === 'image' && fileInfo.editState) {
 				if (media.type === 'image' && fileInfo.editState) {
-					file = await this.editor.toBlob(i)
+                    const { editState, cropperBlob } = fileInfo
+
+                    // If the WebGL editor is supported by the browser, apply the edits and use the resulting blob
+                    if (this.editor && (editState.effect !== -1 || !!editState.crop)) {
+					    file = await this.editor.toBlob(i)
+                    }
+                    // Otherwise, only the cropped result from cropper.js may be used
+                    else if (cropperBlob) {
+                        file = cropperBlob
+                    }
 				}
 				}
 
 
 				let form = new FormData();
 				let form = new FormData();
@@ -1555,12 +1575,29 @@ export default {
 				break;
 				break;
 
 
 				case 'cropPhoto':
 				case 'cropPhoto':
-                    const { editState } = this.files[this.carouselCursor]
+                    const file = this.files[this.carouselCursor]
+                    const { cropper } = this.$refs
+
+                    // update the file state in this vue component
                     const croppedState = {
                     const croppedState = {
-                        ...editState,
-                        crop: this.$refs.cropper.getData()
+                        ...file.editState,
+                        crop: cropper.getData()
+                    }
+
+                    if (this.editor) {
+                        // also update the file state in the WebGL editor
+                        this.editor.setEditState(this.carouselCursor, croppedState)
+                    } else {
+                        // if the browser can't run the WebGL editor, get the cropped image from cropper.js
+                         cropper.getCroppedCanvas().toBlob((blob) => {
+                            const { media } = this.media[this.carouselCursor]
+
+                            file.croppedBlob = blob
+                            URL.revokeObjectURL(media.preview_url)
+                            media.preview_url = URL.createObjectURL(blob)
+                        })
                     }
                     }
-                    this.editor.setEditState(this.carouselCursor, croppedState)
+
 					this.page = 2;
 					this.page = 2;
 				break;
 				break;
 
 

+ 2 - 2
resources/lang/es/auth.php

@@ -13,7 +13,7 @@ return [
     |
     |
     */
     */
 
 
-    'failed'   => 'Los datos introducidos no son válidos.',
-    'throttle' => 'Demasiados intentos de iniciar sesión. Por favor, inténtalo de nuevo en :seconds segundos.',
+    'failed'   => 'Los datos introducidos no son válidos.',
+    'throttle' => 'Demasiados intentos de iniciar sesión. Por favor, inténtalo de nuevo en :seconds segundos.',
 
 
 ];
 ];

+ 11 - 0
resources/lang/es/exception.php

@@ -0,0 +1,11 @@
+<?php
+
+return [
+
+	'compose' => [
+		'invalid' => [
+			'album' => 'Debe contener solo una foto o video, o multiples.',
+		],
+	],
+
+];

+ 5 - 2
resources/lang/es/notification.php

@@ -2,7 +2,10 @@
 
 
 return [
 return [
 
 
-  'likedPhoto'          => 'le gustó tu foto.',
+  'likedPhoto'          => 'le gustó tu foto.',  
+  'likedComment'        => 'le gustó tu comentario.',
   'startedFollowingYou' => 'empezó a seguirte.',
   'startedFollowingYou' => 'empezó a seguirte.',
-
+  'commented'           => 'comentó tu foto.',
+  'mentionedYou'        => 'te menciono.',
+  'shared'				=> 'compartir tu foto.',
 ];
 ];

+ 74 - 74
resources/lang/fi/web.php

@@ -3,7 +3,7 @@
 return [
 return [
 
 
 	'common' => [
 	'common' => [
-		'comment' => 'Kommentti',
+		'comment' => 'Kommentoi',
 		'commented' => 'Kommentoitu',
 		'commented' => 'Kommentoitu',
 		'comments' => 'Kommentit',
 		'comments' => 'Kommentit',
 		'like' => 'Tykkää',
 		'like' => 'Tykkää',
@@ -13,7 +13,7 @@ return [
 		'shared' => 'Jaettu',
 		'shared' => 'Jaettu',
 		'shares' => 'Jaot',
 		'shares' => 'Jaot',
 		'unshare' => 'Peru jakaminen',
 		'unshare' => 'Peru jakaminen',
-		'bookmark' => 'Bookmark',
+		'bookmark' => 'Kirjanmerkki',
 
 
 		'cancel' => 'Peruuta',
 		'cancel' => 'Peruuta',
 		'copyLink' => 'Kopioi linkki',
 		'copyLink' => 'Kopioi linkki',
@@ -24,10 +24,10 @@ return [
 		'other' => 'Muu',
 		'other' => 'Muu',
 		'readMore' => 'Lue lisää',
 		'readMore' => 'Lue lisää',
 		'success' => 'Onnistui',
 		'success' => 'Onnistui',
-		'proceed' => 'Proceed',
-		'next' => 'Next',
-		'close' => 'Close',
-		'clickHere' => 'click here',
+		'proceed' => 'Jatka',
+		'next' => 'Seuraava',
+		'close' => 'Sulje',
+		'clickHere' => 'klikkaa tästä',
 
 
 		'sensitive' => 'Sensitiivinen',
 		'sensitive' => 'Sensitiivinen',
 		'sensitiveContent' => 'Sensitiivinen sisältö',
 		'sensitiveContent' => 'Sensitiivinen sisältö',
@@ -82,71 +82,71 @@ return [
 	'notifications' => [
 	'notifications' => [
 		'liked' => 'tykkäsi sinun',
 		'liked' => 'tykkäsi sinun',
 		'commented' => 'kommentoi sinun',
 		'commented' => 'kommentoi sinun',
-		'reacted' => 'reacted to your',
-		'shared' => 'shared your',
-		'tagged' => 'tagged you in a',
-
-		'updatedA' => 'updated a',
-		'sentA' => 'sent a',
-
-		'followed' => 'followed',
-		'mentioned' => 'mentioned',
-		'you' => 'you',
-
-		'yourApplication' => 'Your application to join',
-		'applicationApproved' => 'was approved!',
-		'applicationRejected' => 'was rejected. You can re-apply to join in 6 months.',
-
-		'dm' => 'dm',
-		'groupPost' => 'group post',
-		'modlog' => 'modlog',
-		'post' => 'post',
-		'story' => 'story',
-		'noneFound' => 'No notifications found',
+		'reacted' => 'reagoi sinun',
+		'shared' => 'jakoi sinun',
+		'tagged' => 'merkitsi sinut',
+
+		'updatedA' => 'päivitetty',
+		'sentA' => 'lähetti',
+
+		'followed' => 'seuraa',
+		'mentioned' => 'mainittu',
+		'you' => 'sinä',
+
+		'yourApplication' => 'Liittymistä koskeva hakemuksesi',
+		'applicationApproved' => 'oli hyväksytty!',
+		'applicationRejected' => 'oli hylätty. Voit hakea uudelleen 6 kuukauden kuluttua.',
+
+		'dm' => 'yv',
+		'groupPost' => 'ryhmäviesti',
+		'modlog' => 'modelogi',
+		'post' => 'viesti',
+		'story' => 'tarina',
+		'noneFound' => 'Ilmoituksia ei löytynyt',
 	],
 	],
 
 
 	'post' => [
 	'post' => [
-		'shareToFollowers' => 'Share to followers',
-		'shareToOther' => 'Share to other',
-		'noLikes' => 'No likes yet',
-		'uploading' => 'Uploading',
+		'shareToFollowers' => 'Jaa seuraajille',
+		'shareToOther' => 'Jaa muille',
+		'noLikes' => 'Tykkäyksiä ei ole vielä',
+		'uploading' => 'Siirretään',
 	],
 	],
 
 
 	'profile' => [
 	'profile' => [
-		'posts' => 'Posts',
-		'followers' => 'Followers',
-		'following' => 'Following',
-		'admin' => 'Admin',
-		'collections' => 'Collections',
-		'follow' => 'Follow',
-		'unfollow' => 'Unfollow',
-		'editProfile' => 'Edit Profile',
-		'followRequested' => 'Follow Requested',
-		'joined' => 'Joined',
-
-		'emptyCollections' => 'We can\'t seem to find any collections',
-		'emptyPosts' => 'We can\'t seem to find any posts',
+		'posts' => 'Julkaisut',
+		'followers' => 'Seuraajat',
+		'following' => 'Seurataan',
+		'admin' => 'Ylläpitäjä',
+		'collections' => 'Kokoelmat',
+		'follow' => 'Seuraa',
+		'unfollow' => 'Lopeta seuraaminen',
+		'editProfile' => 'Muokkaa profiilia',
+		'followRequested' => 'Seuraamista pyydetty',
+		'joined' => 'Liittynyt',
+
+		'emptyCollections' => 'Emme näytä löytävän yhtään kokoelmaa',
+		'emptyPosts' => 'Emme näytä löytävän yhtään viestiä',
 	],
 	],
 
 
 	'menu' => [
 	'menu' => [
-		'viewPost' => 'View Post',
-		'viewProfile' => 'View Profile',
-		'moderationTools' => 'Moderation Tools',
-		'report' => 'Report',
-		'archive' => 'Archive',
-		'unarchive' => 'Unarchive',
-		'embed' => 'Embed',
-
-		'selectOneOption' => 'Select one of the following options',
-		'unlistFromTimelines' => 'Unlist from Timelines',
-		'addCW' => 'Add Content Warning',
-		'removeCW' => 'Remove Content Warning',
-		'markAsSpammer' => 'Mark as Spammer',
-		'markAsSpammerText' => 'Unlist + CW existing and future posts',
-		'spam' => 'Spam',
-		'sensitive' => 'Sensitive Content',
-		'abusive' => 'Abusive or Harmful',
-		'underageAccount' => 'Underage Account',
+		'viewPost' => 'Näytä viesti',
+		'viewProfile' => 'Näytä profiili',
+		'moderationTools' => 'Moderointityökalut',
+		'report' => 'Ilmoita',
+		'archive' => 'Arkisto',
+		'unarchive' => 'Palauta arkistosta',
+		'embed' => 'Upota',
+
+		'selectOneOption' => 'Valitse yksi seuraavista vaihtoehdoista',
+		'unlistFromTimelines' => 'Poista aikajanalta',
+		'addCW' => 'Lisää sisältövaroitus',
+		'removeCW' => 'Poista sisältövaroitus',
+		'markAsSpammer' => 'Merkitse roskapostittajaksi',
+		'markAsSpammerText' => 'Unlist + SV olevat ja tulevat julkaisut',
+		'spam' => 'Roskaposti',
+		'sensitive' => 'Arkaluonteista sisältöä',
+		'abusive' => 'Hyökkäävä tai haitallinen',
+		'underageAccount' => 'Alaikäisen tili',
 		'copyrightInfringement' => 'Tekijänoikeusloukkaus',
 		'copyrightInfringement' => 'Tekijänoikeusloukkaus',
 		'impersonation' => 'Väärennetty henkilöllisyys',
 		'impersonation' => 'Väärennetty henkilöllisyys',
 		'scamOrFraud' => 'Huijaus tai petos',
 		'scamOrFraud' => 'Huijaus tai petos',
@@ -182,27 +182,27 @@ return [
 	],
 	],
 
 
 	'timeline' => [
 	'timeline' => [
-		'peopleYouMayKnow' => 'People you may know',
+		'peopleYouMayKnow' => 'Ihmisiä, jotka saatat tuntea',
 
 
 		'onboarding' => [
 		'onboarding' => [
-			'welcome' => 'Welcome',
-			'thisIsYourHomeFeed' => 'This is your home feed, a chronological feed of posts from accounts you follow.',
-			'letUsHelpYouFind' => 'Let us help you find some interesting people to follow',
-			'refreshFeed' => 'Refresh my feed',
+			'welcome' => 'Tervetuloa',
+			'thisIsYourHomeFeed' => 'Tämä on kotisyötteesi. Aikajärjestyksessä oleva syöte seuraamiesi käyttäjien julkaisuista.',
+			'letUsHelpYouFind' => 'Anna meidän auttaa löytämään mielenkiintoisia ihmisiä seurattavaksi',
+			'refreshFeed' => 'Päivitä syötteeni',
 		],
 		],
 	],
 	],
 
 
 	'hashtags' => [
 	'hashtags' => [
-		'emptyFeed' => 'We can\'t seem to find any posts for this hashtag'
+		'emptyFeed' => 'Emme näytä löytävän yhtään viestiä tälle aihetunnisteelle'
 	],
 	],
 
 
 	'report' => [
 	'report' => [
-		'report' => 'Report',
-		'selectReason' => 'Select a reason',
-		'reported' => 'Reported',
-		'sendingReport' => 'Sending report',
-		'thanksMsg' => 'Thanks for the report, people like you help keep our community safe!',
-		'contactAdminMsg' => 'If you\'d like to contact an administrator about this post or report',
+		'report' => 'Ilmoita',
+		'selectReason' => 'Valitse syy',
+		'reported' => 'Ilmoitettu',
+		'sendingReport' => 'Lähetetään ilmoitusta',
+		'thanksMsg' => 'Kiitos ilmoituksesta. Sinä ja kaltaisesi autatte pitämään yhteisön turvallisena!',
+		'contactAdminMsg' => 'Jos haluaisit ottaa yhteyttä ylläpitoom tästä julkaisusta tai ilmoittaa sen',
 	],
 	],
 
 
 ];
 ];

+ 4 - 4
resources/lang/hu/web.php

@@ -44,7 +44,7 @@ return [
 		'admin' => 'Admin irányítópult',
 		'admin' => 'Admin irányítópult',
 
 
 		// Timelines
 		// Timelines
-		'homeFeed' => 'Kezdőlap',
+		'homeFeed' => 'Saját idővonal',
 		'localFeed' => 'Helyi idővonal',
 		'localFeed' => 'Helyi idővonal',
 		'globalFeed' => 'Globális idővonal',
 		'globalFeed' => 'Globális idővonal',
 
 
@@ -63,7 +63,7 @@ return [
 		'logout' => 'Kijelentkezés',
 		'logout' => 'Kijelentkezés',
 
 
 		// Nav footer
 		// Nav footer
-		'about' => 'Rólunk',
+		'about' => 'Névjegy',
 		'help' => 'Súgó',
 		'help' => 'Súgó',
 		'language' => 'Nyelv',
 		'language' => 'Nyelv',
 		'privacy' => 'Adatvédelem',
 		'privacy' => 'Adatvédelem',
@@ -186,9 +186,9 @@ return [
 
 
 		'onboarding' => [
 		'onboarding' => [
 			'welcome' => 'Üdvözöljük',
 			'welcome' => 'Üdvözöljük',
-			'thisIsYourHomeFeed' => 'Ez a kezdőlap, az Ön által követett fiókok bejegyzései időrendi sorrendben.',
+			'thisIsYourHomeFeed' => 'Ez a saját idővonala, az Ön által követett fiókok bejegyzései időrendi sorrendben.',
 			'letUsHelpYouFind' => 'Keressünk érdekes, követhető embereket',
 			'letUsHelpYouFind' => 'Keressünk érdekes, követhető embereket',
-			'refreshFeed' => 'Kezdőlap frissítése',
+			'refreshFeed' => 'Idővonal frissítése',
 		],
 		],
 	],
 	],
 
 

+ 54 - 54
resources/lang/pt/web.php

@@ -19,48 +19,48 @@ return [
 		'copyLink' => 'Copiar link',
 		'copyLink' => 'Copiar link',
 		'delete' => 'Eliminar',
 		'delete' => 'Eliminar',
 		'error' => 'Erro',
 		'error' => 'Erro',
-		'errorMsg' => 'Algo correu mal. Por favor, tente novamente mais tarde.',
-		'oops' => 'Opa!',
+		'errorMsg' => 'Algo correu mal. Tenta novamente mais tarde.',
+		'oops' => 'Oops!',
 		'other' => 'Outro',
 		'other' => 'Outro',
 		'readMore' => 'Ler mais',
 		'readMore' => 'Ler mais',
 		'success' => 'Sucesso',
 		'success' => 'Sucesso',
 		'proceed' => 'Continuar',
 		'proceed' => 'Continuar',
 		'next' => 'Seguinte',
 		'next' => 'Seguinte',
 		'close' => 'Fechar',
 		'close' => 'Fechar',
-		'clickHere' => 'clique aqui',
+		'clickHere' => 'clica aqui',
 
 
 		'sensitive' => 'Sensível',
 		'sensitive' => 'Sensível',
 		'sensitiveContent' => 'Conteúdo sensível',
 		'sensitiveContent' => 'Conteúdo sensível',
-		'sensitiveContentWarning' => 'Este post pode conter conteúdo sensível',
+		'sensitiveContentWarning' => 'Esta publicação pode conter conteúdo sensível',
 	],
 	],
 
 
 	'site' => [
 	'site' => [
-		'terms' => 'Termos de Uso',
+		'terms' => 'Termos de Utilização',
 		'privacy' => 'Política de Privacidade',
 		'privacy' => 'Política de Privacidade',
 	],
 	],
 
 
 	'navmenu' => [
 	'navmenu' => [
-		'search' => 'Pesquisa',
-		'admin' => 'Painel de Administração',
+		'search' => 'Pesquisar',
+		'admin' => 'Painel de administração',
 
 
 		// Timelines
 		// Timelines
-		'homeFeed' => 'Inicio',
+		'homeFeed' => 'Início',
 		'localFeed' => 'Feed local',
 		'localFeed' => 'Feed local',
 		'globalFeed' => 'Feed global',
 		'globalFeed' => 'Feed global',
 
 
 		// Core features
 		// Core features
 		'discover' => 'Descobrir',
 		'discover' => 'Descobrir',
-		'directMessages' => 'Mensagens Diretas',
+		'directMessages' => 'Mensagens diretas',
 		'notifications' => 'Notificações',
 		'notifications' => 'Notificações',
 		'groups' => 'Grupos',
 		'groups' => 'Grupos',
 		'stories' => 'Stories',
 		'stories' => 'Stories',
 
 
 		// Self links
 		// Self links
 		'profile' => 'Perfil',
 		'profile' => 'Perfil',
-		'drive' => 'Drive',
+		'drive' => 'Disco',
 		'settings' => 'Definições',
 		'settings' => 'Definições',
 		'compose' => 'Criar novo',
 		'compose' => 'Criar novo',
-		'logout' => 'Terminar Sessão',
+		'logout' => 'Terminar sessão',
 
 
 		// Nav footer
 		// Nav footer
 		'about' => 'Sobre',
 		'about' => 'Sobre',
@@ -70,38 +70,38 @@ return [
 		'terms' => 'Termos',
 		'terms' => 'Termos',
 
 
 		// Temporary links
 		// Temporary links
-		'backToPreviousDesign' => 'Voltar ao design anterior'
+		'backToPreviousDesign' => 'Voltar ao design antigo'
 	],
 	],
 
 
 	'directMessages' => [
 	'directMessages' => [
-		'inbox' => 'Caixa de Entrada',
+		'inbox' => 'Caixa de entrada',
 		'sent' => 'Enviadas',
 		'sent' => 'Enviadas',
 		'requests' => 'Pedidos'
 		'requests' => 'Pedidos'
 	],
 	],
 
 
 	'notifications' => [
 	'notifications' => [
-		'liked' => 'curtiu seu',
-		'commented' => 'comentou em seu',
+		'liked' => 'gostou do seu',
+		'commented' => 'comentou no seu',
 		'reacted' => 'reagiu ao seu',
 		'reacted' => 'reagiu ao seu',
-		'shared' => 'compartilhou seu',
-		'tagged' => 'marcou você em um',
+		'shared' => 'partilhou o teu',
+		'tagged' => 'etiquetou-te numa publicação',
 
 
-		'updatedA' => 'atualizou um(a)',
-		'sentA' => 'enviou um',
+		'updatedA' => 'atualizou uma',
+		'sentA' => 'enviou uma',
 
 
-		'followed' => 'seguiu',
-		'mentioned' => 'mencionou',
-		'you' => 'você',
+		'followed' => 'seguiu-te',
+		'mentioned' => 'mencionou-te',
+		'you' => 'tu',
 
 
-		'yourApplication' => 'A sua candidatura para se juntar',
+		'yourApplication' => 'O teu pedido de adesão',
 		'applicationApproved' => 'foi aprovado!',
 		'applicationApproved' => 'foi aprovado!',
-		'applicationRejected' => 'foi rejeitado. Você pode se inscrever novamente para participar em 6 meses.',
+		'applicationRejected' => 'foi rejeitado. Podes voltar a candidatar-te dentro de 6 meses.',
 
 
-		'dm' => 'mensagem direta',
-		'groupPost' => 'postagem do grupo',
+		'dm' => 'md',
+		'groupPost' => 'publicação de grupo',
 		'modlog' => 'histórico de moderação',
 		'modlog' => 'histórico de moderação',
 		'post' => 'publicação',
 		'post' => 'publicação',
-		'story' => 'história',
+		'story' => 'estória',
 		'noneFound' => 'Nenhuma notificação encontrada',
 		'noneFound' => 'Nenhuma notificação encontrada',
 	],
 	],
 
 
@@ -115,12 +115,12 @@ return [
 	'profile' => [
 	'profile' => [
 		'posts' => 'Publicações',
 		'posts' => 'Publicações',
 		'followers' => 'Seguidores',
 		'followers' => 'Seguidores',
-		'following' => 'A seguir',
+		'following' => 'Seguindo',
 		'admin' => 'Administrador',
 		'admin' => 'Administrador',
 		'collections' => 'Coleções',
 		'collections' => 'Coleções',
 		'follow' => 'Seguir',
 		'follow' => 'Seguir',
 		'unfollow' => 'Deixar de seguir',
 		'unfollow' => 'Deixar de seguir',
-		'editProfile' => 'Editar Perfil',
+		'editProfile' => 'Editar perfil',
 		'followRequested' => 'Pedido para seguir enviado',
 		'followRequested' => 'Pedido para seguir enviado',
 		'joined' => 'Juntou-se',
 		'joined' => 'Juntou-se',
 
 
@@ -137,72 +137,72 @@ return [
 		'unarchive' => 'Retirar do arquivo',
 		'unarchive' => 'Retirar do arquivo',
 		'embed' => 'Incorporar',
 		'embed' => 'Incorporar',
 
 
-		'selectOneOption' => 'Selecione uma das seguintes opções',
+		'selectOneOption' => 'Seleciona uma das seguintes opções',
 		'unlistFromTimelines' => 'Remover das cronologias',
 		'unlistFromTimelines' => 'Remover das cronologias',
 		'addCW' => 'Adicionar aviso de conteúdo',
 		'addCW' => 'Adicionar aviso de conteúdo',
 		'removeCW' => 'Remover aviso de conteúdo',
 		'removeCW' => 'Remover aviso de conteúdo',
-		'markAsSpammer' => 'Marcar como Spammer',
+		'markAsSpammer' => 'Marcar como spammer',
 		'markAsSpammerText' => 'Remover das cronologias e adicionar um aviso de conteúdo às publicações existentes e futuras',
 		'markAsSpammerText' => 'Remover das cronologias e adicionar um aviso de conteúdo às publicações existentes e futuras',
-		'spam' => 'Lixo Eletrônico',
-		'sensitive' => 'Conteúdo Sensível',
+		'spam' => 'Spam',
+		'sensitive' => 'Conteúdo sensível',
 		'abusive' => 'Abusivo ou prejudicial',
 		'abusive' => 'Abusivo ou prejudicial',
 		'underageAccount' => 'Conta de menor de idade',
 		'underageAccount' => 'Conta de menor de idade',
 		'copyrightInfringement' => 'Violação de direitos de autor',
 		'copyrightInfringement' => 'Violação de direitos de autor',
 		'impersonation' => 'Roubo de identidade',
 		'impersonation' => 'Roubo de identidade',
 		'scamOrFraud' => 'Esquema ou fraude',
 		'scamOrFraud' => 'Esquema ou fraude',
 		'confirmReport' => 'Confirmar denúncia',
 		'confirmReport' => 'Confirmar denúncia',
-		'confirmReportText' => 'Tem a certeza que deseja denunciar esta mensagem?',
+		'confirmReportText' => 'Tens a certeza que desejas denunciar esta mensagem?',
 		'reportSent' => 'Denúncia enviada!',
 		'reportSent' => 'Denúncia enviada!',
-		'reportSentText' => 'Recebemos com sucesso a sua denúncia.',
+		'reportSentText' => 'Recebemos com sucesso a tua denúncia.',
 		'reportSentError' => 'Ocorreu um erro ao denunciar este conteúdo.',
 		'reportSentError' => 'Ocorreu um erro ao denunciar este conteúdo.',
 
 
-		'modAddCWConfirm' => 'Tem a certeza que pretende adicionar um aviso de conteúdo à publicação?',
-		'modCWSuccess' => 'Adicionou com sucesso um aviso de conteúdo',
-		'modRemoveCWConfirm' => 'Tem a certeza que pretende remover o aviso de conteúdo desta publicação?',
-		'modRemoveCWSuccess' => 'Removeu com sucesso o aviso de conteúdo',
+		'modAddCWConfirm' => 'Tens a certeza que pretendes adicionar um aviso de conteúdo à publicação?',
+		'modCWSuccess' => 'Adicionaste com sucesso um aviso de conteúdo',
+		'modRemoveCWConfirm' => 'Tens a certeza que pretendes remover o aviso de conteúdo desta publicação?',
+		'modRemoveCWSuccess' => 'Removeste com sucesso o aviso de conteúdo',
 		'modUnlistConfirm' => 'Tem a certeza que pretende deslistar este post?',
 		'modUnlistConfirm' => 'Tem a certeza que pretende deslistar este post?',
 		'modUnlistSuccess' => 'Deslistou com sucesso este post',
 		'modUnlistSuccess' => 'Deslistou com sucesso este post',
-		'modMarkAsSpammerConfirm' => 'Você realmente quer denunciar este usuário por spam? Todas as suas publicações anteriores e futuras serão marcadas com um aviso de conteúdo e removidas das linhas do tempo.',
+		'modMarkAsSpammerConfirm' => 'Tem a certeza que deseja marcar este utilizador como spammer? Todos os posts existentes e futuros serão deslistados da timeline e o alerta de conteúdo será aplicado.',
 		'modMarkAsSpammerSuccess' => 'Marcou com sucesso esta conta como spammer',
 		'modMarkAsSpammerSuccess' => 'Marcou com sucesso esta conta como spammer',
 
 
-		'toFollowers' => 'para seguidores',
+		'toFollowers' => 'para Seguidores',
 
 
 		'showCaption' => 'Mostar legenda',
 		'showCaption' => 'Mostar legenda',
-		'showLikes' => 'Mostrar Gostos',
+		'showLikes' => 'Mostrar gostos',
 		'compactMode' => 'Modo compacto',
 		'compactMode' => 'Modo compacto',
-		'embedConfirmText' => 'Ao usar de forma “embed”, você concorda com nossas',
+		'embedConfirmText' => 'Ao utilizar este conteúdo, concordas com:',
 
 
-		'deletePostConfirm' => 'Tem a certeza que pretende apagar esta publicação?',
-		'archivePostConfirm' => 'Tem a certeza que pretende arquivar esta publicação?',
+		'deletePostConfirm' => 'Tens a certeza que pretendes eliminar esta publicação?',
+		'archivePostConfirm' => 'Tens a certeza que pretendes arquivar esta publicação?',
 		'unarchivePostConfirm' => 'Tem a certeza que pretende desarquivar este post?',
 		'unarchivePostConfirm' => 'Tem a certeza que pretende desarquivar este post?',
 	],
 	],
 
 
 	'story' => [
 	'story' => [
-		'add' => 'Adicionar Story'
+		'add' => 'Adicionar Storie'
 	],
 	],
 
 
 	'timeline' => [
 	'timeline' => [
-		'peopleYouMayKnow' => 'Pessoas que talvez conheça',
+		'peopleYouMayKnow' => 'Pessoas que talvez conheças',
 
 
 		'onboarding' => [
 		'onboarding' => [
 			'welcome' => 'Bem-vindo',
 			'welcome' => 'Bem-vindo',
-			'thisIsYourHomeFeed' => 'Este é o seu feed pessoal, com publicações em ordem cronológica das contas que segue.',
-			'letUsHelpYouFind' => 'Deixe-nos ajudar a encontrar algumas pessoas interessantes para seguir',
-			'refreshFeed' => 'Atualizar o meu feed',
+			'thisIsYourHomeFeed' => 'Este é a tua cronologia inicial pessoal, com publicações em ordem cronológica das contas que segue.',
+			'letUsHelpYouFind' => 'Deixa-nos ajudar-te a encontrar algumas pessoas interessantes para seguires',
+			'refreshFeed' => 'Atualizar a minha cronologia',
 		],
 		],
 	],
 	],
 
 
 	'hashtags' => [
 	'hashtags' => [
-		'emptyFeed' => 'Não encontramos nenhuma publicação com esta hashtag'
+		'emptyFeed' => 'Não conseguimos encontrar publicações com essa hashtag'
 	],
 	],
 
 
 	'report' => [
 	'report' => [
 		'report' => 'Denunciar',
 		'report' => 'Denunciar',
-		'selectReason' => 'Selecione uma razão',
+		'selectReason' => 'Seleciona um motivo',
 		'reported' => 'Denunciado',
 		'reported' => 'Denunciado',
 		'sendingReport' => 'A enviar denúncia',
 		'sendingReport' => 'A enviar denúncia',
-		'thanksMsg' => 'Obrigado pela denúncia, pessoas como você ajudam a manter a nossa comunidade segura!',
-		'contactAdminMsg' => 'Se quiser entrar em contato com um administrador acerca desta publicação ou denúncia',
+		'thanksMsg' => 'Obrigado pela denúncia, as pessoas como tu ajudam a manter a nossa comunidade segura!',
+		'contactAdminMsg' => 'Se quiseres entrar em contacto com um administrador sobre esta publicação ou denúncia',
 	],
 	],
 
 
 ];
 ];

+ 18 - 18
resources/lang/ru/web.php

@@ -29,9 +29,9 @@ return [
 		'close' => 'Закрыть',
 		'close' => 'Закрыть',
 		'clickHere' => 'нажмите здесь',
 		'clickHere' => 'нажмите здесь',
 
 
-		'sensitive' => 'Чувствительный',
-		'sensitiveContent' => 'Чувствительный контент',
-		'sensitiveContentWarning' => 'Этот пост может содержать чувствительный контент',
+		'sensitive' => 'Вызывающий',
+		'sensitiveContent' => 'Вызывающее содержимое',
+		'sensitiveContentWarning' => 'Эта запись может содержать вызывающее содержимое',
 	],
 	],
 
 
 	'site' => [
 	'site' => [
@@ -98,9 +98,9 @@ return [
 		'applicationRejected' => 'было отклонено. Вы можете повторно подать заявку на регистрацию в течение 6 месяцев.',
 		'applicationRejected' => 'было отклонено. Вы можете повторно подать заявку на регистрацию в течение 6 месяцев.',
 
 
 		'dm' => 'сообщение',
 		'dm' => 'сообщение',
-		'groupPost' => 'пост в группе',
+		'groupPost' => 'запись в группе',
 		'modlog' => 'журнал модерации',
 		'modlog' => 'журнал модерации',
-		'post' => 'пост',
+		'post' => 'запись',
 		'story' => 'история',
 		'story' => 'история',
 		'noneFound' => 'Уведомления не найдены',
 		'noneFound' => 'Уведомления не найдены',
 	],
 	],
@@ -108,12 +108,12 @@ return [
 	'post' => [
 	'post' => [
 		'shareToFollowers' => 'Поделиться с подписчиками',
 		'shareToFollowers' => 'Поделиться с подписчиками',
 		'shareToOther' => 'Поделиться с другими',
 		'shareToOther' => 'Поделиться с другими',
-		'noLikes' => 'Пока никому не понравилось',
+		'noLikes' => 'Пока нет лайков',
 		'uploading' => 'Загружается',
 		'uploading' => 'Загружается',
 	],
 	],
 
 
 	'profile' => [
 	'profile' => [
-		'posts' => 'Посты',
+		'posts' => 'Записи',
 		'followers' => 'Подписчики',
 		'followers' => 'Подписчики',
 		'following' => 'Подписки',
 		'following' => 'Подписки',
 		'admin' => 'Администратор',
 		'admin' => 'Администратор',
@@ -129,7 +129,7 @@ return [
 	],
 	],
 
 
 	'menu' => [
 	'menu' => [
-		'viewPost' => 'Показать пост',
+		'viewPost' => 'Показать запись',
 		'viewProfile' => 'Посмотреть профиль',
 		'viewProfile' => 'Посмотреть профиль',
 		'moderationTools' => 'Инструменты модерации',
 		'moderationTools' => 'Инструменты модерации',
 		'report' => 'Пожаловаться',
 		'report' => 'Пожаловаться',
@@ -146,23 +146,23 @@ return [
 		'spam' => 'Спам',
 		'spam' => 'Спам',
 		'sensitive' => 'Деликатный контент',
 		'sensitive' => 'Деликатный контент',
 		'abusive' => 'Жестокое обращение или причинение вреда',
 		'abusive' => 'Жестокое обращение или причинение вреда',
-		'underageAccount' => 'Несовершеннолетний аккаунт',
+		'underageAccount' => 'Профиль несовершеннолетнего',
 		'copyrightInfringement' => 'Нарушение авторских прав',
 		'copyrightInfringement' => 'Нарушение авторских прав',
 		'impersonation' => 'Представление себя за другого человека',
 		'impersonation' => 'Представление себя за другого человека',
 		'scamOrFraud' => 'Обман или мошенничество',
 		'scamOrFraud' => 'Обман или мошенничество',
 		'confirmReport' => 'Подтвердить жалобу',
 		'confirmReport' => 'Подтвердить жалобу',
-		'confirmReportText' => 'Вы действительно хотите пожаловаться на этот пост?',
+		'confirmReportText' => 'Вы действительно хотите пожаловаться на эту запись?',
 		'reportSent' => 'Жалоба отправлена!',
 		'reportSent' => 'Жалоба отправлена!',
 		'reportSentText' => 'Мы успешно получили Вашу жалобу.',
 		'reportSentText' => 'Мы успешно получили Вашу жалобу.',
-		'reportSentError' => 'При отправке жалобы на этот пост произошла ошибка.',
+		'reportSentError' => 'При отправке жалобы на эту запись произошла ошибка.',
 
 
-		'modAddCWConfirm' => 'Вы действительно хотите добавить предупреждение о контенте на этот пост?',
+		'modAddCWConfirm' => 'Вы действительно хотите добавить предупреждение о содержимом на этой записи?',
 		'modCWSuccess' => 'Предупреждение о контенте успешно добавлено',
 		'modCWSuccess' => 'Предупреждение о контенте успешно добавлено',
-		'modRemoveCWConfirm' => 'Вы действительно хотите удалить предупреждение о контенте с этого поста?',
+		'modRemoveCWConfirm' => 'Вы действительно хотите удалить предупреждение о содержимом с этой записи?',
 		'modRemoveCWSuccess' => 'Предупреждение о контенте успешно удалено',
 		'modRemoveCWSuccess' => 'Предупреждение о контенте успешно удалено',
-		'modUnlistConfirm' => 'Вы действительно хотите скрыть этот пост из лент?',
-		'modUnlistSuccess' => 'Пост удален',
-		'modMarkAsSpammerConfirm' => 'Вы уверены, что хотите отметить этого пользователя спамом? Все существующие и будущие сообщения будут исключены из списка в сроки, и будет применяться предупреждение о содержании.',
+		'modUnlistConfirm' => 'Вы действительно хотите скрыть эту запись со всех лент?',
+		'modUnlistSuccess' => 'Запись скрыта',
+		'modMarkAsSpammerConfirm' => 'Вы уверены, что хотите отметить этого пользователя как спамера? Все существующие и будущие сообщения будут скрыты в лентах и будет применяться предупреждение о содержании.',
 		'modMarkAsSpammerSuccess' => 'Аккаунт успешно помечен как спаммер',
 		'modMarkAsSpammerSuccess' => 'Аккаунт успешно помечен как спаммер',
 
 
 		'toFollowers' => 'подписчикам',
 		'toFollowers' => 'подписчикам',
@@ -186,7 +186,7 @@ return [
 
 
 		'onboarding' => [
 		'onboarding' => [
 			'welcome' => 'Добро пожаловать',
 			'welcome' => 'Добро пожаловать',
-			'thisIsYourHomeFeed' => 'Это ваша домашняя лента, где хронологически собраны посты с аккаунтов, на которые вы подписаны.',
+			'thisIsYourHomeFeed' => 'Это ваша домашняя лента, где хронологически собраны записи от профилей на которые вы подписаны.',
 			'letUsHelpYouFind' => 'Давайте мы поможем вам найти интересных людей, на которых можно подписаться',
 			'letUsHelpYouFind' => 'Давайте мы поможем вам найти интересных людей, на которых можно подписаться',
 			'refreshFeed' => 'Обновить мою ленту',
 			'refreshFeed' => 'Обновить мою ленту',
 		],
 		],
@@ -202,7 +202,7 @@ return [
 		'reported' => 'Жалоба отправлена',
 		'reported' => 'Жалоба отправлена',
 		'sendingReport' => 'Отправка жалобы',
 		'sendingReport' => 'Отправка жалобы',
 		'thanksMsg' => 'Спасибо за обращение! Такие, как вы, помогают сделать сообщество безопаснее!',
 		'thanksMsg' => 'Спасибо за обращение! Такие, как вы, помогают сделать сообщество безопаснее!',
-		'contactAdminMsg' => 'Хотите ли вы связаться с администратором по поводу этой публикации или жалобы',
+		'contactAdminMsg' => 'Хотите ли вы связаться с администратором по поводу этой публикации или пожаловаться',
 	],
 	],
 
 
 ];
 ];

+ 914 - 879
resources/views/admin/diagnostics/home.blade.php

@@ -1,887 +1,922 @@
 @extends('admin.partial.template-full')
 @extends('admin.partial.template-full')
 
 
 @section('section')
 @section('section')
-<div class="title mb-4">
-	<h3 class="font-weight-bold">Diagnostics</h3>
 </div>
 </div>
-
-<div class="pb-3 border-bottom">
-	<p class="font-weight-bold text-muted">
-		Information
-		<span class="small text-primary ml-3 copy-information cursor-pointer text-uppercase font-weight-bold">Copy</span>
-	</p>
-
-	<div class="information">
-
-
-	<ul>
-		<p class="font-weight-bold text-muted">
-			Troubleshooting
-		</p>
-
-		<li>
-			<strong>Bootstrap:</strong>
-			<span>{{is_writable(base_path('bootstrap/')) ? 'Writable ✅' : 'Not writable ❌'}}</span>
-		</li>
-		<li>
-			<strong>Storage:</strong>
-			<span>{{is_writable(base_path('storage/')) ? 'Writable ✅' : 'Not writable ❌'}}</span>
-		</li>
-
-		@foreach([
-			'bcmath',
-			'gd',
-			'imagick',
-			'ctype',
-			'curl',
-			'intl',
-			'json',
-			'mbstring',
-			'openssl',
-			'redis'
-		] as $ext)
-			@if(!extension_loaded($ext))
-				<li>
-					<strong>PHP Module {{$ext}}:</strong>
-					<span>Not installed/Not loaded ❌</span>
-				</li>
-			@endif
-		@endforeach
-
-		<li>
-			<strong><span class="badge badge-primary">DATABASE</span> Ping:</strong>
-			<span>{{ \DB::connection()->getPDO() ? 'Pong! Connected to DB "' . \DB::connection()->getDatabaseName() . '" ✅' : 'DB Not Responding ❌' }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">REDIS</span> Ping:</strong>
-			<span>{{ \Illuminate\Support\Facades\Redis::command('ping') ? 'Pong! Connected to Redis ✅' : 'Redis Not Responding ❌' }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">ACTIVITYPUB</span> instance actor created: </strong>
-			<span>{{ \App\Models\InstanceActor::count() ? '✅ true' : '❌ false' }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">ACTIVITYPUB</span> instance actor cached: </strong>
-			<span>{{ Cache::get(\App\Models\InstanceActor::PROFILE_KEY) ? '✅ true' : '❌ false' }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">OAUTH</span> enabled: </strong>
-			<span>{{ (bool) config_cache('pixelfed.oauth_enabled') ? '✅ true' : '❌ false' }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">OAUTH</span> token_expiration</strong>
-			<span>{{ config_cache('instance.oauth.token_expiration') }} days</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">OAUTH</span> public key exists: </strong>
-			<span>{{ file_exists(storage_path('oauth-public.key')) || config_cache('passport.public_key') ? '✅ true' : '❌ false' }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">OAUTH</span> private key exists: </strong>
-			<span>{{ file_exists(storage_path('oauth-private.key')) || config_cache('passport.private_key') ? '✅ true' : '❌ false' }}</span>
-		</li>		
-		
-		<hr>
-		<p class="font-weight-bold text-muted">
-			Important Information
-		</p>
-
-
-		@if(function_exists('shell_exec'))
-			<li>
-				<strong>Version:</strong>
-				<span>{{config('pixelfed.version')}}-{{ @shell_exec('git log --pretty="%h" -n1 HEAD') ?? 'unknown git commit' }}</span>
-			</li>
-		@else
-			<li>
-				<strong>Version:</strong>
-				<span>{{config('pixelfed.version')}}</span>
-			</li>
-		@endif
-
-		<li>
-			<strong>Database:</strong>
-			@php($v = explode(' ', DB::select('select version() as version')[0]->version))
-			<span>{{config('database.default')}} ({{count($v) == 1 ? $v[0] : $v[1]}})</span>
-		</li>
-		<li>
-			<strong>APP_URL:</strong>
-			<span>{{config_cache('app.url')}}</span>
-		</li>
-		<li>
-			<strong>APP_DOMAIN:</strong>
-			<span>{{config_cache('pixelfed.domain.app')}}</span>
-		</li>
-		<li>
-			<strong>ADMIN_DOMAIN:</strong>
-			<span>{{config_cache('pixelfed.domain.admin')}}</span>
-		</li>
-		<li>
-			<strong>SESSION_DOMAIN:</strong>
-			<span>{{config_cache('session.domain')}}</span>
-		</li>
-
-		<hr>
-		<p class="font-weight-bold text-muted">
-			PHP Variables
-		</p>
-		<li>
-			<strong>PHP:</strong>
-			<span>{{phpversion()}}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI</span> memory_limit:</strong>
-			<span>{{ ini_get('memory_limit') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI</span> post_max_size:</strong>
-			<span>{{ ini_get('post_max_size') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI</span> upload_max_filesize:</strong>
-			<span>{{ ini_get('upload_max_filesize') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI</span> max_file_uploads:</strong>
-			<span>{{ ini_get('max_file_uploads') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI</span> max_execution_time:</strong>
-			<span>{{ ini_get('max_execution_time') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI</span> max_input_time:</strong>
-			<span>{{ ini_get('max_input_time') }}</span>
-		</li>
-
-		<li>
-			<strong><span class="badge badge-primary">PHP INI</span> file_uploads (On):</strong>
-			<span>{{ ini_get('file_uploads') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> allow_url_fopen (true):</strong>
-			<span>{{ ini_get('allow_url_fopen') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> allow_url_include (false):</strong>
-			<span>{{ ini_get('allow_url_include') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> expose_php (false):</strong>
-			<span>{{ ini_get('expose_php') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> display_errors (false):</strong>
-			<span>{{ ini_get('display_errors') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> display_startup_errors (false):</strong>
-			<span>{{ ini_get('display_startup_errors') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> log_errors (true):</strong>
-			<span>{{ ini_get('log_errors') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> ignore_repeated_errors (false):</strong>
-			<span>{{ ini_get('ignore_repeated_errors') }}</span>
-		</li>
-		<li>
-			<strong><span class="badge badge-primary">PHP INI - Security</span> disable_functions:</strong>
-			<span>{{ ini_get('disable_functions') }}</span>
-		</li>
-
-	<hr>
-	<p class="font-weight-bold text-muted">
-		Pixelfed Variables (No Secrets)
-	</p>
-	<table style="width:100%" class="table">
-	<thead class="bg-light">
-	<tr>
-		<th width="5%" scope="col" class="border-0 text-dark">CONFIG</th>
-		<th width="20%"scope="col" class="border-0 text-dark">Variable Name</th>
-		<th width="40%"scope="col" class="border-0 text-dark">Details</th>
-	</tr>
-	</thead>
-	<tbody>
-	<tr>
-		<td><span class="badge badge-primary">APP</span></td>
-		<td><strong>APP_NAME</strong></td>
-		<td><span>"{{config_cache('app.name')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">APP</span></td>
-		<td><strong>APP_ENV</strong></td>
-		<td><span>"{{config_cache('app.env')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">APP</span></td>
-		<td><strong>APP_DEBUG</strong></td>
-		<td><span>{{config_cache('app.debug') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">APP</span></td>
-		<td><strong>APP_URL</strong></td>
-		<td><span>"{{config_cache('app.url')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">APP</span></td>
-		<td><strong>APP_LOCALE</strong></td>
-		<td><span>"{{config_cache('app.locale')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">APP</span></td>
-		<td><strong>APP_FALLBACK_LOCALE</strong></td>
-		<td><span>"{{config_cache('app.fallback_locale')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">BROADCASTING</span></td>
-		<td><strong>BROADCAST_DRIVER</strong></td>
-		<td><span>"{{config_cache('broadcasting.default')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">CACHE</span></td>
-		<td><strong>CACHE_DRIVER</strong></td>
-		<td><span>"{{config_cache('cache.default')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">CAPTCHA</span></td>
-		<td><strong>CAPTCHA_ENABLED</strong></td>
-		<td><span>{{ config_cache('captcha.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">DATABASE</span></td>
-		<td><strong>DB_CONNECTION</strong></td>
-		<td><span>"{{config_cache('database.default')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">DATABASE</span></td>
-		<td><strong>REDIS_CLIENT</strong></td>
-		<td><span>"{{config_cache('database.redis.client')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">EXP</span></td>
-		<td><strong>EXP_LC</strong></td>
-		<td><span>{{config_cache('exp.lc') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">EXP</span></td>
-		<td><strong>EXP_TOP</strong></td>
-		<td><span>{{config_cache('exp.top') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">EXP</span></td>
-		<td><strong>EXP_POLLS</strong></td>
-		<td><span>{{config_cache('exp.polls') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">EXP</span></td>
-		<td><strong>EXP_CPT</strong></td>
-		<td><span>{{config_cache('exp.cached_public_timeline') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">EXP</span></td>
-		<td><strong>EXP_GPS</strong></td>
-		<td><span>{{config_cache('exp.gps') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">EXP</span></td>
-		<td><strong>EXP_EMC</strong></td>
-		<td><span>{{config_cache('exp.emc') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>ACTIVITY_PUB</strong></td>
-		<td><span>{{(bool) config_cache('federation.activitypub.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>AP_OUTBOX</strong></td>
-		<td><span>{{config_cache('federation.activitypub.outbox') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>AP_INBOX</strong></td>
-		<td><span>{{config_cache('federation.activitypub.inbox') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>AP_SHAREDINBOX</strong></td>
-		<td><span>{{config_cache('federation.activitypub.sharedInbox') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>AP_REMOTE_FOLLOW</strong></td>
-		<td><span>{{config_cache('federation.activitypub.remoteFollow') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>ACTIVITYPUB_DELIVERY_TIMEOUT</strong></td>
-		<td><span>"{{config_cache('federation.activitypub.delivery.timeout')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>ACTIVITYPUB_DELIVERY_CONCURRENCY</strong></td>
-		<td><span>"{{config_cache('federation.activitypub.delivery.concurrency')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>AP_LOGGER_ENABLED</strong></td>
-		<td><span>{{config_cache('federation.activitypub.delivery.logger.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>ATOM_FEEDS</strong></td>
-		<td><span>{{config_cache('federation.atom.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>REMOTE_AVATARS</strong></td>
-		<td><span>{{config_cache('federation.avatars.store_local') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>NODEINFO</strong></td>
-		<td><span>{{config_cache('federation.nodeinfo.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>WEBFINGER</strong></td>
-		<td><span>{{config_cache('federation.webfinger.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>PF_NETWORK_TIMELINE</strong></td>
-		<td><span>{{(bool) config_cache('federation.network_timeline') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>PF_NETWORK_TIMELINE_DAYS_FALLOFF</strong></td>
-		<td><span>{{config('federation.network_timeline_days_falloff') }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>CUSTOM_EMOJI</strong></td>
-		<td><span>{{(bool) config_cache('federation.custom_emoji.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FEDERATION</span></td>
-		<td><strong>CUSTOM_EMOJI_MAX_SIZE</strong></td>
-		<td><span>"{{config_cache('federation.custom_emoji.max_size')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">FILESYSTEMS</span></td>
-		<td><strong>FILESYSTEM_DRIVER</strong></td>
-		<td><span>"{{config_cache('filesystems.default')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">FILESYSTEMS</span></td>
-		<td><strong>FILESYSTEM_CLOUD</strong></td>
-		<td><span>"{{config_cache('filesystems.cloud')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">HASHING</span></td>
-		<td><strong>BCRYPT_COST</strong></td>
-		<td><span>"{{config_cache('hashing.bcrypt.rounds')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_PREFIX</strong></td>
-		<td><span>"{{config_cache('horizon.prefix')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_MEMORY_LIMIT</strong></td>
-		<td><span>"{{config_cache('horizon.memory_limit')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_BALANCE_STRATEGY</strong></td>
-		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.balance')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_MIN_PROCESSES</strong></td>
-		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.minProcesses')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_MAX_PROCESSES</strong></td>
-		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.maxProcesses')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_SUPERVISOR_MEMORY</strong></td>
-		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.memory')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_SUPERVISOR_TRIES</strong></td>
-		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.tries')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_SUPERVISOR_NICE</strong></td>
-		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.nice')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_SUPERVISOR_TIMEOUT</strong></td>
-		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.timeout')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">HORIZON</span></td>
-		<td><strong>HORIZON_DARKMODE</strong></td>
-		<td><span>{{config_cache('horizon.darkmode') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">IMAGE</span></td>
-		<td><strong>IMAGE_DRIVER </strong></td>
-		<td><span>"{{config_cache('image.driver')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_DESCRIPTION</strong></td>
-		<td><span>"{{config_cache('instance.description')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_CONTACT_FORM</strong></td>
-		<td><span>{{config_cache('instance.contact.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_CONTACT_MAX_PER_DAY</strong></td>
-		<td><span>"{{config_cache('instance.contact.max_per_day')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_DISCOVER_PUBLIC</strong></td>
-		<td><span>{{config_cache('instance.discover.public') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>EXP_LOOPS</strong></td>
-		<td><span>{{config_cache('instance.discover.loops.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_PUBLIC_HASHTAGS</strong></td>
-		<td><span>{{config_cache('instance.discover.tags.is_public') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_CONTACT_EMAIL</strong></td>
-		<td><span>"{{config_cache('instance.email')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_PUBLIC_LOCAL_TIMELINE</strong></td>
-		<td><span>{{config_cache('instance.timeline.local.is_public') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_NETWORK_TIMELINE_CACHED</strong></td>
-		<td><span>{{config('instance.timeline.network.cached') }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_NETWORK_TIMELINE_CACHE_DROPOFF</strong></td>
-		<td><span>{{config('instance.timeline.network.cache_dropoff') }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>INSTANCE_NETWORK_TIMELINE_CACHE_MAX_HOUR_INGEST</strong></td>
-		<td><span>{{config('instance.timeline.network.max_hours_old') }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>PAGE_404_HEADER</strong></td>
-		<td><span>"{{config_cache('instance.page.404.header')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>PAGE_404_BODY</strong></td>
-		<td><span>"{{config_cache('instance.page.404.body')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>PAGE_503_HEADER</strong></td>
-		<td><span>"{{config_cache('instance.page.503.header')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>PAGE_503_BODY</strong></td>
-		<td><span>"{{config_cache('instance.page.503.body')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>BANNED_USERNAMES</strong></td>
-		<td><span>"{{config_cache('instance.username.banned')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>USERNAME_REMOTE_FORMAT</strong></td>
-		<td><span>"{{config_cache('instance.username.remote.format')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>USERNAME_REMOTE_CUSTOM_TEXT</strong></td>
-		<td><span>"{{config_cache('instance.username.remote.custom')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>STORIES_ENABLED</strong></td>
-		<td><span>{{(bool) config_cache('instance.stories.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>RESTRICTED_INSTANCE</strong></td>
-		<td><span>{{config_cache('instance.restricted.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>OAUTH_TOKEN_DAYS</strong></td>
-		<td><span>"{{config_cache('instance.oauth.token_expiration')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>OAUTH_REFRESH_DAYS</strong></td>
-		<td><span>"{{config_cache('instance.oauth.refresh_expiration')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>OAUTH_PAT_ENABLED</strong></td>
-		<td><span>{{config_cache('instance.oauth.pat.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>OAUTH_PAT_ID</strong></td>
-		<td><span>"{{config_cache('instance.oauth.pat.id')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>ENABLE_COVID_LABEL</strong></td>
-		<td><span>{{config_cache('instance.label.covid.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>COVID_LABEL_URL</strong></td>
-		<td><span>"{{config_cache('instance.label.covid.url')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>COVID_LABEL_ORG</strong></td>
-		<td><span>"{{config_cache('instance.label.covid.org')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">INSTANCE</span></td>
-		<td><strong>ENABLE_CONFIG_CACHE</strong></td>
-		<td><span>{{config_cache('instance.enable_cc') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">LDAP</span></td>
-		<td><strong>LDAP_CONNECTION</strong></td>
-		<td><span>"{{config_cache('ldap.default')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">LDAP</span></td>
-		<td><strong>LDAP_LOGGING</strong></td>
-		<td><span>{{config_cache('ldap.logging') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">LDAP</span></td>
-		<td><strong>LDAP_CACHE</strong></td>
-		<td><span>{{config_cache('ldap.cache.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">LOGGING</span></td>
-		<td><strong>LOG_CHANNEL</strong></td>
-		<td><span>"{{config_cache('logging.default')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">LOGGING</span></td>
-		<td><strong>LOG_LEVEL (stack)</strong></td>
-		<td><span>"{{config_cache('logging.channels.single.level')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">MAIL</span></td>
-		<td><strong>MAIL_DRIVER</strong></td>
-		<td><span>"{{config_cache('mail.driver')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">MAIL</span></td>
-		<td><strong>MAIL_HOST</strong></td>
-		<td><span>"{{config_cache('mail.host')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">MAIL</span></td>
-		<td><strong>MAIL_PORT</strong></td>
-		<td><span>"{{config_cache('mail.port')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">MAIL</span></td>
-		<td><strong>MAIL_FROM_ADDRESS</strong></td>
-		<td><span>"{{config_cache('mail.from.address')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">MAIL</span></td>
-		<td><strong>MAIL_FROM_NAME</strong></td>
-		<td><span>"{{config_cache('mail.from.name')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">MAIL</span></td>
-		<td><strong>MAIL_ENCRYPTION</strong></td>
-		<td><span>"{{config_cache('mail.encryption')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">MEDIA</span></td>
-		<td><strong>MEDIA_EXIF_DATABASE</strong></td>
-		<td><span>{{config_cache('media.exif.database') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>ADMIN_DOMAIN</strong></td>
-		<td><span>"{{config_cache('pixelfed.domain.admin')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>APP_DOMAIN</strong></td>
-		<td><span>"{{config_cache('pixelfed.domain.app')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MEMORY_LIMIT</strong></td>
-		<td><span>"{{config_cache('pixelfed.memory_limit')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>OPEN_REGISTRATION</strong></td>
-		<td><span>{{config_cache('pixelfed.open_registration') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MAX_ACCOUNT_SIZE (KB)</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_account_size')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MAX_PHOTO_SIZE (KB)</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_photo_size')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MAX_AVATAR_SIZE (KB)</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_avatar_size')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MAX_CAPTION_LENGTH</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_caption_length')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MAX_BIO_LENGTH</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_bio_length')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MAX_NAME_LENGTH</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_name_length')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MIN_PASSWORD_LENGTH</strong></td>
-		<td><span>"{{config_cache('pixelfed.min_password_length')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MAX_ALBUM_LENGTH</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_album_length')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>ENFORCE_EMAIL_VERIFICATION</strong></td>
-		<td><span>{{config_cache('pixelfed.enforce_email_verification') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>IMAGE_QUALITY (1-100)</strong></td>
-		<td><span>"{{config_cache('pixelfed.image_quality')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>ACCOUNT_DELETION</strong></td>
-		<td><span>{{config_cache('pixelfed.account_deletion') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>ACCOUNT_DELETE_AFTER</strong></td>
-		<td><span>{{config_cache('pixelfed.account_delete_after') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_ENABLE_CLOUD</strong></td>
-		<td><span>{{(bool) config_cache('pixelfed.cloud_storage') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_MAX_USERS</strong></td>
-		<td><span>{{config_cache('pixelfed.max_users') ? config('pixelfed.max_users') : '❌ false'}}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_OPTIMIZE_IMAGES</strong></td>
-		<td><span>{{(bool) config_cache('pixelfed.optimize_image') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_OPTIMIZE_VIDEOS</strong></td>
-		<td><span>{{(bool) config_cache('pixelfed.optimize_video') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_USER_INVITES</strong></td>
-		<td><span>{{config_cache('pixelfed.user_invites.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_USER_INVITES_TOTAL_LIMIT</strong></td>
-		<td><span>"{{config_cache('pixelfed.user_invites.limit.total')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_USER_INVITES_DAILY_LIMIT</strong></td>
-		<td><span>"{{config_cache('pixelfed.user_invites.limit.daily')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_USER_INVITES_MONTHLY_LIMIT</strong></td>
-		<td><span>"{{config_cache('pixelfed.user_invites.limit.monthly')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_MAX_COLLECTION_LENGTH</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_collection_length')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>MEDIA_TYPES</strong></td>
-		<td><span>"{{config_cache('pixelfed.media_types')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>LIMIT_ACCOUNT_SIZE</strong></td>
-		<td><span>{{config_cache('pixelfed.enforce_account_limit') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>IMPORT_INSTAGRAM</strong></td>
-		<td><span>{{config_cache('pixelfed.import.instagram.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>IMPORT_INSTAGRAM_POST_LIMIT</strong></td>
-		<td><span>"{{config_cache('pixelfed.import.instagram.limits.posts')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>IMPORT_INSTAGRAM_SIZE_LIMIT</strong></td>
-		<td><span>"{{config_cache('pixelfed.import.instagram.limits.size')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>OAUTH_ENABLED</strong></td>
-		<td><span>{{ (bool) config_cache('pixelfed.oauth_enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_BOUNCER_ENABLED</strong></td>
-		<td><span>{{(bool) config_cache('pixelfed.bouncer.enabled') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_MEDIA_FAST_PROCESS</strong></td>
-		<td><span>{{config_cache('pixelfed.media_fast_process') ? '✅ true' : '❌ false' }}</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">PIXELFED</span></td>
-		<td><strong>PF_MEDIA_MAX_ALTTEXT_LENGTH</strong></td>
-		<td><span>"{{config_cache('pixelfed.max_altext_length')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">PURIFY</span></td>
-		<td><strong>RESTRICT_HTML_TYPES</strong></td>
-		<td><span>BROKEN</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">QUEUE</span></td>
-		<td><strong>QUEUE_DRIVER</strong></td>
-		<td><span>"{{config_cache('queue.default')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">SESSION</span></td>
-		<td><strong>SESSION_DRIVER</strong></td>
-		<td><span>"{{config_cache('session.driver')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">SESSION</span></td>
-		<td><strong>SESSION_LIFETIME</strong></td>
-		<td><span>"{{config_cache('session.lifetime')}}"</span></td>
-	</tr>
-	<tr>
-		<td><span class="badge badge-primary">SESSION</span></td>
-		<td><strong>SESSION_DOMAIN</strong></td>
-		<td><span>"{{config_cache('session.domain')}}"</span></td>
-	</tr>
-
-	<tr>
-		<td><span class="badge badge-primary">TRUSTEDPROXY</span></td>
-		<td><strong>TRUST_PROXIES</strong></td>
-		<td><span>"{{config_cache('trustedproxy.proxies')}}"</span></td>
-	</tr>
-      </tbody>
-      </table>
-  </div>
-  </ul>
-
+<div class="header bg-primary pb-3 mt-n4">
+    <div class="container-fluid">
+        <div class="header-body">
+            <div class="row align-items-center py-4">
+                <div class="col-12 col-lg-4">
+                    <p class="display-1 text-white d-inline-block mb-0">Diagnostics</p>
+                </div>
+                <div class="col-12 col-lg-8 d-flex flex-column flex-md-row pt-3 pt-md-0" style="gap: 10px;">
+                    <div class="flex-grow-1">
+                        <a
+                            class="btn btn-outline-white btn-lg btn-block px-3 mb-0 copy-information"
+                            href="#">
+                            <i class="far fa-clipboard mr-1"></i>
+                            Copy Diagnostics
+                        </a>
+                    </div>
+                    <div class="flex-grow-1">
+                        <a
+                            class="btn btn-outline-white btn-lg btn-block px-3 mb-0 copy-information"
+                            href="#">
+                            <i class="far fa-chart-network mr-1"></i>
+                            Federation Test
+                        </a>
+                    </div>
+                    <div class="flex-grow-1">
+
+                        <a
+                            class="btn btn-outline-white btn-lg btn-block px-3 mb-0 copy-information"
+                            href="#">
+                            <i class="far fa-mobile mr-1"></i>
+                            Mobile App Test
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
 </div>
 </div>
-<div class="pb-3 border-bottom">
-	<div class="form-group mb-0">
-		<div class="ml-n4 mr-n2 p-3">
-			<label class="font-weight-bold text-muted">Decrypt Payload</label>
-			<textarea class="form-control payload-input" rows="5" name="payload" placeholder="Enter payload here"></textarea>
-			<p class="help-text small text-muted mt-3 mb-0">The payload is from the "Something went wrong" page, anyone can copy the payload for you to decrypt.<br />Contents are encrypted due to potential sensitive information.</p>
-		</div>
-	</div>
-
-
-	<div class="form-group row">
-		<div class="col-12">
-			<button type="button" class="btn btn-primary font-weight-bold px-5 decrypt-payload">Decrypt</button>
-		</div>
-	</div>
+<div class="container-fluid mt-5">
+    <div class="row justify-content-center">
+        <div class="col-12">
+            <div class="pb-3 border-bottom">
+            	<div class="information">
+                	<ul>
+                		<p class="font-weight-bold text-muted">
+                			Troubleshooting
+                		</p>
+
+                		<li>
+                			<strong>Bootstrap:</strong>
+                			<span>{{is_writable(base_path('bootstrap/')) ? 'Writable ✅' : 'Not writable ❌'}}</span>
+                		</li>
+                		<li>
+                			<strong>Storage:</strong>
+                			<span>{{is_writable(base_path('storage/')) ? 'Writable ✅' : 'Not writable ❌'}}</span>
+                		</li>
+
+                		@foreach([
+                			'bcmath',
+                			'gd',
+                			'imagick',
+                			'ctype',
+                			'curl',
+                			'intl',
+                			'json',
+                			'mbstring',
+                			'openssl',
+                			'redis'
+                		] as $ext)
+                			@if(!extension_loaded($ext))
+                				<li>
+                					<strong>PHP Module {{$ext}}:</strong>
+                					<span>Not installed/Not loaded ❌</span>
+                				</li>
+                			@endif
+                		@endforeach
+
+                		<li>
+                			<strong><span class="badge badge-primary">DATABASE</span> Ping:</strong>
+                			<span>{{ \DB::connection()->getPDO() ? 'Pong! Connected to DB "' . \DB::connection()->getDatabaseName() . '" ✅' : 'DB Not Responding ❌' }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">REDIS</span> Ping:</strong>
+                			<span>{{ \Illuminate\Support\Facades\Redis::command('ping') ? 'Pong! Connected to Redis ✅' : 'Redis Not Responding ❌' }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">ACTIVITYPUB</span> instance actor created: </strong>
+                			<span>{{ \App\Models\InstanceActor::count() ? '✅ true' : '❌ false' }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">ACTIVITYPUB</span> instance actor cached: </strong>
+                			<span>{{ Cache::get(\App\Models\InstanceActor::PROFILE_KEY) ? '✅ true' : '❌ false' }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">OAUTH</span> enabled: </strong>
+                			<span>{{ (bool) config_cache('pixelfed.oauth_enabled') ? '✅ true' : '❌ false' }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">OAUTH</span> token_expiration</strong>
+                			<span>{{ config_cache('instance.oauth.token_expiration') }} days</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">OAUTH</span> public key exists: </strong>
+                			<span>{{ file_exists(storage_path('oauth-public.key')) || config_cache('passport.public_key') ? '✅ true' : '❌ false' }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">OAUTH</span> private key exists: </strong>
+                			<span>{{ file_exists(storage_path('oauth-private.key')) || config_cache('passport.private_key') ? '✅ true' : '❌ false' }}</span>
+                		</li>
+
+                		<hr>
+                		<p class="font-weight-bold text-muted">
+                			Important Information
+                		</p>
+
+
+                		@if(function_exists('shell_exec'))
+                			<li>
+                				<strong>Version:</strong>
+                				<span>{{config('pixelfed.version')}}-{{ @shell_exec('git log --pretty="%h" -n1 HEAD') ?? 'unknown git commit' }}</span>
+                			</li>
+                		@else
+                			<li>
+                				<strong>Version:</strong>
+                				<span>{{config('pixelfed.version')}}</span>
+                			</li>
+                		@endif
+
+                		<li>
+                			<strong>Database:</strong>
+                			@php($v = explode(' ', DB::select('select version() as version')[0]->version))
+                			<span>{{config('database.default')}} ({{count($v) == 1 ? $v[0] : $v[1]}})</span>
+                		</li>
+                		<li>
+                			<strong>APP_URL:</strong>
+                			<span>{{config_cache('app.url')}}</span>
+                		</li>
+                		<li>
+                			<strong>APP_DOMAIN:</strong>
+                			<span>{{config_cache('pixelfed.domain.app')}}</span>
+                		</li>
+                		<li>
+                			<strong>ADMIN_DOMAIN:</strong>
+                			<span>{{config_cache('pixelfed.domain.admin')}}</span>
+                		</li>
+                		<li>
+                			<strong>SESSION_DOMAIN:</strong>
+                			<span>{{config_cache('session.domain')}}</span>
+                		</li>
+
+                		<hr>
+                		<p class="font-weight-bold text-muted">
+                			PHP Variables
+                		</p>
+                		<li>
+                			<strong>PHP:</strong>
+                			<span>{{phpversion()}}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI</span> memory_limit:</strong>
+                			<span>{{ ini_get('memory_limit') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI</span> post_max_size:</strong>
+                			<span>{{ ini_get('post_max_size') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI</span> upload_max_filesize:</strong>
+                			<span>{{ ini_get('upload_max_filesize') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI</span> max_file_uploads:</strong>
+                			<span>{{ ini_get('max_file_uploads') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI</span> max_execution_time:</strong>
+                			<span>{{ ini_get('max_execution_time') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI</span> max_input_time:</strong>
+                			<span>{{ ini_get('max_input_time') }}</span>
+                		</li>
+
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI</span> file_uploads (On):</strong>
+                			<span>{{ ini_get('file_uploads') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> allow_url_fopen (true):</strong>
+                			<span>{{ ini_get('allow_url_fopen') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> allow_url_include (false):</strong>
+                			<span>{{ ini_get('allow_url_include') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> expose_php (false):</strong>
+                			<span>{{ ini_get('expose_php') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> display_errors (false):</strong>
+                			<span>{{ ini_get('display_errors') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> display_startup_errors (false):</strong>
+                			<span>{{ ini_get('display_startup_errors') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> log_errors (true):</strong>
+                			<span>{{ ini_get('log_errors') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> ignore_repeated_errors (false):</strong>
+                			<span>{{ ini_get('ignore_repeated_errors') }}</span>
+                		</li>
+                		<li>
+                			<strong><span class="badge badge-primary">PHP INI - Security</span> disable_functions:</strong>
+                			<span>{{ ini_get('disable_functions') }}</span>
+                		</li>
+
+                    	<hr>
+                    	<p class="font-weight-bold text-muted">
+                    		Pixelfed Variables (No Secrets)
+                    	</p>
+                        <div class="table-responsive">
+                            <table class="table">
+                                <thead class="bg-light">
+                                	<tr>
+                                		<th width="5%" scope="col" class="border-0 text-dark">CONFIG</th>
+                                		<th width="20%"scope="col" class="border-0 text-dark">Variable Name</th>
+                                		<th width="40%"scope="col" class="border-0 text-dark">Details</th>
+                                	</tr>
+                                </thead>
+                                <tbody>
+                                	<tr>
+                                		<td><span class="badge badge-primary">APP</span></td>
+                                		<td><strong>APP_NAME</strong></td>
+                                		<td><span>"{{config_cache('app.name')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">APP</span></td>
+                                		<td><strong>APP_ENV</strong></td>
+                                		<td><span>"{{config_cache('app.env')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">APP</span></td>
+                                		<td><strong>APP_DEBUG</strong></td>
+                                		<td><span>{{config_cache('app.debug') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">APP</span></td>
+                                		<td><strong>APP_URL</strong></td>
+                                		<td><span>"{{config_cache('app.url')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">APP</span></td>
+                                		<td><strong>APP_LOCALE</strong></td>
+                                		<td><span>"{{config_cache('app.locale')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">APP</span></td>
+                                		<td><strong>APP_FALLBACK_LOCALE</strong></td>
+                                		<td><span>"{{config_cache('app.fallback_locale')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">BROADCASTING</span></td>
+                                		<td><strong>BROADCAST_DRIVER</strong></td>
+                                		<td><span>"{{config_cache('broadcasting.default')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">CACHE</span></td>
+                                		<td><strong>CACHE_DRIVER</strong></td>
+                                		<td><span>"{{config_cache('cache.default')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">CAPTCHA</span></td>
+                                		<td><strong>CAPTCHA_ENABLED</strong></td>
+                                		<td><span>{{ config_cache('captcha.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">DATABASE</span></td>
+                                		<td><strong>DB_CONNECTION</strong></td>
+                                		<td><span>"{{config_cache('database.default')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">DATABASE</span></td>
+                                		<td><strong>REDIS_CLIENT</strong></td>
+                                		<td><span>"{{config_cache('database.redis.client')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">EXP</span></td>
+                                		<td><strong>EXP_LC</strong></td>
+                                		<td><span>{{config_cache('exp.lc') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">EXP</span></td>
+                                		<td><strong>EXP_TOP</strong></td>
+                                		<td><span>{{config_cache('exp.top') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">EXP</span></td>
+                                		<td><strong>EXP_POLLS</strong></td>
+                                		<td><span>{{config_cache('exp.polls') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">EXP</span></td>
+                                		<td><strong>EXP_CPT</strong></td>
+                                		<td><span>{{config_cache('exp.cached_public_timeline') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">EXP</span></td>
+                                		<td><strong>EXP_GPS</strong></td>
+                                		<td><span>{{config_cache('exp.gps') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">EXP</span></td>
+                                		<td><strong>EXP_EMC</strong></td>
+                                		<td><span>{{config_cache('exp.emc') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>ACTIVITY_PUB</strong></td>
+                                		<td><span>{{(bool) config_cache('federation.activitypub.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>AP_OUTBOX</strong></td>
+                                		<td><span>{{config_cache('federation.activitypub.outbox') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>AP_INBOX</strong></td>
+                                		<td><span>{{config_cache('federation.activitypub.inbox') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>AP_SHAREDINBOX</strong></td>
+                                		<td><span>{{config_cache('federation.activitypub.sharedInbox') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>AP_REMOTE_FOLLOW</strong></td>
+                                		<td><span>{{config_cache('federation.activitypub.remoteFollow') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>ACTIVITYPUB_DELIVERY_TIMEOUT</strong></td>
+                                		<td><span>"{{config_cache('federation.activitypub.delivery.timeout')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>ACTIVITYPUB_DELIVERY_CONCURRENCY</strong></td>
+                                		<td><span>"{{config_cache('federation.activitypub.delivery.concurrency')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>AP_LOGGER_ENABLED</strong></td>
+                                		<td><span>{{config_cache('federation.activitypub.delivery.logger.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>ATOM_FEEDS</strong></td>
+                                		<td><span>{{config_cache('federation.atom.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>REMOTE_AVATARS</strong></td>
+                                		<td><span>{{config_cache('federation.avatars.store_local') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>NODEINFO</strong></td>
+                                		<td><span>{{config_cache('federation.nodeinfo.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>WEBFINGER</strong></td>
+                                		<td><span>{{config_cache('federation.webfinger.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>PF_NETWORK_TIMELINE</strong></td>
+                                		<td><span>{{(bool) config_cache('federation.network_timeline') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>PF_NETWORK_TIMELINE_DAYS_FALLOFF</strong></td>
+                                		<td><span>{{config('federation.network_timeline_days_falloff') }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>CUSTOM_EMOJI</strong></td>
+                                		<td><span>{{(bool) config_cache('federation.custom_emoji.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FEDERATION</span></td>
+                                		<td><strong>CUSTOM_EMOJI_MAX_SIZE</strong></td>
+                                		<td><span>"{{config_cache('federation.custom_emoji.max_size')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">FILESYSTEMS</span></td>
+                                		<td><strong>FILESYSTEM_DRIVER</strong></td>
+                                		<td><span>"{{config_cache('filesystems.default')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">FILESYSTEMS</span></td>
+                                		<td><strong>FILESYSTEM_CLOUD</strong></td>
+                                		<td><span>"{{config_cache('filesystems.cloud')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">HASHING</span></td>
+                                		<td><strong>BCRYPT_COST</strong></td>
+                                		<td><span>"{{config_cache('hashing.bcrypt.rounds')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_PREFIX</strong></td>
+                                		<td><span>"{{config_cache('horizon.prefix')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_MEMORY_LIMIT</strong></td>
+                                		<td><span>"{{config_cache('horizon.memory_limit')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_BALANCE_STRATEGY</strong></td>
+                                		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.balance')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_MIN_PROCESSES</strong></td>
+                                		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.minProcesses')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_MAX_PROCESSES</strong></td>
+                                		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.maxProcesses')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_SUPERVISOR_MEMORY</strong></td>
+                                		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.memory')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_SUPERVISOR_TRIES</strong></td>
+                                		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.tries')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_SUPERVISOR_NICE</strong></td>
+                                		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.nice')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_SUPERVISOR_TIMEOUT</strong></td>
+                                		<td><span>"{{config_cache('horizon.environments.production.supervisor-1.timeout')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">HORIZON</span></td>
+                                		<td><strong>HORIZON_DARKMODE</strong></td>
+                                		<td><span>{{config_cache('horizon.darkmode') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">IMAGE</span></td>
+                                		<td><strong>IMAGE_DRIVER </strong></td>
+                                		<td><span>"{{config_cache('image.driver')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_DESCRIPTION</strong></td>
+                                		<td><span>"{{config_cache('instance.description')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_CONTACT_FORM</strong></td>
+                                		<td><span>{{config_cache('instance.contact.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_CONTACT_MAX_PER_DAY</strong></td>
+                                		<td><span>"{{config_cache('instance.contact.max_per_day')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_DISCOVER_PUBLIC</strong></td>
+                                		<td><span>{{config_cache('instance.discover.public') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>EXP_LOOPS</strong></td>
+                                		<td><span>{{config_cache('instance.discover.loops.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_PUBLIC_HASHTAGS</strong></td>
+                                		<td><span>{{config_cache('instance.discover.tags.is_public') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_CONTACT_EMAIL</strong></td>
+                                		<td><span>"{{config_cache('instance.email')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_PUBLIC_LOCAL_TIMELINE</strong></td>
+                                		<td><span>{{config_cache('instance.timeline.local.is_public') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_NETWORK_TIMELINE_CACHED</strong></td>
+                                		<td><span>{{config('instance.timeline.network.cached') }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_NETWORK_TIMELINE_CACHE_DROPOFF</strong></td>
+                                		<td><span>{{config('instance.timeline.network.cache_dropoff') }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>INSTANCE_NETWORK_TIMELINE_CACHE_MAX_HOUR_INGEST</strong></td>
+                                		<td><span>{{config('instance.timeline.network.max_hours_old') }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>PAGE_404_HEADER</strong></td>
+                                		<td><span>"{{config_cache('instance.page.404.header')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>PAGE_404_BODY</strong></td>
+                                		<td><span>"{{config_cache('instance.page.404.body')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>PAGE_503_HEADER</strong></td>
+                                		<td><span>"{{config_cache('instance.page.503.header')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>PAGE_503_BODY</strong></td>
+                                		<td><span>"{{config_cache('instance.page.503.body')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>BANNED_USERNAMES</strong></td>
+                                		<td><span>"{{config_cache('instance.username.banned')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>USERNAME_REMOTE_FORMAT</strong></td>
+                                		<td><span>"{{config_cache('instance.username.remote.format')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>USERNAME_REMOTE_CUSTOM_TEXT</strong></td>
+                                		<td><span>"{{config_cache('instance.username.remote.custom')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>STORIES_ENABLED</strong></td>
+                                		<td><span>{{(bool) config_cache('instance.stories.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>RESTRICTED_INSTANCE</strong></td>
+                                		<td><span>{{config_cache('instance.restricted.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>OAUTH_TOKEN_DAYS</strong></td>
+                                		<td><span>"{{config_cache('instance.oauth.token_expiration')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>OAUTH_REFRESH_DAYS</strong></td>
+                                		<td><span>"{{config_cache('instance.oauth.refresh_expiration')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>OAUTH_PAT_ENABLED</strong></td>
+                                		<td><span>{{config_cache('instance.oauth.pat.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>OAUTH_PAT_ID</strong></td>
+                                		<td><span>"{{config_cache('instance.oauth.pat.id')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>ENABLE_COVID_LABEL</strong></td>
+                                		<td><span>{{config_cache('instance.label.covid.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>COVID_LABEL_URL</strong></td>
+                                		<td><span>"{{config_cache('instance.label.covid.url')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>COVID_LABEL_ORG</strong></td>
+                                		<td><span>"{{config_cache('instance.label.covid.org')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">INSTANCE</span></td>
+                                		<td><strong>ENABLE_CONFIG_CACHE</strong></td>
+                                		<td><span>{{config_cache('instance.enable_cc') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">LDAP</span></td>
+                                		<td><strong>LDAP_CONNECTION</strong></td>
+                                		<td><span>"{{config_cache('ldap.default')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">LDAP</span></td>
+                                		<td><strong>LDAP_LOGGING</strong></td>
+                                		<td><span>{{config_cache('ldap.logging') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">LDAP</span></td>
+                                		<td><strong>LDAP_CACHE</strong></td>
+                                		<td><span>{{config_cache('ldap.cache.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">LOGGING</span></td>
+                                		<td><strong>LOG_CHANNEL</strong></td>
+                                		<td><span>"{{config_cache('logging.default')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">LOGGING</span></td>
+                                		<td><strong>LOG_LEVEL (stack)</strong></td>
+                                		<td><span>"{{config_cache('logging.channels.single.level')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">MAIL</span></td>
+                                		<td><strong>MAIL_DRIVER</strong></td>
+                                		<td><span>"{{config_cache('mail.default')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">MAIL</span></td>
+                                		<td><strong>MAIL_HOST</strong></td>
+                                		<td><span>"{{config_cache('mail.mailers.smtp.host')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">MAIL</span></td>
+                                		<td><strong>MAIL_PORT</strong></td>
+                                		<td><span>"{{config_cache('mail.mailers.smtp.port')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">MAIL</span></td>
+                                		<td><strong>MAIL_FROM_ADDRESS</strong></td>
+                                		<td><span>"{{config_cache('mail.from.address')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">MAIL</span></td>
+                                		<td><strong>MAIL_FROM_NAME</strong></td>
+                                		<td><span>"{{config_cache('mail.from.name')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">MAIL</span></td>
+                                		<td><strong>MAIL_ENCRYPTION</strong></td>
+                                		<td><span>"{{config_cache('mail.mailers.smtp.encryption')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">MEDIA</span></td>
+                                		<td><strong>MEDIA_EXIF_DATABASE</strong></td>
+                                		<td><span>{{config_cache('media.exif.database') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>ADMIN_DOMAIN</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.domain.admin')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>APP_DOMAIN</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.domain.app')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MEMORY_LIMIT</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.memory_limit')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>OPEN_REGISTRATION</strong></td>
+                                		<td><span>{{config_cache('pixelfed.open_registration') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MAX_ACCOUNT_SIZE (KB)</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_account_size')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MAX_PHOTO_SIZE (KB)</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_photo_size')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MAX_AVATAR_SIZE (KB)</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_avatar_size')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MAX_CAPTION_LENGTH</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_caption_length')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MAX_BIO_LENGTH</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_bio_length')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MAX_NAME_LENGTH</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_name_length')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MIN_PASSWORD_LENGTH</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.min_password_length')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MAX_ALBUM_LENGTH</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_album_length')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>ENFORCE_EMAIL_VERIFICATION</strong></td>
+                                		<td><span>{{config_cache('pixelfed.enforce_email_verification') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>IMAGE_QUALITY (1-100)</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.image_quality')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>ACCOUNT_DELETION</strong></td>
+                                		<td><span>{{config_cache('pixelfed.account_deletion') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>ACCOUNT_DELETE_AFTER</strong></td>
+                                		<td><span>{{config_cache('pixelfed.account_delete_after') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_ENABLE_CLOUD</strong></td>
+                                		<td><span>{{(bool) config_cache('pixelfed.cloud_storage') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_MAX_USERS</strong></td>
+                                		<td><span>{{config_cache('pixelfed.max_users') ? config('pixelfed.max_users') : '❌ false'}}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_OPTIMIZE_IMAGES</strong></td>
+                                		<td><span>{{(bool) config_cache('pixelfed.optimize_image') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_OPTIMIZE_VIDEOS</strong></td>
+                                		<td><span>{{(bool) config_cache('pixelfed.optimize_video') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_USER_INVITES</strong></td>
+                                		<td><span>{{config_cache('pixelfed.user_invites.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_USER_INVITES_TOTAL_LIMIT</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.user_invites.limit.total')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_USER_INVITES_DAILY_LIMIT</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.user_invites.limit.daily')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_USER_INVITES_MONTHLY_LIMIT</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.user_invites.limit.monthly')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_MAX_COLLECTION_LENGTH</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_collection_length')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>MEDIA_TYPES</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.media_types')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>LIMIT_ACCOUNT_SIZE</strong></td>
+                                		<td><span>{{config_cache('pixelfed.enforce_account_limit') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>IMPORT_INSTAGRAM</strong></td>
+                                		<td><span>{{config_cache('pixelfed.import.instagram.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>IMPORT_INSTAGRAM_POST_LIMIT</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.import.instagram.limits.posts')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>IMPORT_INSTAGRAM_SIZE_LIMIT</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.import.instagram.limits.size')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>OAUTH_ENABLED</strong></td>
+                                		<td><span>{{ (bool) config_cache('pixelfed.oauth_enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_BOUNCER_ENABLED</strong></td>
+                                		<td><span>{{(bool) config_cache('pixelfed.bouncer.enabled') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_MEDIA_FAST_PROCESS</strong></td>
+                                		<td><span>{{config_cache('pixelfed.media_fast_process') ? '✅ true' : '❌ false' }}</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">PIXELFED</span></td>
+                                		<td><strong>PF_MEDIA_MAX_ALTTEXT_LENGTH</strong></td>
+                                		<td><span>"{{config_cache('pixelfed.max_altext_length')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">PURIFY</span></td>
+                                		<td><strong>RESTRICT_HTML_TYPES</strong></td>
+                                		<td><span>BROKEN</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">QUEUE</span></td>
+                                		<td><strong>QUEUE_DRIVER</strong></td>
+                                		<td><span>"{{config_cache('queue.default')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">SESSION</span></td>
+                                		<td><strong>SESSION_DRIVER</strong></td>
+                                		<td><span>"{{config_cache('session.driver')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">SESSION</span></td>
+                                		<td><strong>SESSION_LIFETIME</strong></td>
+                                		<td><span>"{{config_cache('session.lifetime')}}"</span></td>
+                                	</tr>
+                                	<tr>
+                                		<td><span class="badge badge-primary">SESSION</span></td>
+                                		<td><strong>SESSION_DOMAIN</strong></td>
+                                		<td><span>"{{config_cache('session.domain')}}"</span></td>
+                                	</tr>
+
+                                	<tr>
+                                		<td><span class="badge badge-primary">TRUSTEDPROXY</span></td>
+                                		<td><strong>TRUST_PROXIES</strong></td>
+                                		<td><span>"{{config_cache('trustedproxy.proxies')}}"</span></td>
+                                	</tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </ul>
+                </div>
+            </div>
+            <div class="pb-3 border-bottom">
+            	<div class="form-group mb-0">
+            		<div class="ml-n4 mr-n2 p-3">
+            			<label class="font-weight-bold text-muted">Decrypt Payload</label>
+            			<textarea class="form-control payload-input" rows="5" name="payload" placeholder="Enter payload here"></textarea>
+            			<p class="help-text small text-muted mt-3 mb-0">The payload is from the "Something went wrong" page, anyone can copy the payload for you to decrypt.<br />Contents are encrypted due to potential sensitive information.</p>
+            		</div>
+            	</div>
+
+
+            	<div class="form-group row">
+            		<div class="col-12">
+            			<button type="button" class="btn btn-primary font-weight-bold px-5 decrypt-payload">Decrypt</button>
+            		</div>
+            	</div>
+            </div>
+        </div>
+    </div>
 </div>
 </div>
 @endsection
 @endsection
 
 

+ 4 - 1
resources/views/status/show.blade.php

@@ -48,12 +48,15 @@ if($displayName && $captionPreview) {
 
 
 @push('meta')@if($mediaCount && $s['pf_type'] === "photo" || $s['pf_type'] === "photo:album")
 @push('meta')@if($mediaCount && $s['pf_type'] === "photo" || $s['pf_type'] === "photo:album")
 <meta property="og:image" content="{{$s['media_attachments'][0]['url']}}">
 <meta property="og:image" content="{{$s['media_attachments'][0]['url']}}">
+    <meta name="twitter:card" content="summary_large_image">
     @elseif($mediaCount && $s['pf_type'] === "video" || $s['pf_type'] === "video:album")<meta property="og:video" content="{{$s['media_attachments'][0]['url']}}">
     @elseif($mediaCount && $s['pf_type'] === "video" || $s['pf_type'] === "video:album")<meta property="og:video" content="{{$s['media_attachments'][0]['url']}}">
+    <meta name="twitter:card" content="summary">
+    @else
+    <meta name="twitter:card" content="summary">
     @endif<meta property="og:description" content="{{ $ogDescription }}">
     @endif<meta property="og:description" content="{{ $ogDescription }}">
     <meta property="og:published_time" content="{{$s['created_at']}}">
     <meta property="og:published_time" content="{{$s['created_at']}}">
     <meta property="profile:username" content="{{ $wf }}">
     <meta property="profile:username" content="{{ $wf }}">
     <link href='{{$s['url']}}' rel='alternate' type='application/activity+json'>
     <link href='{{$s['url']}}' rel='alternate' type='application/activity+json'>
-    <meta name="twitter:card" content="summary">
     <meta name="description" content="{{ $ogDescription }}">
     <meta name="description" content="{{ $ogDescription }}">
 @endpush
 @endpush