Merge branch 'next' into v4.x

This commit is contained in:
majcek210 2025-10-23 16:36:40 +02:00 committed by GitHub
commit 014ad6fcd2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 527 additions and 320 deletions

View file

@ -107,7 +107,7 @@ public function mount()
if ($this->selectedServerType === 'remote') {
if ($this->privateKeys->isEmpty()) {
$this->privateKeys = PrivateKey::ownedByCurrentTeam(['name'])->where('id', '!=', 0)->get();
$this->privateKeys = PrivateKey::ownedAndOnlySShKeys(['name'])->where('id', '!=', 0)->get();
}
if ($this->servers->isEmpty()) {
$this->servers = Server::ownedByCurrentTeam(['name'])->where('id', '!=', 0)->get();
@ -186,7 +186,7 @@ public function setServerType(string $type)
return $this->validateServer('localhost');
} elseif ($this->selectedServerType === 'remote') {
$this->privateKeys = PrivateKey::ownedByCurrentTeam(['name'])->where('id', '!=', 0)->get();
$this->privateKeys = PrivateKey::ownedAndOnlySShKeys(['name'])->where('id', '!=', 0)->get();
// Auto-select first key if available for better UX
if ($this->privateKeys->count() > 0) {
$this->selectedExistingPrivateKey = $this->privateKeys->first()->id;

View file

@ -74,12 +74,16 @@ class ByHetzner extends Component
#[Locked]
public Collection $saved_cloud_init_scripts;
public bool $from_onboarding = false;
public function mount()
{
$this->authorize('viewAny', CloudProviderToken::class);
$this->loadTokens();
$this->loadSavedCloudInitScripts();
$this->server_name = generate_random_name();
$this->private_keys = PrivateKey::ownedAndOnlySShKeys()->where('id', '!=', 0)->get();
if ($this->private_keys->count() > 0) {
$this->private_key_id = $this->private_keys->first()->id;
}
@ -131,7 +135,7 @@ public function handleTokenAdded($tokenId)
public function handlePrivateKeyCreated($keyId)
{
// Refresh private keys list
$this->private_keys = PrivateKey::ownedByCurrentTeam()->get();
$this->private_keys = PrivateKey::ownedAndOnlySShKeys()->where('id', '!=', 0)->get();
// Auto-select the new key
$this->private_key_id = $keyId;
@ -246,12 +250,6 @@ private function loadHetznerData(string $token)
// Get images and sort by name
$images = $hetznerService->getImages();
ray('Raw images from Hetzner API', [
'total_count' => count($images),
'types' => collect($images)->pluck('type')->unique()->values(),
'sample' => array_slice($images, 0, 3),
]);
$this->images = collect($images)
->filter(function ($image) {
// Only system images
@ -269,20 +267,8 @@ private function loadHetznerData(string $token)
->sortBy('name')
->values()
->toArray();
ray('Filtered images', [
'filtered_count' => count($this->images),
'debian_images' => collect($this->images)->filter(fn ($img) => str_contains($img['name'] ?? '', 'debian'))->values(),
]);
// Load SSH keys from Hetzner
$this->hetznerSshKeys = $hetznerService->getSshKeys();
ray('Hetzner SSH Keys', [
'total_count' => count($this->hetznerSshKeys),
'keys' => $this->hetznerSshKeys,
]);
$this->loading_data = false;
} catch (\Throwable $e) {
$this->loading_data = false;
@ -574,6 +560,11 @@ public function submit()
$server->proxy->set('type', ProxyTypes::TRAEFIK->value);
$server->save();
if ($this->from_onboarding) {
// When in onboarding, use wire:navigate for proper modal handling
return $this->redirect(route('server.show', $server->uuid));
}
return redirect()->route('server.show', $server->uuid);
} catch (\Throwable $e) {
return handleError($e, $this);

View file

@ -88,6 +88,16 @@ public static function ownedByCurrentTeam(array $select = ['*'])
return self::whereTeamId($teamId)->select($selectArray->all());
}
public static function ownedAndOnlySShKeys(array $select = ['*'])
{
$teamId = currentTeam()->id;
$selectArray = collect($select)->concat(['id']);
return self::whereTeamId($teamId)
->where('is_git_related', false)
->select($selectArray->all());
}
public static function validatePrivateKey($privateKey)
{
try {

View file

@ -14,14 +14,156 @@
@if ($multiple)
{{-- Multiple Selection Mode with Alpine.js --}}
<div x-data="{
open: false,
search: '',
selected: @entangle($modelBinding).live,
options: [],
filteredOptions: [],
init() {
this.options = Array.from(this.$refs.datalist.querySelectorAll('option')).map(opt => {
// Try to parse as integer, fallback to string
let value = opt.value;
const intValue = parseInt(value, 10);
if (!isNaN(intValue) && intValue.toString() === value) {
value = intValue;
}
return {
value: value,
text: opt.textContent.trim()
};
});
this.filteredOptions = this.options;
// Ensure selected is always an array
if (!Array.isArray(this.selected)) {
this.selected = [];
}
},
filterOptions() {
if (!this.search) {
this.filteredOptions = this.options;
return;
}
const searchLower = this.search.toLowerCase();
this.filteredOptions = this.options.filter(opt =>
opt.text.toLowerCase().includes(searchLower)
);
},
toggleOption(value) {
// Ensure selected is an array
if (!Array.isArray(this.selected)) {
this.selected = [];
}
const index = this.selected.indexOf(value);
if (index > -1) {
this.selected.splice(index, 1);
} else {
this.selected.push(value);
}
this.search = '';
this.filterOptions();
// Focus input after selection
this.$refs.searchInput.focus();
},
removeOption(value, event) {
// Ensure selected is an array
if (!Array.isArray(this.selected)) {
this.selected = [];
return;
}
// Prevent triggering container click
event.stopPropagation();
const index = this.selected.indexOf(value);
if (index > -1) {
this.selected.splice(index, 1);
}
},
isSelected(value) {
// Ensure selected is an array
if (!Array.isArray(this.selected)) {
return false;
}
return this.selected.includes(value);
},
getSelectedText(value) {
const option = this.options.find(opt => opt.value == value);
return option ? option.text : value;
}
}" @click.outside="open = false" class="relative">
{{-- Unified Input Container with Tags Inside --}}
<div @click="$refs.searchInput.focus()"
class="flex flex-wrap gap-1.5 max-h-40 overflow-y-auto scrollbar py-1.5 px-2 w-full text-sm rounded-sm border-0 ring-2 ring-inset ring-neutral-200 dark:ring-coolgray-300 bg-white dark:bg-coolgray-100 cursor-text px-1 focus-within:border-l-4 focus-within:border-l-coollabs dark:focus-within:border-l-warning text-black dark:text-white"
:class="{
'opacity-50': {{ $disabled ? 'true' : 'false' }}
}" wire:loading.class="opacity-50"
wire:dirty.class="dark:border-l-warning border-l-coollabs border-l-4">
{{-- Selected Tags Inside Input --}}
<template x-for="value in selected" :key="value">
<button type="button" @click.stop="removeOption(value, $event)"
:disabled="{{ $disabled ? 'true' : 'false' }}"
class="inline-flex items-center gap-1.5 px-2 py-0.5 text-xs bg-coolgray-200 dark:bg-coolgray-700 rounded whitespace-nowrap {{ $disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer hover:bg-red-100 dark:hover:bg-red-900/20 hover:text-red-600 dark:hover:text-red-400' }}"
aria-label="Remove">
<span x-text="getSelectedText(value)" class="max-w-[200px] truncate"></span>
</button>
</template>
{{-- Search Input (Borderless, Inside Container) --}}
<input type="text" x-model="search" x-ref="searchInput" @input="filterOptions()" @focus="open = true"
@keydown.escape="open = false" :placeholder="(Array.isArray(selected) && selected.length > 0) ? '' :
{{ json_encode($placeholder ?: 'Search...') }}" @required($required) @readonly($readonly)
@disabled($disabled) @if ($autofocus) autofocus @endif
class="flex-1 min-w-[120px] text-sm border-0 outline-none bg-transparent p-0 focus:ring-0 placeholder:text-neutral-400 dark:placeholder:text-neutral-600 text-black dark:text-white" />
</div>
{{-- Dropdown Options --}}
<div x-show="open && !{{ $disabled ? 'true' : 'false' }}" x-transition
class="absolute z-50 w-full mt-1 bg-white dark:bg-coolgray-100 border border-neutral-300 dark:border-coolgray-400 rounded shadow-lg max-h-60 overflow-auto scrollbar">
<template x-if="filteredOptions.length === 0">
<div class="px-3 py-2 text-sm text-neutral-500 dark:text-neutral-400">
No options found
</div>
</template>
<template x-for="option in filteredOptions" :key="option.value">
<div @click="toggleOption(option.value)"
class="px-3 py-2 cursor-pointer hover:bg-neutral-100 dark:hover:bg-coolgray-200 flex items-center gap-3"
:class="{ 'bg-neutral-50 dark:bg-coolgray-300': isSelected(option.value) }">
<input type="checkbox" :checked="isSelected(option.value)"
class="w-4 h-4 rounded border-neutral-300 dark:border-neutral-600 bg-white dark:bg-coolgray-100 text-black dark:text-white checked:bg-white dark:checked:bg-coolgray-100 focus:ring-coollabs dark:focus:ring-warning pointer-events-none"
tabindex="-1">
<span class="text-sm flex-1" x-text="option.text"></span>
</div>
</template>
</div>
{{-- Hidden datalist for options --}}
<datalist x-ref="datalist" style="display: none;">
{{ $slot }}
</datalist>
</div>
@else
{{-- Single Selection Mode with Alpine.js --}}
<div x-data="{
open: false,
search: '',
selected: @entangle($modelBinding).live,
selected: @entangle(($attributes->whereStartsWith('wire:model')->first() ? $attributes->wire('model')->value() : $modelBinding)).live,
options: [],
filteredOptions: [],
init() {
this.options = Array.from(this.$refs.datalist.querySelectorAll('option')).map(opt => {
// Skip disabled options
if (opt.disabled) {
return null;
}
// Try to parse as integer, fallback to string
let value = opt.value;
const intValue = parseInt(value, 10);
@ -32,14 +174,10 @@
value: value,
text: opt.textContent.trim()
};
});
}).filter(opt => opt !== null);
this.filteredOptions = this.options;
// Ensure selected is always an array
if (!Array.isArray(this.selected)) {
this.selected = [];
}
},
filterOptions() {
if (!this.search) {
this.filteredOptions = this.options;
@ -50,243 +188,97 @@
opt.text.toLowerCase().includes(searchLower)
);
},
toggleOption(value) {
// Ensure selected is an array
if (!Array.isArray(this.selected)) {
this.selected = [];
}
const index = this.selected.indexOf(value);
if (index > -1) {
this.selected.splice(index, 1);
} else {
this.selected.push(value);
}
selectOption(value) {
this.selected = value;
this.search = '';
this.open = false;
this.filterOptions();
// Focus input after selection
this.$refs.searchInput.focus();
},
removeOption(value, event) {
// Ensure selected is an array
if (!Array.isArray(this.selected)) {
this.selected = [];
return;
}
// Prevent triggering container click
event.stopPropagation();
const index = this.selected.indexOf(value);
if (index > -1) {
this.selected.splice(index, 1);
}
openDropdown() {
if ({{ $disabled ? 'true' : 'false' }}) return;
this.open = true;
this.$nextTick(() => {
if (this.$refs.searchInput) {
this.$refs.searchInput.focus();
}
});
},
isSelected(value) {
// Ensure selected is an array
if (!Array.isArray(this.selected)) {
return false;
}
return this.selected.includes(value);
getSelectedText() {
if (!this.selected || this.selected === 'default') return '';
const option = this.options.find(opt => opt.value == this.selected);
return option ? option.text : this.selected;
},
getSelectedText(value) {
const option = this.options.find(opt => opt.value == value);
return option ? option.text : value;
isDefaultValue() {
return !this.selected || this.selected === 'default' || this.selected === '';
}
}" @click.outside="open = false" class="relative">
{{-- Unified Input Container with Tags Inside --}}
<div @click="$refs.searchInput.focus()"
class="flex flex-wrap gap-1.5 max-h-40 overflow-y-auto scrollbar py-1.5 w-full text-sm rounded-sm border-0 ring-2 ring-inset ring-neutral-200 dark:ring-coolgray-300 bg-white dark:bg-coolgray-100 cursor-text px-1 focus-within:border-l-4 focus-within:border-l-coollabs dark:focus-within:border-l-warning text-black dark:text-white"
:class="{
{{-- Hidden input for form validation --}}
<input type="hidden" :value="selected" @required($required) />
{{-- Input Container --}}
<div @click="openDropdown()"
class="flex items-center gap-2 py-1.5 w-full text-sm rounded-sm border-0 ring-2 ring-inset ring-neutral-200 dark:ring-coolgray-300 bg-white dark:bg-coolgray-100 cursor-text focus-within:border-l-4 focus-within:border-l-coollabs dark:focus-within:border-l-warning text-black dark:text-white"
:class="{
'opacity-50': {{ $disabled ? 'true' : 'false' }}
}"
wire:loading.class="opacity-50"
wire:dirty.class="dark:border-l-warning border-l-coollabs border-l-4">
}" wire:loading.class="opacity-50" wire:dirty.class="dark:border-l-warning border-l-coollabs border-l-4">
{{-- Selected Tags Inside Input --}}
<template x-for="value in selected" :key="value">
<button
type="button"
@click.stop="removeOption(value, $event)"
:disabled="{{ $disabled ? 'true' : 'false' }}"
class="inline-flex items-center gap-1.5 px-2 py-0.5 text-xs bg-coolgray-200 dark:bg-coolgray-700 rounded whitespace-nowrap {{ $disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer hover:bg-red-100 dark:hover:bg-red-900/20 hover:text-red-600 dark:hover:text-red-400' }}"
aria-label="Remove">
<span x-text="getSelectedText(value)" class="max-w-[200px] truncate"></span>
{{-- Display Selected Value or Search Input --}}
<div class="flex-1 flex items-center min-w-0 px-1">
<template x-if="!isDefaultValue() && !open">
<span class="text-sm flex-1 truncate text-black dark:text-white px-2"
x-text="getSelectedText()"></span>
</template>
<input type="text" x-show="isDefaultValue() || open" x-model="search" x-ref="searchInput"
@input="filterOptions()" @focus="open = true" @keydown.escape="open = false"
:placeholder="{{ json_encode($placeholder ?: 'Search...') }}" @readonly($readonly)
@disabled($disabled) @if ($autofocus) autofocus @endif
class="flex-1 text-sm border-0 outline-none bg-transparent p-0 focus:ring-0 placeholder:text-neutral-400 dark:placeholder:text-neutral-600 text-black dark:text-white px-2" />
</div>
{{-- Dropdown Arrow --}}
<button type="button" @click.stop="open = !open" :disabled="{{ $disabled ? 'true' : 'false' }}"
class="shrink-0 text-neutral-400 px-2 {{ $disabled ? 'cursor-not-allowed' : 'cursor-pointer' }}">
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-180': open }" fill="none"
stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
</template>
</div>
{{-- Search Input (Borderless, Inside Container) --}}
<input type="text" x-model="search" x-ref="searchInput" @input="filterOptions()" @focus="open = true"
@keydown.escape="open = false"
:placeholder="(Array.isArray(selected) && selected.length > 0) ? '' :
{{ json_encode($placeholder ?: 'Search...') }}"
@required($required) @readonly($readonly) @disabled($disabled) @if ($autofocus)
autofocus
{{-- Dropdown Options --}}
<div x-show="open && !{{ $disabled ? 'true' : 'false' }}" x-transition
class="absolute z-50 w-full mt-1 bg-white dark:bg-coolgray-100 border border-neutral-300 dark:border-coolgray-400 rounded shadow-lg max-h-60 overflow-auto scrollbar">
<template x-if="filteredOptions.length === 0">
<div class="px-3 py-2 text-sm text-neutral-500 dark:text-neutral-400">
No options found
</div>
</template>
<template x-for="option in filteredOptions" :key="option.value">
<div @click="selectOption(option.value)"
class="px-3 py-2 cursor-pointer hover:bg-neutral-100 dark:hover:bg-coolgray-200"
:class="{ 'bg-neutral-50 dark:bg-coolgray-300': selected == option.value }">
<span class="text-sm" x-text="option.text"></span>
</div>
</template>
</div>
{{-- Hidden datalist for options --}}
<datalist x-ref="datalist" style="display: none;">
{{ $slot }}
</datalist>
</div>
@endif
class="flex-1 min-w-[120px] text-sm border-0 outline-none bg-transparent p-0 focus:ring-0 placeholder:text-neutral-400 dark:placeholder:text-neutral-600 text-black dark:text-white"
/>
</div>
{{-- Dropdown Options --}}
<div x-show="open && !{{ $disabled ? 'true' : 'false' }}" x-transition
class="absolute z-50 w-full mt-1 bg-white dark:bg-coolgray-100 border border-neutral-300 dark:border-coolgray-400 rounded shadow-lg max-h-60 overflow-auto scrollbar">
<template x-if="filteredOptions.length === 0">
<div class="px-3 py-2 text-sm text-neutral-500 dark:text-neutral-400">
No options found
</div>
</template>
<template x-for="option in filteredOptions" :key="option.value">
<div @click="toggleOption(option.value)"
class="px-3 py-2 cursor-pointer hover:bg-neutral-100 dark:hover:bg-coolgray-200 flex items-center gap-3"
:class="{ 'bg-neutral-50 dark:bg-coolgray-300': isSelected(option.value) }">
<input type="checkbox" :checked="isSelected(option.value)"
class="w-4 h-4 rounded border-neutral-300 dark:border-neutral-600 bg-white dark:bg-coolgray-100 text-black dark:text-white checked:bg-white dark:checked:bg-coolgray-100 focus:ring-coollabs dark:focus:ring-warning pointer-events-none"
tabindex="-1">
<span class="text-sm flex-1" x-text="option.text"></span>
</div>
</template>
</div>
{{-- Hidden datalist for options --}}
<datalist x-ref="datalist" style="display: none;">
{{ $slot }}
</datalist>
</div>
@else
{{-- Single Selection Mode with Alpine.js --}}
<div x-data="{
open: false,
search: '',
selected: @entangle(($attributes->whereStartsWith('wire:model')->first() ? $attributes->wire('model')->value() : $modelBinding)).live,
options: [],
filteredOptions: [],
init() {
this.options = Array.from(this.$refs.datalist.querySelectorAll('option')).map(opt => {
// Skip disabled options
if (opt.disabled) {
return null;
}
// Try to parse as integer, fallback to string
let value = opt.value;
const intValue = parseInt(value, 10);
if (!isNaN(intValue) && intValue.toString() === value) {
value = intValue;
}
return {
value: value,
text: opt.textContent.trim()
};
}).filter(opt => opt !== null);
this.filteredOptions = this.options;
},
filterOptions() {
if (!this.search) {
this.filteredOptions = this.options;
return;
}
const searchLower = this.search.toLowerCase();
this.filteredOptions = this.options.filter(opt =>
opt.text.toLowerCase().includes(searchLower)
);
},
selectOption(value) {
this.selected = value;
this.search = '';
this.open = false;
this.filterOptions();
},
openDropdown() {
if ({{ $disabled ? 'true' : 'false' }}) return;
this.open = true;
this.$nextTick(() => {
if (this.$refs.searchInput) {
this.$refs.searchInput.focus();
}
});
},
getSelectedText() {
if (!this.selected || this.selected === 'default') return '';
const option = this.options.find(opt => opt.value == this.selected);
return option ? option.text : this.selected;
},
isDefaultValue() {
return !this.selected || this.selected === 'default' || this.selected === '';
}
}" @click.outside="open = false" class="relative">
{{-- Hidden input for form validation --}}
<input type="hidden" :value="selected" @required($required) />
{{-- Input Container --}}
<div @click="openDropdown()"
class="flex items-center gap-2 py-1.5 w-full text-sm rounded-sm border-0 ring-2 ring-inset ring-neutral-200 dark:ring-coolgray-300 bg-white dark:bg-coolgray-100 cursor-text focus-within:border-l-4 focus-within:border-l-coollabs dark:focus-within:border-l-warning text-black dark:text-white"
:class="{
'opacity-50': {{ $disabled ? 'true' : 'false' }}
}"
wire:loading.class="opacity-50"
wire:dirty.class="dark:border-l-warning border-l-coollabs border-l-4">
{{-- Display Selected Value or Search Input --}}
<div class="flex-1 flex items-center min-w-0 px-1">
<template x-if="!isDefaultValue() && !open">
<span class="text-sm flex-1 truncate text-black dark:text-white px-2" x-text="getSelectedText()"></span>
</template>
<input type="text" x-show="isDefaultValue() || open" x-model="search" x-ref="searchInput"
@input="filterOptions()" @focus="open = true"
@keydown.escape="open = false"
:placeholder="{{ json_encode($placeholder ?: 'Search...') }}"
@readonly($readonly) @disabled($disabled) @if ($autofocus) autofocus @endif
class="flex-1 text-sm border-0 outline-none bg-transparent p-0 focus:ring-0 placeholder:text-neutral-400 dark:placeholder:text-neutral-600 text-black dark:text-white px-2" />
</div>
{{-- Dropdown Arrow --}}
<button type="button" @click.stop="open = !open" :disabled="{{ $disabled ? 'true' : 'false' }}"
class="shrink-0 text-neutral-400 px-2 {{ $disabled ? 'cursor-not-allowed' : 'cursor-pointer' }}">
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-180': open }" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
</div>
{{-- Dropdown Options --}}
<div x-show="open && !{{ $disabled ? 'true' : 'false' }}" x-transition
class="absolute z-50 w-full mt-1 bg-white dark:bg-coolgray-100 border border-neutral-300 dark:border-coolgray-400 rounded shadow-lg max-h-60 overflow-auto scrollbar">
<template x-if="filteredOptions.length === 0">
<div class="px-3 py-2 text-sm text-neutral-500 dark:text-neutral-400">
No options found
</div>
</template>
<template x-for="option in filteredOptions" :key="option.value">
<div @click="selectOption(option.value)"
class="px-3 py-2 cursor-pointer hover:bg-neutral-100 dark:hover:bg-coolgray-200"
:class="{ 'bg-neutral-50 dark:bg-coolgray-300': selected == option.value }">
<span class="text-sm" x-text="option.text"></span>
</div>
</template>
</div>
{{-- Hidden datalist for options --}}
<datalist x-ref="datalist" style="display: none;">
{{ $slot }}
</datalist>
</div>
@endif
@error($modelBinding)
<label class="label">
<span class="text-red-500 label-text-alt">{{ $message }}</span>
</label>
@enderror
</div>
@error($modelBinding)
<label class="label">
<span class="text-red-500 label-text-alt">{{ $message }}</span>
</label>
@enderror
</div>

View file

@ -191,7 +191,7 @@ class="px-2 py-1 text-xs font-bold uppercase tracking-wide bg-coollabs/10 dark:b
</div>
</div>
</x-slot:content>
<livewire:server.new.by-hetzner :private_keys="$this->privateKeys" :limit_reached="false" />
<livewire:server.new.by-hetzner :limit_reached="false" :from_onboarding="true" />
</x-modal-input>
@endif
@endcan

View file

@ -1730,6 +1730,25 @@
"minversion": "0.0.0",
"port": "7575"
},
"home-assistant": {
"documentation": "https://www.home-assistant.io/installation/linux#docker-compose?utm_source=coolify.io",
"slogan": "Open source home automation that puts local control and privacy first.",
"compose": "c2VydmljZXM6CiAgaG9tZWFzc2lzdGFudDoKICAgIGltYWdlOiAnZ2hjci5pby9ob21lLWFzc2lzdGFudC9ob21lLWFzc2lzdGFudDoyMDI1LjEwLjInCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX1VSTF9IT01FQVNTSVNUQU5UXzgxMjMKICAgICAgLSAnVFo9JHtUWjotVVRDfScKICAgICAgLSAnRElTQUJMRV9KRU1BTExPQz0ke0RJU0FCTEVfSkVNQUxMT0M6LWZhbHNlfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2hvbWVhc3Npc3RhbnQtY29uZmlnOi9jb25maWcnCiAgICAgIC0gJy9ydW4vZGJ1czovcnVuL2RidXM6cm8nCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL2NvbmZpZ3VyYXRpb24ueWFtbAogICAgICAgIHRhcmdldDogL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWwKICAgICAgICBjb250ZW50OiAiIyBMb2FkcyBkZWZhdWx0IHNldCBvZiBpbnRlZ3JhdGlvbnMuIERvIG5vdCByZW1vdmUuXG5kZWZhdWx0X2NvbmZpZzpcblxuIyBDb25maWd1cmF0aW9uIGZvciByZXZlcnNlIHByb3h5IHN1cHBvcnQgKHJlcXVpcmVkIGZvciBDb29saWZ5KVxuaHR0cDpcbiAgdXNlX3hfZm9yd2FyZGVkX2ZvcjogdHJ1ZVxuICB0cnVzdGVkX3Byb3hpZXM6XG4gICAgLSAxMC4wLjAuMC84XG4gICAgLSAxNzIuMTYuMC4wLzEyXG4gICAgLSAxOTIuMTY4LjAuMC8xNlxuICBpcF9iYW5fZW5hYmxlZDogdHJ1ZVxuICBsb2dpbl9hdHRlbXB0c190aHJlc2hvbGQ6IDUiCiAgICBwcml2aWxlZ2VkOiB0cnVlCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJy1mJwogICAgICAgIC0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODEyMycKICAgICAgaW50ZXJ2YWw6IDMwcwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMwogICAgICBzdGFydF9wZXJpb2Q6IDYwcwo=",
"tags": [
"home-automation",
"iot",
"smart-home",
"automation",
"domotics",
"mqtt",
"zigbee",
"zwave"
],
"category": "automation",
"logo": "svgs/home-assistant.svg",
"minversion": "0.0.0",
"port": "8123"
},
"homebox": {
"documentation": "https://github.com/sysadminsmedia/homebox?utm_source=coolify.io",
"slogan": "Homebox is the inventory and organization system built for the Home User.",
@ -2440,6 +2459,23 @@
"minversion": "0.0.0",
"port": "3000"
},
"metamcp": {
"documentation": "https://github.com/metatool-ai/metamcp?utm_source=coolify.io",
"slogan": "MCP Aggregator, Orchestrator, Middleware, Gateway in one app",
"compose": "c2VydmljZXM6CiAgYXBwOgogICAgaW1hZ2U6ICdnaGNyLmlvL21ldGF0b29sLWFpL21ldGFtY3A6Mi40JwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9VUkxfTUVUQU1DUF8xMjAwOAogICAgICAtICdQT1NUR1JFU19IT1NUPSR7UE9TVEdSRVNfSE9TVDotcG9zdGdyZXN9JwogICAgICAtICdQT1NUR1JFU19QT1JUPSR7UE9TVEdSRVNfUE9SVDotNTQzMn0nCiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1tZXRhbWNwX2RifScKICAgICAgLSAnREFUQUJBU0VfVVJMPXBvc3RncmVzcWw6Ly8ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU306JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfUAke1BPU1RHUkVTX0hPU1Q6LXBvc3RncmVzfToke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9LyR7UE9TVEdSRVNfREI6LW1ldGFtY3BfZGJ9JwogICAgICAtICdBUFBfVVJMPSR7U0VSVklDRV9VUkxfTUVUQU1DUH0nCiAgICAgIC0gJ05FWFRfUFVCTElDX0FQUF9VUkw9JHtTRVJWSUNFX1VSTF9NRVRBTUNQfScKICAgICAgLSAnQkVUVEVSX0FVVEhfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9BVVRIfScKICAgICAgLSAnVFJBTlNGT1JNX0xPQ0FMSE9TVF9UT19ET0NLRVJfSU5URVJOQUw9JHtUUkFOU0ZPUk1fTE9DQUxIT1NUX1RPX0RPQ0tFUl9JTlRFUk5BTDotdHJ1ZX0nCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3JlczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjEyMDA4L2hlYWx0aCcKICAgICAgaW50ZXJ2YWw6IDEwcwogICAgICB0aW1lb3V0OiA1cwogICAgICByZXRyaWVzOiA1CiAgcG9zdGdyZXM6CiAgICBpbWFnZTogJ3Bvc3RncmVzOjE2LWFscGluZScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1tZXRhbWNwX2RifScKICAgICAgLSAnUE9TVEdSRVNfVVNFUj0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICB2b2x1bWVzOgogICAgICAtICdwb3N0Z3Jlc19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30gLWQgJHtQT1NUR1JFU19EQjotbWV0YW1jcF9kYn0nCiAgICAgIGludGVydmFsOiAxMHMKICAgICAgdGltZW91dDogNXMKICAgICAgcmV0cmllczogNQo=",
"tags": [
"mcp",
"ai",
"sse",
"aggregator",
"orchestrator",
"middleware"
],
"category": "mcp",
"logo": "svgs/metamcp.png",
"minversion": "0.0.0",
"port": "12008"
},
"metube": {
"documentation": "https://github.com/alexta69/metube?utm_source=coolify.io",
"slogan": "A web GUI for youtube-dl with playlist support. It enables you to effortlessly download videos from YouTube and dozens of other sites.",
@ -3218,38 +3254,6 @@
"minversion": "0.0.0",
"port": "80"
},
"pingvinshare-with-clamav": {
"documentation": "https://github.com/stonith404/pingvin-share?utm_source=coolify.io",
"slogan": "A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.",
"compose": "c2VydmljZXM6CiAgcGluZ3ZpbnNoYXJlOgogICAgaW1hZ2U6IGdoY3IuaW8vc3Rvbml0aDQwNC9waW5ndmluLXNoYXJlCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX1VSTF9QSU5HVklOU0hBUkVfMzAwMAogICAgICAtICdUUlVTVF9QUk9YWT0ke1RSVVNUX1BST1hZOi10cnVlfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3Bpbmd2aW5zaGFyZV9kYXRhOi9vcHQvYXBwL2JhY2tlbmQvZGF0YScKICAgICAgLSAncGluZ3ZpbnNoYXJlX2ltYWdlczovb3B0L2FwcC9mcm9udGVuZC9wdWJsaWMvaW1nJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICd3Z2V0IC0tcXVpZXQgLS10cmllcz0xIC0tc3BpZGVyIGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGkvaGVhbHRoIHx8IGV4aXQgMScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogICAgZGVwZW5kc19vbjoKICAgICAgY2xhbWF2OgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgY2xhbWF2OgogICAgaW1hZ2U6IGNsYW1hdi9jbGFtYXYKICAgIHBsYXRmb3JtOiBsaW51eC9hbWQ2NAo=",
"tags": [
"self-hosted",
"file-sharing",
"files",
"cloud",
"sharing"
],
"category": "storage",
"logo": "svgs/pingvinshare.svg",
"minversion": "0.0.0",
"port": "3000"
},
"pingvinshare": {
"documentation": "https://github.com/stonith404/pingvin-share?utm_source=coolify.io",
"slogan": "A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.",
"compose": "c2VydmljZXM6CiAgcGluZ3ZpbnNoYXJlOgogICAgaW1hZ2U6IGdoY3IuaW8vc3Rvbml0aDQwNC9waW5ndmluLXNoYXJlCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX1VSTF9QSU5HVklOU0hBUkVfMzAwMAogICAgICAtICdUUlVTVF9QUk9YWT0ke1RSVVNUX1BST1hZOi10cnVlfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3Bpbmd2aW5zaGFyZV9kYXRhOi9vcHQvYXBwL2JhY2tlbmQvZGF0YScKICAgICAgLSAncGluZ3ZpbnNoYXJlX2ltYWdlczovb3B0L2FwcC9mcm9udGVuZC9wdWJsaWMvaW1nJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICd3Z2V0IC0tcXVpZXQgLS10cmllcz0xIC0tc3BpZGVyIGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGkvaGVhbHRoIHx8IGV4aXQgMScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=",
"tags": [
"self-hosted",
"file-sharing",
"files",
"cloud",
"sharing"
],
"category": "storage",
"logo": "svgs/pingvinshare.svg",
"minversion": "0.0.0",
"port": "3000"
},
"plane": {
"documentation": "https://docs.plane.so/self-hosting/methods/docker-compose?utm_source=coolify.io",
"slogan": "The open source project management tool",
@ -3302,6 +3306,45 @@
"minversion": "0.0.0",
"port": "3000"
},
"pocket-id-with-postgresql": {
"documentation": "https://pocket-id.org/docs/setup/installation?utm_source=coolify.io",
"slogan": "A simple and secure OIDC provider with passkey authentication",
"compose": "c2VydmljZXM6CiAgcG9ja2V0LWlkOgogICAgaW1hZ2U6ICdnaGNyLmlvL3BvY2tldC1pZC9wb2NrZXQtaWQ6djEuMTMnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX1VSTF9QT0NLRVRJRF8xNDExCiAgICAgIC0gJ0FQUF9VUkw9JHtTRVJWSUNFX1VSTF9QT0NLRVRJRH0nCiAgICAgIC0gJ1RSVVNUX1BST1hZPSR7VFJVU1RfUFJPWFk6LXRydWV9JwogICAgICAtIERCX1BST1ZJREVSPXBvc3RncmVzCiAgICAgIC0gJ0RCX0NPTk5FQ1RJT05fU1RSSU5HPXBvc3RncmVzcWw6Ly8ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU1FMfToke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTH1AcG9zdGdyZXNxbDo1NDMyLyR7UE9TVEdSRVNfREI6LXBvY2tldGlkfScKICAgICAgLSAnRU5DUllQVElPTl9LRVk9JHtTRVJWSUNFX1BBU1NXT1JEXzY0X1BPQ0tFVElEfScKICAgICAgLSAnS0VZU19TVE9SQUdFPSR7S0VZU19TVE9SQUdFOi1kYXRhYmFzZX0nCiAgICAgIC0gJ01BWE1JTkRfTElDRU5TRV9LRVk9JHtNQVhNSU5EX0xJQ0VOU0VfS0VZfScKICAgICAgLSAnU01UUF9IT1NUPSR7U01UUF9IT1NUfScKICAgICAgLSAnU01UUF9QT1JUPSR7U01UUF9QT1JUOi01ODd9JwogICAgICAtICdTTVRQX0ZST009JHtTTVRQX0ZST019JwogICAgICAtICdTTVRQX1VTRVI9JHtTTVRQX1VTRVJ9JwogICAgICAtICdTTVRQX1BBU1NXT1JEPSR7U01UUF9QQVNTV09SRH0nCiAgICAgIC0gJ1NNVFBfVExTPSR7U01UUF9UTFM6LXN0YXJ0dGxzfScKICAgICAgLSAnU01UUF9TS0lQX0NFUlRfVkVSSUZZPSR7U01UUF9TS0lQX0NFUlRfVkVSSUZZOi1mYWxzZX0nCiAgICAgIC0gJ0VNQUlMX0xPR0lOX05PVElGSUNBVElPTl9FTkFCTEVEPSR7RU1BSUxfTE9HSU5fTk9USUZJQ0FUSU9OX0VOQUJMRUQ6LWZhbHNlfScKICAgICAgLSAnRU1BSUxfT05FX1RJTUVfQUNDRVNTX0FTX0FETUlOX0VOQUJMRUQ9JHtFTUFJTF9PTkVfVElNRV9BQ0NFU1NfQVNfQURNSU5fRU5BQkxFRDotZmFsc2V9JwogICAgICAtICdFTUFJTF9BUElfS0VZX0VYUElSQVRJT05fRU5BQkxFRD0ke0VNQUlMX0FQSV9LRVlfRVhQSVJBVElPTl9FTkFCTEVEOi1mYWxzZX0nCiAgICAgIC0gJ1BVSUQ9JHtQVUlEOi0xMDAwfScKICAgICAgLSAnUEdJRD0ke1BHSUQ6LTEwMDB9JwogICAgdm9sdW1lczoKICAgICAgLSAncG9ja2V0LWlkLWRhdGE6L2FwcC9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIC9hcHAvcG9ja2V0LWlkCiAgICAgICAgLSBoZWFsdGhjaGVjawogICAgICBpbnRlcnZhbDogMzBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDMKICAgICAgc3RhcnRfcGVyaW9kOiAxMHMKICAgIGRlcGVuZHNfb246CiAgICAgIHBvc3RncmVzcWw6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICBwb3N0Z3Jlc3FsOgogICAgaW1hZ2U6ICdwb3N0Z3JlczoxNi1hbHBpbmUnCiAgICB2b2x1bWVzOgogICAgICAtICdwb2NrZXQtaWQtcG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTUUx9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LXBvY2tldGlkfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK",
"tags": [
"identity",
"oidc",
"oauth",
"passkey",
"webauthn",
"authentication",
"sso",
"openid",
"postgresql"
],
"category": "auth",
"logo": "svgs/pocketid-logo.png",
"minversion": "0.0.0",
"port": "1411"
},
"pocket-id": {
"documentation": "https://pocket-id.org/docs/setup/installation?utm_source=coolify.io",
"slogan": "A simple and secure OIDC provider with passkey authentication",
"compose": "c2VydmljZXM6CiAgcG9ja2V0LWlkOgogICAgaW1hZ2U6ICdnaGNyLmlvL3BvY2tldC1pZC9wb2NrZXQtaWQ6djEuMTMnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX1VSTF9QT0NLRVRJRF8xNDExCiAgICAgIC0gJ0FQUF9VUkw9JHtTRVJWSUNFX1VSTF9QT0NLRVRJRH0nCiAgICAgIC0gJ1RSVVNUX1BST1hZPSR7VFJVU1RfUFJPWFk6LXRydWV9JwogICAgICAtICdNQVhNSU5EX0xJQ0VOU0VfS0VZPSR7TUFYTUlORF9MSUNFTlNFX0tFWX0nCiAgICAgIC0gJ1NNVFBfSE9TVD0ke1NNVFBfSE9TVH0nCiAgICAgIC0gJ1NNVFBfUE9SVD0ke1NNVFBfUE9SVDotNTg3fScKICAgICAgLSAnU01UUF9GUk9NPSR7U01UUF9GUk9NfScKICAgICAgLSAnU01UUF9VU0VSPSR7U01UUF9VU0VSfScKICAgICAgLSAnU01UUF9QQVNTV09SRD0ke1NNVFBfUEFTU1dPUkR9JwogICAgICAtICdTTVRQX1RMUz0ke1NNVFBfVExTOi1zdGFydHRsc30nCiAgICAgIC0gJ1NNVFBfU0tJUF9DRVJUX1ZFUklGWT0ke1NNVFBfU0tJUF9DRVJUX1ZFUklGWTotZmFsc2V9JwogICAgICAtICdFTUFJTF9MT0dJTl9OT1RJRklDQVRJT05fRU5BQkxFRD0ke0VNQUlMX0xPR0lOX05PVElGSUNBVElPTl9FTkFCTEVEOi1mYWxzZX0nCiAgICAgIC0gJ0VNQUlMX09ORV9USU1FX0FDQ0VTU19BU19BRE1JTl9FTkFCTEVEPSR7RU1BSUxfT05FX1RJTUVfQUNDRVNTX0FTX0FETUlOX0VOQUJMRUQ6LWZhbHNlfScKICAgICAgLSAnRU1BSUxfQVBJX0tFWV9FWFBJUkFUSU9OX0VOQUJMRUQ9JHtFTUFJTF9BUElfS0VZX0VYUElSQVRJT05fRU5BQkxFRDotZmFsc2V9JwogICAgICAtICdQVUlEPSR7UFVJRDotMTAwMH0nCiAgICAgIC0gJ1BHSUQ9JHtQR0lEOi0xMDAwfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3BvY2tldC1pZC1kYXRhOi9hcHAvZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSAvYXBwL3BvY2tldC1pZAogICAgICAgIC0gaGVhbHRoY2hlY2sKICAgICAgaW50ZXJ2YWw6IDMwcwogICAgICB0aW1lb3V0OiA1cwogICAgICByZXRyaWVzOiAzCiAgICAgIHN0YXJ0X3BlcmlvZDogMTBzCg==",
"tags": [
"identity",
"oidc",
"oauth",
"passkey",
"webauthn",
"authentication",
"sso",
"openid"
],
"category": "auth",
"logo": "svgs/pocketid-logo.png",
"minversion": "0.0.0",
"port": "1411"
},
"pocketbase": {
"documentation": "https://pocketbase.io/docs/?utm_source=coolify.io",
"slogan": "Open Source backend for your next SaaS and Mobile app in 1 file",
@ -3554,6 +3597,22 @@
"minversion": "0.0.0",
"port": "8000"
},
"redis-insight": {
"documentation": "https://redis.io/docs/latest/operate/redisinsight/?utm_source=coolify.io",
"slogan": "Redis Insight lets you do both GUI- and CLI-based interactions in a fully-featured desktop GUI client.",
"compose": "c2VydmljZXM6CiAgcmVkaXNpbnNpZ2h0OgogICAgaW1hZ2U6ICdyZWRpcy9yZWRpc2luc2lnaHQ6Mi43MCcKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfVVJMX1JFRElTSU5TSUdIVF81NTQwCiAgICAgIC0gUklfQVBQX0hPU1Q9MC4wLjAuMAogICAgICAtIFJJX0FQUF9QT1JUPTU1NDAKICAgICAgLSAnUklfRU5DUllQVElPTl9LRVk9JHtTRVJWSUNFX1BBU1NXT1JEX1JJX0VOQ1JZUFRJT05fS0VZfScKICAgICAgLSAnUklfTE9HX0xFVkVMPSR7UklfTE9HX0xFVkVMOi1pbmZvfScKICAgICAgLSAnUklfRklMRVNfTE9HR0VSPSR7UklfRklMRVNfTE9HR0VSOi10cnVlfScKICAgICAgLSAnUklfU1RET1VUX0xPR0dFUj0ke1JJX1NURE9VVF9MT0dHRVI6LXRydWV9JwogICAgdm9sdW1lczoKICAgICAgLSAncmVkaXNfaW5zaWdodF9kYXRhOi9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHdnZXQKICAgICAgICAtICctLXNwaWRlcicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjU1NDAnCiAgICAgIGludGVydmFsOiAxMHMKICAgICAgcmV0cmllczogMwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgc3RhcnRfcGVyaW9kOiAxMHMK",
"tags": [
"redis",
"gui",
"database",
"monitoring",
"analytics"
],
"category": "database,observability,developer-tools",
"logo": "svgs/redisinsight.png",
"minversion": "0.0.0",
"port": "5540"
},
"redlib": {
"documentation": "https://github.com/redlib-org/redlib?utm_source=coolify.io",
"slogan": "An alternative private front-end to Reddit, with its origins in Libreddit.",
@ -3567,6 +3626,23 @@
"minversion": "0.0.0",
"port": "8080"
},
"rivet-engine": {
"documentation": "https://www.rivet.dev/docs?utm_source=coolify.io",
"slogan": "Build and scale stateful workloads with long-lived processes",
"compose": "c2VydmljZXM6CiAgcml2ZXQtZW5naW5lOgogICAgaW1hZ2U6ICdyaXZldGtpdC9lbmdpbmU6MjUuOC4wJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9VUkxfUklWRVRfNjQyMAogICAgICAtICdSSVZFVF9fQVVUSF9fQURNSU5fVE9LRU49JHtTRVJWSUNFX1BBU1NXT1JEX1JJVkVUfScKICAgICAgLSAnUklWRVRfX1BPU1RHUkVTX19VUkw9cG9zdGdyZXNxbDovLyRTRVJWSUNFX1VTRVJfUE9TVEdSRVNRTDokU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMQHBvc3RncmVzcWw6NTQzMi8ke1BPU1RHUkVTUUxfREFUQUJBU0Utcml2ZXR9JwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXNxbDoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vMTI3LjAuMC4xOjY0MjAvaGVhbHRoJwogICAgICBpbnRlcnZhbDogMnMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDEwCiAgICAgIHN0YXJ0X3BlcmlvZDogMzBzCiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTctYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncml2ZXQtcG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTUUx9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNRTF9EQVRBQkFTRS1yaXZldH0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==",
"tags": [
"stateful",
"actors",
"realtime",
"backend",
"serverless",
"postgresql"
],
"category": "development",
"logo": "svgs/rivet.svg",
"minversion": "0.0.0",
"port": "6420"
},
"rocketchat": {
"documentation": "https://github.com/RocketChat/Rocket.Chat?utm_source=coolify.io",
"slogan": "Self-hosted, secure and highly customizable open-source communication platform for organizations with sophisticated security and privacy concerns.",
@ -3706,6 +3782,20 @@
"minversion": "0.0.0",
"port": "8080"
},
"siyuan": {
"documentation": "https://github.com/siyuan-note/siyuan?utm_source=coolify.io",
"slogan": "A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang.",
"compose": "c2VydmljZXM6CiAgc2l5dWFuOgogICAgaW1hZ2U6ICdiM2xvZy9zaXl1YW46djMuMy41JwogICAgdm9sdW1lczoKICAgICAgLSAnc2l5dWFuX3dvcmtzcGFjZTovc2l5dWFuL3dvcmtzcGFjZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfVVJMX1NJWVVBTl82ODA2CiAgICAgIC0gJ1RaPSR7VFo6LVVUQ30nCiAgICAgIC0gUFVJRD0xMDAwCiAgICAgIC0gUEdJRD0xMDAwCiAgICAgIC0gJ1NJWVVBTl9BQ0NFU1NfQVVUSF9DT0RFPSR7U0VSVklDRV9QQVNTV09SRF9TSVlVQU59JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHdnZXQKICAgICAgICAtICctLXNwaWRlcicKICAgICAgICAtICctLXF1aWV0JwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjE6NjgwNi9hcGkvc3lzdGVtL3ZlcnNpb24nCiAgICAgIGludGVydmFsOiAxNXMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDUKICAgICAgc3RhcnRfcGVyaW9kOiAyMHMK",
"tags": [
"note-taking",
"markdown",
"pkm"
],
"category": null,
"logo": "svgs/siyuan.svg",
"minversion": "0.0.0",
"port": "6806"
},
"slash": {
"documentation": "https://github.com/yourselfhosted/slash?utm_source=coolify.io",
"slogan": "An open source, self-hosted links shortener and sharing platform.",
@ -3769,6 +3859,23 @@
"minversion": "0.0.0",
"port": "8989"
},
"sparkyfitness": {
"documentation": "https://codewithcj.github.io/SparkyFitness/?utm_source=coolify.io",
"slogan": "SparkyFitness is a comprehensive fitness tracking and management application designed to help users monitor their nutrition, exercise, and body measurements. It provides tools for daily progress tracking, goal setting, and insightful reports to support a healthy lifestyle.",
"compose": "c2VydmljZXM6CiAgc3Bhcmt5Zml0bmVzcy1mcm9udGVuZDoKICAgIGltYWdlOiAnY29kZXdpdGhjai9zcGFya3lmaXRuZXNzOnYwLjE1LjcuMycKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfVVJMX1NQQVJLWUZJVE5FU1NfODAKICAgIGRlcGVuZHNfb246CiAgICAgIC0gc3Bhcmt5Zml0bmVzcy1zZXJ2ZXIKICBzcGFya3lmaXRuZXNzLXNlcnZlcjoKICAgIGltYWdlOiAnY29kZXdpdGhjai9zcGFya3lmaXRuZXNzX3NlcnZlcjp2MC4xNS43LjMnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfTE9HX0xFVkVMPSR7U1BBUktZX0ZJVE5FU1NfTE9HX0xFVkVMOi1pbmZvfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfREJfVVNFUj0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30nCiAgICAgIC0gU1BBUktZX0ZJVE5FU1NfREJfSE9TVD1zcGFya3lmaXRuZXNzLWRiCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0RCX05BTUU9JHtTUEFSS1lfRklUTkVTU19EQl9OQU1FOi1zcGFya3lmaXRuZXNzfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfREJfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfREJfUE9SVD0ke1NQQVJLWV9GSVRORVNTX0RCX1BPUlQ6LTU0MzJ9JwogICAgICAtICdTUEFSS1lfRklUTkVTU19BUElfRU5DUllQVElPTl9LRVk9JHtTRVJWSUNFX1BBU1NXT1JEXzY0X1NFUlZFUkFQSUVOQ1JZUFRJT05LRVl9JwogICAgICAtICdKV1RfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF82NF9TRVJWRVJKV1RTRUNSRVR9JwogICAgICAtICdTUEFSS1lfRklUTkVTU19GUk9OVEVORF9VUkw9JHtTRVJWSUNFX1VSTF9TUEFSS1lGSVRORVNTXzgwfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfRElTQUJMRV9TSUdOVVA9JHtTUEFSS1lfRklUTkVTU19ESVNBQkxFX1NJR05VUDotZmFsc2V9JwogICAgICAtICdTUEFSS1lfRklUTkVTU19BRE1JTl9FTUFJTD0ke1NQQVJLWV9GSVRORVNTX0FETUlOX0VNQUlMOi1hZG1pbkBleGFtcGxlLmNvbX0nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0VNQUlMX0hPU1Q9JHtTUEFSS1lfRklUTkVTU19FTUFJTF9IT1NUOi1zbXRwLmdtYWlsLmNvbX0nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0VNQUlMX1BPUlQ9JHtTUEFSS1lfRklUTkVTU19FTUFJTF9QT1JUOi01ODd9JwogICAgICAtICdTUEFSS1lfRklUTkVTU19FTUFJTF9TRUNVUkU9JHtTUEFSS1lfRklUTkVTU19FTUFJTF9TRUNVUkU6LWZhbHNlfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfRU1BSUxfVVNFUj0ke1NQQVJLWV9GSVRORVNTX0VNQUlMX1VTRVJ9JwogICAgICAtICdTUEFSS1lfRklUTkVTU19FTUFJTF9QQVNTPSR7U1BBUktZX0ZJVE5FU1NfRU1BSUxfUEFTU30nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0VNQUlMX0ZST009JHtTUEFSS1lfRklUTkVTU19FTUFJTF9GUk9NOi0iU3Bhcmt5IEZpdG5lc3MgPG5vcmVwbHlAc3Bhcmt5Zml0bmVzcy5jb20+In0nCiAgICBkZXBlbmRzX29uOgogICAgICAtIHNwYXJreWZpdG5lc3MtZGIKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3NwYXJreWZpdG5lc3Mtc2VydmVyLWJhY2t1cDovYXBwL1NwYXJreUZpdG5lc3NTZXJ2ZXIvYmFja3VwJwogICAgICAtICdzcGFya3lmaXRuZXNzLXNlcnZlci11cGxvYWRzOi9hcHAvU3Bhcmt5Rml0bmVzc1NlcnZlci91cGxvYWRzJwogIHNwYXJreWZpdG5lc3MtZGI6CiAgICBpbWFnZTogJ3Bvc3RncmVzOjE1LWFscGluZScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19EQj0ke1NQQVJLWV9GSVRORVNTX0RCX05BTUU6LXNwYXJreWZpdG5lc3N9JwogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfUE9SVD0ke1NQQVJLWV9GSVRORVNTX0RCX1BPUlQ6LTU0MzJ9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogICAgdm9sdW1lczoKICAgICAgLSAnc3Bhcmt5Zml0bmVzcy1kYi1wb3N0Z3Jlc3FsOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScK",
"tags": [
"sparkyfitness",
"fitness",
"health",
"nutrition",
"exercise",
"body measurements"
],
"category": "health",
"logo": "svgs/sparkyfitness.svg",
"minversion": "0.0.0",
"port": "80"
},
"statusnook": {
"documentation": "https://statusnook.com?utm_source=coolify.io",
"slogan": "Effortlessly deploy a status page and start monitoring endpoints in minutes",

View file

@ -1730,6 +1730,25 @@
"minversion": "0.0.0",
"port": "7575"
},
"home-assistant": {
"documentation": "https://www.home-assistant.io/installation/linux#docker-compose?utm_source=coolify.io",
"slogan": "Open source home automation that puts local control and privacy first.",
"compose": "c2VydmljZXM6CiAgaG9tZWFzc2lzdGFudDoKICAgIGltYWdlOiAnZ2hjci5pby9ob21lLWFzc2lzdGFudC9ob21lLWFzc2lzdGFudDoyMDI1LjEwLjInCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fSE9NRUFTU0lTVEFOVF84MTIzCiAgICAgIC0gJ1RaPSR7VFo6LVVUQ30nCiAgICAgIC0gJ0RJU0FCTEVfSkVNQUxMT0M9JHtESVNBQkxFX0pFTUFMTE9DOi1mYWxzZX0nCiAgICB2b2x1bWVzOgogICAgICAtICdob21lYXNzaXN0YW50LWNvbmZpZzovY29uZmlnJwogICAgICAtICcvcnVuL2RidXM6L3J1bi9kYnVzOnJvJwogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9jb25maWd1cmF0aW9uLnlhbWwKICAgICAgICB0YXJnZXQ6IC9jb25maWcvY29uZmlndXJhdGlvbi55YW1sCiAgICAgICAgY29udGVudDogIiMgTG9hZHMgZGVmYXVsdCBzZXQgb2YgaW50ZWdyYXRpb25zLiBEbyBub3QgcmVtb3ZlLlxuZGVmYXVsdF9jb25maWc6XG5cbiMgQ29uZmlndXJhdGlvbiBmb3IgcmV2ZXJzZSBwcm94eSBzdXBwb3J0IChyZXF1aXJlZCBmb3IgQ29vbGlmeSlcbmh0dHA6XG4gIHVzZV94X2ZvcndhcmRlZF9mb3I6IHRydWVcbiAgdHJ1c3RlZF9wcm94aWVzOlxuICAgIC0gMTAuMC4wLjAvOFxuICAgIC0gMTcyLjE2LjAuMC8xMlxuICAgIC0gMTkyLjE2OC4wLjAvMTZcbiAgaXBfYmFuX2VuYWJsZWQ6IHRydWVcbiAgbG9naW5fYXR0ZW1wdHNfdGhyZXNob2xkOiA1IgogICAgcHJpdmlsZWdlZDogdHJ1ZQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjgxMjMnCiAgICAgIGludGVydmFsOiAzMHMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDMKICAgICAgc3RhcnRfcGVyaW9kOiA2MHMK",
"tags": [
"home-automation",
"iot",
"smart-home",
"automation",
"domotics",
"mqtt",
"zigbee",
"zwave"
],
"category": "automation",
"logo": "svgs/home-assistant.svg",
"minversion": "0.0.0",
"port": "8123"
},
"homebox": {
"documentation": "https://github.com/sysadminsmedia/homebox?utm_source=coolify.io",
"slogan": "Homebox is the inventory and organization system built for the Home User.",
@ -2440,6 +2459,23 @@
"minversion": "0.0.0",
"port": "3000"
},
"metamcp": {
"documentation": "https://github.com/metatool-ai/metamcp?utm_source=coolify.io",
"slogan": "MCP Aggregator, Orchestrator, Middleware, Gateway in one app",
"compose": "c2VydmljZXM6CiAgYXBwOgogICAgaW1hZ2U6ICdnaGNyLmlvL21ldGF0b29sLWFpL21ldGFtY3A6Mi40JwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX01FVEFNQ1BfMTIwMDgKICAgICAgLSAnUE9TVEdSRVNfSE9TVD0ke1BPU1RHUkVTX0hPU1Q6LXBvc3RncmVzfScKICAgICAgLSAnUE9TVEdSRVNfUE9SVD0ke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9JwogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotbWV0YW1jcF9kYn0nCiAgICAgIC0gJ0RBVEFCQVNFX1VSTD1wb3N0Z3Jlc3FsOi8vJHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9OiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU31AJHtQT1NUR1JFU19IT1NUOi1wb3N0Z3Jlc306JHtQT1NUR1JFU19QT1JUOi01NDMyfS8ke1BPU1RHUkVTX0RCOi1tZXRhbWNwX2RifScKICAgICAgLSAnQVBQX1VSTD0ke1NFUlZJQ0VfRlFETl9NRVRBTUNQfScKICAgICAgLSAnTkVYVF9QVUJMSUNfQVBQX1VSTD0ke1NFUlZJQ0VfRlFETl9NRVRBTUNQfScKICAgICAgLSAnQkVUVEVSX0FVVEhfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9BVVRIfScKICAgICAgLSAnVFJBTlNGT1JNX0xPQ0FMSE9TVF9UT19ET0NLRVJfSU5URVJOQUw9JHtUUkFOU0ZPUk1fTE9DQUxIT1NUX1RPX0RPQ0tFUl9JTlRFUk5BTDotdHJ1ZX0nCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3JlczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjEyMDA4L2hlYWx0aCcKICAgICAgaW50ZXJ2YWw6IDEwcwogICAgICB0aW1lb3V0OiA1cwogICAgICByZXRyaWVzOiA1CiAgcG9zdGdyZXM6CiAgICBpbWFnZTogJ3Bvc3RncmVzOjE2LWFscGluZScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1tZXRhbWNwX2RifScKICAgICAgLSAnUE9TVEdSRVNfVVNFUj0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICB2b2x1bWVzOgogICAgICAtICdwb3N0Z3Jlc19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30gLWQgJHtQT1NUR1JFU19EQjotbWV0YW1jcF9kYn0nCiAgICAgIGludGVydmFsOiAxMHMKICAgICAgdGltZW91dDogNXMKICAgICAgcmV0cmllczogNQo=",
"tags": [
"mcp",
"ai",
"sse",
"aggregator",
"orchestrator",
"middleware"
],
"category": "mcp",
"logo": "svgs/metamcp.png",
"minversion": "0.0.0",
"port": "12008"
},
"metube": {
"documentation": "https://github.com/alexta69/metube?utm_source=coolify.io",
"slogan": "A web GUI for youtube-dl with playlist support. It enables you to effortlessly download videos from YouTube and dozens of other sites.",
@ -3218,38 +3254,6 @@
"minversion": "0.0.0",
"port": "80"
},
"pingvinshare-with-clamav": {
"documentation": "https://github.com/stonith404/pingvin-share?utm_source=coolify.io",
"slogan": "A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.",
"compose": "c2VydmljZXM6CiAgcGluZ3ZpbnNoYXJlOgogICAgaW1hZ2U6IGdoY3IuaW8vc3Rvbml0aDQwNC9waW5ndmluLXNoYXJlCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fUElOR1ZJTlNIQVJFXzMwMDAKICAgICAgLSAnVFJVU1RfUFJPWFk9JHtUUlVTVF9QUk9YWTotdHJ1ZX0nCiAgICB2b2x1bWVzOgogICAgICAtICdwaW5ndmluc2hhcmVfZGF0YTovb3B0L2FwcC9iYWNrZW5kL2RhdGEnCiAgICAgIC0gJ3Bpbmd2aW5zaGFyZV9pbWFnZXM6L29wdC9hcHAvZnJvbnRlbmQvcHVibGljL2ltZycKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAnd2dldCAtLXF1aWV0IC0tdHJpZXM9MSAtLXNwaWRlciBodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpL2hlYWx0aCB8fCBleGl0IDEnCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAKICAgIGRlcGVuZHNfb246CiAgICAgIGNsYW1hdjoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogIGNsYW1hdjoKICAgIGltYWdlOiBjbGFtYXYvY2xhbWF2CiAgICBwbGF0Zm9ybTogbGludXgvYW1kNjQK",
"tags": [
"self-hosted",
"file-sharing",
"files",
"cloud",
"sharing"
],
"category": "storage",
"logo": "svgs/pingvinshare.svg",
"minversion": "0.0.0",
"port": "3000"
},
"pingvinshare": {
"documentation": "https://github.com/stonith404/pingvin-share?utm_source=coolify.io",
"slogan": "A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.",
"compose": "c2VydmljZXM6CiAgcGluZ3ZpbnNoYXJlOgogICAgaW1hZ2U6IGdoY3IuaW8vc3Rvbml0aDQwNC9waW5ndmluLXNoYXJlCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fUElOR1ZJTlNIQVJFXzMwMDAKICAgICAgLSAnVFJVU1RfUFJPWFk9JHtUUlVTVF9QUk9YWTotdHJ1ZX0nCiAgICB2b2x1bWVzOgogICAgICAtICdwaW5ndmluc2hhcmVfZGF0YTovb3B0L2FwcC9iYWNrZW5kL2RhdGEnCiAgICAgIC0gJ3Bpbmd2aW5zaGFyZV9pbWFnZXM6L29wdC9hcHAvZnJvbnRlbmQvcHVibGljL2ltZycKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAnd2dldCAtLXF1aWV0IC0tdHJpZXM9MSAtLXNwaWRlciBodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpL2hlYWx0aCB8fCBleGl0IDEnCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK",
"tags": [
"self-hosted",
"file-sharing",
"files",
"cloud",
"sharing"
],
"category": "storage",
"logo": "svgs/pingvinshare.svg",
"minversion": "0.0.0",
"port": "3000"
},
"plane": {
"documentation": "https://docs.plane.so/self-hosting/methods/docker-compose?utm_source=coolify.io",
"slogan": "The open source project management tool",
@ -3302,6 +3306,45 @@
"minversion": "0.0.0",
"port": "3000"
},
"pocket-id-with-postgresql": {
"documentation": "https://pocket-id.org/docs/setup/installation?utm_source=coolify.io",
"slogan": "A simple and secure OIDC provider with passkey authentication",
"compose": "c2VydmljZXM6CiAgcG9ja2V0LWlkOgogICAgaW1hZ2U6ICdnaGNyLmlvL3BvY2tldC1pZC9wb2NrZXQtaWQ6djEuMTMnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fUE9DS0VUSURfMTQxMQogICAgICAtICdBUFBfVVJMPSR7U0VSVklDRV9GUUROX1BPQ0tFVElEfScKICAgICAgLSAnVFJVU1RfUFJPWFk9JHtUUlVTVF9QUk9YWTotdHJ1ZX0nCiAgICAgIC0gREJfUFJPVklERVI9cG9zdGdyZXMKICAgICAgLSAnREJfQ09OTkVDVElPTl9TVFJJTkc9cG9zdGdyZXNxbDovLyR7U0VSVklDRV9VU0VSX1BPU1RHUkVTUUx9OiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMfUBwb3N0Z3Jlc3FsOjU0MzIvJHtQT1NUR1JFU19EQjotcG9ja2V0aWR9JwogICAgICAtICdFTkNSWVBUSU9OX0tFWT0ke1NFUlZJQ0VfUEFTU1dPUkRfNjRfUE9DS0VUSUR9JwogICAgICAtICdLRVlTX1NUT1JBR0U9JHtLRVlTX1NUT1JBR0U6LWRhdGFiYXNlfScKICAgICAgLSAnTUFYTUlORF9MSUNFTlNFX0tFWT0ke01BWE1JTkRfTElDRU5TRV9LRVl9JwogICAgICAtICdTTVRQX0hPU1Q9JHtTTVRQX0hPU1R9JwogICAgICAtICdTTVRQX1BPUlQ9JHtTTVRQX1BPUlQ6LTU4N30nCiAgICAgIC0gJ1NNVFBfRlJPTT0ke1NNVFBfRlJPTX0nCiAgICAgIC0gJ1NNVFBfVVNFUj0ke1NNVFBfVVNFUn0nCiAgICAgIC0gJ1NNVFBfUEFTU1dPUkQ9JHtTTVRQX1BBU1NXT1JEfScKICAgICAgLSAnU01UUF9UTFM9JHtTTVRQX1RMUzotc3RhcnR0bHN9JwogICAgICAtICdTTVRQX1NLSVBfQ0VSVF9WRVJJRlk9JHtTTVRQX1NLSVBfQ0VSVF9WRVJJRlk6LWZhbHNlfScKICAgICAgLSAnRU1BSUxfTE9HSU5fTk9USUZJQ0FUSU9OX0VOQUJMRUQ9JHtFTUFJTF9MT0dJTl9OT1RJRklDQVRJT05fRU5BQkxFRDotZmFsc2V9JwogICAgICAtICdFTUFJTF9PTkVfVElNRV9BQ0NFU1NfQVNfQURNSU5fRU5BQkxFRD0ke0VNQUlMX09ORV9USU1FX0FDQ0VTU19BU19BRE1JTl9FTkFCTEVEOi1mYWxzZX0nCiAgICAgIC0gJ0VNQUlMX0FQSV9LRVlfRVhQSVJBVElPTl9FTkFCTEVEPSR7RU1BSUxfQVBJX0tFWV9FWFBJUkFUSU9OX0VOQUJMRUQ6LWZhbHNlfScKICAgICAgLSAnUFVJRD0ke1BVSUQ6LTEwMDB9JwogICAgICAtICdQR0lEPSR7UEdJRDotMTAwMH0nCiAgICB2b2x1bWVzOgogICAgICAtICdwb2NrZXQtaWQtZGF0YTovYXBwL2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gL2FwcC9wb2NrZXQtaWQKICAgICAgICAtIGhlYWx0aGNoZWNrCiAgICAgIGludGVydmFsOiAzMHMKICAgICAgdGltZW91dDogNXMKICAgICAgcmV0cmllczogMwogICAgICBzdGFydF9wZXJpb2Q6IDEwcwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXNxbDoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogIHBvc3RncmVzcWw6CiAgICBpbWFnZTogJ3Bvc3RncmVzOjE2LWFscGluZScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3BvY2tldC1pZC1wb3N0Z3Jlc3FsLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotcG9ja2V0aWR9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=",
"tags": [
"identity",
"oidc",
"oauth",
"passkey",
"webauthn",
"authentication",
"sso",
"openid",
"postgresql"
],
"category": "auth",
"logo": "svgs/pocketid-logo.png",
"minversion": "0.0.0",
"port": "1411"
},
"pocket-id": {
"documentation": "https://pocket-id.org/docs/setup/installation?utm_source=coolify.io",
"slogan": "A simple and secure OIDC provider with passkey authentication",
"compose": "c2VydmljZXM6CiAgcG9ja2V0LWlkOgogICAgaW1hZ2U6ICdnaGNyLmlvL3BvY2tldC1pZC9wb2NrZXQtaWQ6djEuMTMnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fUE9DS0VUSURfMTQxMQogICAgICAtICdBUFBfVVJMPSR7U0VSVklDRV9GUUROX1BPQ0tFVElEfScKICAgICAgLSAnVFJVU1RfUFJPWFk9JHtUUlVTVF9QUk9YWTotdHJ1ZX0nCiAgICAgIC0gJ01BWE1JTkRfTElDRU5TRV9LRVk9JHtNQVhNSU5EX0xJQ0VOU0VfS0VZfScKICAgICAgLSAnU01UUF9IT1NUPSR7U01UUF9IT1NUfScKICAgICAgLSAnU01UUF9QT1JUPSR7U01UUF9QT1JUOi01ODd9JwogICAgICAtICdTTVRQX0ZST009JHtTTVRQX0ZST019JwogICAgICAtICdTTVRQX1VTRVI9JHtTTVRQX1VTRVJ9JwogICAgICAtICdTTVRQX1BBU1NXT1JEPSR7U01UUF9QQVNTV09SRH0nCiAgICAgIC0gJ1NNVFBfVExTPSR7U01UUF9UTFM6LXN0YXJ0dGxzfScKICAgICAgLSAnU01UUF9TS0lQX0NFUlRfVkVSSUZZPSR7U01UUF9TS0lQX0NFUlRfVkVSSUZZOi1mYWxzZX0nCiAgICAgIC0gJ0VNQUlMX0xPR0lOX05PVElGSUNBVElPTl9FTkFCTEVEPSR7RU1BSUxfTE9HSU5fTk9USUZJQ0FUSU9OX0VOQUJMRUQ6LWZhbHNlfScKICAgICAgLSAnRU1BSUxfT05FX1RJTUVfQUNDRVNTX0FTX0FETUlOX0VOQUJMRUQ9JHtFTUFJTF9PTkVfVElNRV9BQ0NFU1NfQVNfQURNSU5fRU5BQkxFRDotZmFsc2V9JwogICAgICAtICdFTUFJTF9BUElfS0VZX0VYUElSQVRJT05fRU5BQkxFRD0ke0VNQUlMX0FQSV9LRVlfRVhQSVJBVElPTl9FTkFCTEVEOi1mYWxzZX0nCiAgICAgIC0gJ1BVSUQ9JHtQVUlEOi0xMDAwfScKICAgICAgLSAnUEdJRD0ke1BHSUQ6LTEwMDB9JwogICAgdm9sdW1lczoKICAgICAgLSAncG9ja2V0LWlkLWRhdGE6L2FwcC9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIC9hcHAvcG9ja2V0LWlkCiAgICAgICAgLSBoZWFsdGhjaGVjawogICAgICBpbnRlcnZhbDogMzBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDMKICAgICAgc3RhcnRfcGVyaW9kOiAxMHMK",
"tags": [
"identity",
"oidc",
"oauth",
"passkey",
"webauthn",
"authentication",
"sso",
"openid"
],
"category": "auth",
"logo": "svgs/pocketid-logo.png",
"minversion": "0.0.0",
"port": "1411"
},
"pocketbase": {
"documentation": "https://pocketbase.io/docs/?utm_source=coolify.io",
"slogan": "Open Source backend for your next SaaS and Mobile app in 1 file",
@ -3554,6 +3597,22 @@
"minversion": "0.0.0",
"port": "8000"
},
"redis-insight": {
"documentation": "https://redis.io/docs/latest/operate/redisinsight/?utm_source=coolify.io",
"slogan": "Redis Insight lets you do both GUI- and CLI-based interactions in a fully-featured desktop GUI client.",
"compose": "c2VydmljZXM6CiAgcmVkaXNpbnNpZ2h0OgogICAgaW1hZ2U6ICdyZWRpcy9yZWRpc2luc2lnaHQ6Mi43MCcKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9SRURJU0lOU0lHSFRfNTU0MAogICAgICAtIFJJX0FQUF9IT1NUPTAuMC4wLjAKICAgICAgLSBSSV9BUFBfUE9SVD01NTQwCiAgICAgIC0gJ1JJX0VOQ1JZUFRJT05fS0VZPSR7U0VSVklDRV9QQVNTV09SRF9SSV9FTkNSWVBUSU9OX0tFWX0nCiAgICAgIC0gJ1JJX0xPR19MRVZFTD0ke1JJX0xPR19MRVZFTDotaW5mb30nCiAgICAgIC0gJ1JJX0ZJTEVTX0xPR0dFUj0ke1JJX0ZJTEVTX0xPR0dFUjotdHJ1ZX0nCiAgICAgIC0gJ1JJX1NURE9VVF9MT0dHRVI9JHtSSV9TVERPVVRfTE9HR0VSOi10cnVlfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3JlZGlzX2luc2lnaHRfZGF0YTovZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSB3Z2V0CiAgICAgICAgLSAnLS1zcGlkZXInCiAgICAgICAgLSAnaHR0cDovL2xvY2FsaG9zdDo1NTQwJwogICAgICBpbnRlcnZhbDogMTBzCiAgICAgIHJldHJpZXM6IDMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHN0YXJ0X3BlcmlvZDogMTBzCg==",
"tags": [
"redis",
"gui",
"database",
"monitoring",
"analytics"
],
"category": "database,observability,developer-tools",
"logo": "svgs/redisinsight.png",
"minversion": "0.0.0",
"port": "5540"
},
"redlib": {
"documentation": "https://github.com/redlib-org/redlib?utm_source=coolify.io",
"slogan": "An alternative private front-end to Reddit, with its origins in Libreddit.",
@ -3567,6 +3626,23 @@
"minversion": "0.0.0",
"port": "8080"
},
"rivet-engine": {
"documentation": "https://www.rivet.dev/docs?utm_source=coolify.io",
"slogan": "Build and scale stateful workloads with long-lived processes",
"compose": "c2VydmljZXM6CiAgcml2ZXQtZW5naW5lOgogICAgaW1hZ2U6ICdyaXZldGtpdC9lbmdpbmU6MjUuOC4wJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX1JJVkVUXzY0MjAKICAgICAgLSAnUklWRVRfX0FVVEhfX0FETUlOX1RPS0VOPSR7U0VSVklDRV9QQVNTV09SRF9SSVZFVH0nCiAgICAgIC0gJ1JJVkVUX19QT1NUR1JFU19fVVJMPXBvc3RncmVzcWw6Ly8kU0VSVklDRV9VU0VSX1BPU1RHUkVTUUw6JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTEBwb3N0Z3Jlc3FsOjU0MzIvJHtQT1NUR1JFU1FMX0RBVEFCQVNFLXJpdmV0fScKICAgIGRlcGVuZHNfb246CiAgICAgIHBvc3RncmVzcWw6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBjdXJsCiAgICAgICAgLSAnLWYnCiAgICAgICAgLSAnaHR0cDovLzEyNy4wLjAuMTo2NDIwL2hlYWx0aCcKICAgICAgaW50ZXJ2YWw6IDJzCiAgICAgIHRpbWVvdXQ6IDEwcwogICAgICByZXRyaWVzOiAxMAogICAgICBzdGFydF9wZXJpb2Q6IDMwcwogIHBvc3RncmVzcWw6CiAgICBpbWFnZTogJ3Bvc3RncmVzOjE3LWFscGluZScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3JpdmV0LXBvc3RncmVzcWwtZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnUE9TVEdSRVNfVVNFUj0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU1FMfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTUUx9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTUUxfREFUQUJBU0Utcml2ZXR9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=",
"tags": [
"stateful",
"actors",
"realtime",
"backend",
"serverless",
"postgresql"
],
"category": "development",
"logo": "svgs/rivet.svg",
"minversion": "0.0.0",
"port": "6420"
},
"rocketchat": {
"documentation": "https://github.com/RocketChat/Rocket.Chat?utm_source=coolify.io",
"slogan": "Self-hosted, secure and highly customizable open-source communication platform for organizations with sophisticated security and privacy concerns.",
@ -3706,6 +3782,20 @@
"minversion": "0.0.0",
"port": "8080"
},
"siyuan": {
"documentation": "https://github.com/siyuan-note/siyuan?utm_source=coolify.io",
"slogan": "A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang.",
"compose": "c2VydmljZXM6CiAgc2l5dWFuOgogICAgaW1hZ2U6ICdiM2xvZy9zaXl1YW46djMuMy41JwogICAgdm9sdW1lczoKICAgICAgLSAnc2l5dWFuX3dvcmtzcGFjZTovc2l5dWFuL3dvcmtzcGFjZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9TSVlVQU5fNjgwNgogICAgICAtICdUWj0ke1RaOi1VVEN9JwogICAgICAtIFBVSUQ9MTAwMAogICAgICAtIFBHSUQ9MTAwMAogICAgICAtICdTSVlVQU5fQUNDRVNTX0FVVEhfQ09ERT0ke1NFUlZJQ0VfUEFTU1dPUkRfU0lZVUFOfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSB3Z2V0CiAgICAgICAgLSAnLS1zcGlkZXInCiAgICAgICAgLSAnLS1xdWlldCcKICAgICAgICAtICdodHRwOi8vMTI3LjAuMC4xOjY4MDYvYXBpL3N5c3RlbS92ZXJzaW9uJwogICAgICBpbnRlcnZhbDogMTVzCiAgICAgIHRpbWVvdXQ6IDEwcwogICAgICByZXRyaWVzOiA1CiAgICAgIHN0YXJ0X3BlcmlvZDogMjBzCg==",
"tags": [
"note-taking",
"markdown",
"pkm"
],
"category": null,
"logo": "svgs/siyuan.svg",
"minversion": "0.0.0",
"port": "6806"
},
"slash": {
"documentation": "https://github.com/yourselfhosted/slash?utm_source=coolify.io",
"slogan": "An open source, self-hosted links shortener and sharing platform.",
@ -3769,6 +3859,23 @@
"minversion": "0.0.0",
"port": "8989"
},
"sparkyfitness": {
"documentation": "https://codewithcj.github.io/SparkyFitness/?utm_source=coolify.io",
"slogan": "SparkyFitness is a comprehensive fitness tracking and management application designed to help users monitor their nutrition, exercise, and body measurements. It provides tools for daily progress tracking, goal setting, and insightful reports to support a healthy lifestyle.",
"compose": "c2VydmljZXM6CiAgc3Bhcmt5Zml0bmVzcy1mcm9udGVuZDoKICAgIGltYWdlOiAnY29kZXdpdGhjai9zcGFya3lmaXRuZXNzOnYwLjE1LjcuMycKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9TUEFSS1lGSVRORVNTXzgwCiAgICBkZXBlbmRzX29uOgogICAgICAtIHNwYXJreWZpdG5lc3Mtc2VydmVyCiAgc3Bhcmt5Zml0bmVzcy1zZXJ2ZXI6CiAgICBpbWFnZTogJ2NvZGV3aXRoY2ovc3Bhcmt5Zml0bmVzc19zZXJ2ZXI6djAuMTUuNy4zJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0xPR19MRVZFTD0ke1NQQVJLWV9GSVRORVNTX0xPR19MRVZFTDotaW5mb30nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0RCX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtIFNQQVJLWV9GSVRORVNTX0RCX0hPU1Q9c3Bhcmt5Zml0bmVzcy1kYgogICAgICAtICdTUEFSS1lfRklUTkVTU19EQl9OQU1FPSR7U1BBUktZX0ZJVE5FU1NfREJfTkFNRTotc3Bhcmt5Zml0bmVzc30nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0RCX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0RCX1BPUlQ9JHtTUEFSS1lfRklUTkVTU19EQl9QT1JUOi01NDMyfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfQVBJX0VOQ1JZUFRJT05fS0VZPSR7U0VSVklDRV9QQVNTV09SRF82NF9TRVJWRVJBUElFTkNSWVBUSU9OS0VZfScKICAgICAgLSAnSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfNjRfU0VSVkVSSldUU0VDUkVUfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfRlJPTlRFTkRfVVJMPSR7U0VSVklDRV9GUUROX1NQQVJLWUZJVE5FU1NfODB9JwogICAgICAtICdTUEFSS1lfRklUTkVTU19ESVNBQkxFX1NJR05VUD0ke1NQQVJLWV9GSVRORVNTX0RJU0FCTEVfU0lHTlVQOi1mYWxzZX0nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0FETUlOX0VNQUlMPSR7U1BBUktZX0ZJVE5FU1NfQURNSU5fRU1BSUw6LWFkbWluQGV4YW1wbGUuY29tfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfRU1BSUxfSE9TVD0ke1NQQVJLWV9GSVRORVNTX0VNQUlMX0hPU1Q6LXNtdHAuZ21haWwuY29tfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfRU1BSUxfUE9SVD0ke1NQQVJLWV9GSVRORVNTX0VNQUlMX1BPUlQ6LTU4N30nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0VNQUlMX1NFQ1VSRT0ke1NQQVJLWV9GSVRORVNTX0VNQUlMX1NFQ1VSRTotZmFsc2V9JwogICAgICAtICdTUEFSS1lfRklUTkVTU19FTUFJTF9VU0VSPSR7U1BBUktZX0ZJVE5FU1NfRU1BSUxfVVNFUn0nCiAgICAgIC0gJ1NQQVJLWV9GSVRORVNTX0VNQUlMX1BBU1M9JHtTUEFSS1lfRklUTkVTU19FTUFJTF9QQVNTfScKICAgICAgLSAnU1BBUktZX0ZJVE5FU1NfRU1BSUxfRlJPTT0ke1NQQVJLWV9GSVRORVNTX0VNQUlMX0ZST006LSJTcGFya3kgRml0bmVzcyA8bm9yZXBseUBzcGFya3lmaXRuZXNzLmNvbT4ifScKICAgIGRlcGVuZHNfb246CiAgICAgIC0gc3Bhcmt5Zml0bmVzcy1kYgogICAgdm9sdW1lczoKICAgICAgLSAnc3Bhcmt5Zml0bmVzcy1zZXJ2ZXItYmFja3VwOi9hcHAvU3Bhcmt5Rml0bmVzc1NlcnZlci9iYWNrdXAnCiAgICAgIC0gJ3NwYXJreWZpdG5lc3Mtc2VydmVyLXVwbG9hZHM6L2FwcC9TcGFya3lGaXRuZXNzU2VydmVyL3VwbG9hZHMnCiAgc3Bhcmt5Zml0bmVzcy1kYjoKICAgIGltYWdlOiAncG9zdGdyZXM6MTUtYWxwaW5lJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7U1BBUktZX0ZJVE5FU1NfREJfTkFNRTotc3Bhcmt5Zml0bmVzc30nCiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QT1JUPSR7U1BBUktZX0ZJVE5FU1NfREJfUE9SVDotNTQzMn0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCiAgICB2b2x1bWVzOgogICAgICAtICdzcGFya3lmaXRuZXNzLWRiLXBvc3RncmVzcWw6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwo=",
"tags": [
"sparkyfitness",
"fitness",
"health",
"nutrition",
"exercise",
"body measurements"
],
"category": "health",
"logo": "svgs/sparkyfitness.svg",
"minversion": "0.0.0",
"port": "80"
},
"statusnook": {
"documentation": "https://statusnook.com?utm_source=coolify.io",
"slogan": "Effortlessly deploy a status page and start monitoring endpoints in minutes",