Compare commits
19
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae2a1df453 | ||
|
|
ca7e50fb96 | ||
|
|
db6aa0b26e | ||
|
|
d096aecd59 | ||
|
|
49a41431b9 | ||
|
|
df587ec76a | ||
|
|
3b450eb04a | ||
|
|
406fb4c0b6 | ||
|
|
f23c35645c | ||
|
|
667bf62396 | ||
|
|
c5a056b8e5 | ||
|
|
934b6e69f4 | ||
|
|
c8c5dbc506 | ||
|
|
b1e79e4641 | ||
|
|
5b04ed1ab5 | ||
|
|
b733ed6a79 | ||
|
|
ae3e9f7793 | ||
|
|
c8485ed7fc | ||
|
|
e97eb7fc58 |
No files matched your search
@@ -7,8 +7,8 @@ tags:
|
|||||||
- Ping
|
- Ping
|
||||||
---
|
---
|
||||||
|
|
||||||
Apps are the building blocks of your Homarr board.
|
Apps are the building blocks of your Homarr board.
|
||||||
Most of the time they are a simple link to a website, but used on your board they also support a simple ping to check if your service is up.
|
Most of the time they are a simple link to a website, but used on your board they also support a simple ping to check if your service is up.
|
||||||
Apps are used in the bookmark and app widget.
|
Apps are used in the bookmark and app widget.
|
||||||
|
|
||||||
## Create an app
|
## Create an app
|
||||||
@@ -27,7 +27,7 @@ The name must be at least one character long and can be chosen freely.
|
|||||||
|
|
||||||
### Icon URL
|
### Icon URL
|
||||||
|
|
||||||
This is the URL to the icon that will be displayed on the app widget.
|
This is the URL to the icon that will be displayed on the app widget.
|
||||||
You can paste a direct HTTP(S) URL to an image, search the included icon repositories by name, or upload a local file through the upload button. Direct image URLs are used as entered and are not searched in the icon repositories.
|
You can paste a direct HTTP(S) URL to an image, search the included icon repositories by name, or upload a local file through the upload button. Direct image URLs are used as entered and are not searched in the icon repositories.
|
||||||
|
|
||||||

|

|
||||||
@@ -40,14 +40,11 @@ An optional description that can be shown as tooltip on the app widget.
|
|||||||
|
|
||||||
The URL to the website you want to link to. Clicking on the app widget or bookmark will open this URL.
|
The URL to the website you want to link to. Clicking on the app widget or bookmark will open this URL.
|
||||||
|
|
||||||
You can also use custom URI schemes such as `vscode://file/path`, `microsoft-edge:https://example.com`, or `myapp://open` to link to local applications or third-party programs. We trust that you know what you are doing — only `javascript:` URIs are blocked for security reasons.
|
|
||||||
|
|
||||||
### Ping URL
|
### Ping URL
|
||||||
|
|
||||||
When you want to use another url for the simple status check you can set it here.
|
When you want to use another url for the simple status check you can set it here.
|
||||||
This will allow you to set a different URL for the ping than the URL that is opened when clicking on the app widget.
|
This will allow you to set a different URL for the ping than the URL that is opened when clicking on the app widget.
|
||||||
It's useful when you want to ping the service internally for example with a custom ip but open the website externally.
|
It's useful when you want to ping the service internally for example with a custom ip but open the website externally.
|
||||||
Note that the ping URL only accepts `http://` and `https://` URLs — custom URI schemes are not supported for pings.
|
|
||||||
|
|
||||||
## List of apps
|
## List of apps
|
||||||
|
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ export const appRouter = createTRPCRouter({
|
|||||||
mcp: {
|
mcp: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
description:
|
description:
|
||||||
"Create a new app (bookmark/shortcut to a service). REQUIRED: name (string), iconUrl (icon URL string), href (app URL or custom URI scheme such as vscode://, or blank). OPTIONAL: description (string or null), pingUrl (URL to check reachability, or empty string)",
|
"Create a new app (bookmark/shortcut to a service). REQUIRED: name (string), iconUrl (icon URL string), href (app URL, http/https or blank). OPTIONAL: description (string or null), pingUrl (URL to check reachability, or empty string)",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.mutation(async ({ ctx, input }) => {
|
.mutation(async ({ ctx, input }) => {
|
||||||
|
|||||||
@@ -119,7 +119,6 @@ export type HomarrDocumentationPath =
|
|||||||
| "/docs/tags/variables"
|
| "/docs/tags/variables"
|
||||||
| "/docs/tags/widgets"
|
| "/docs/tags/widgets"
|
||||||
| "/docs/advanced/command-line"
|
| "/docs/advanced/command-line"
|
||||||
| "/docs/advanced/command-line/development"
|
|
||||||
| "/docs/advanced/command-line/fix-usernames"
|
| "/docs/advanced/command-line/fix-usernames"
|
||||||
| "/docs/advanced/command-line/integrations"
|
| "/docs/advanced/command-line/integrations"
|
||||||
| "/docs/advanced/command-line/password-recovery"
|
| "/docs/advanced/command-line/password-recovery"
|
||||||
|
|||||||
@@ -442,7 +442,7 @@ export const integrationDefs = {
|
|||||||
name: "Beszel",
|
name: "Beszel",
|
||||||
secretKinds: [["username", "password"]],
|
secretKinds: [["username", "password"]],
|
||||||
iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/beszel.svg",
|
iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/beszel.svg",
|
||||||
category: ["beszel"],
|
category: ["healthMonitoring"],
|
||||||
documentationUrl: createDocumentationLink("/docs/integrations/beszel"),
|
documentationUrl: createDocumentationLink("/docs/integrations/beszel"),
|
||||||
defaultPort: 8090,
|
defaultPort: 8090,
|
||||||
},
|
},
|
||||||
@@ -565,7 +565,6 @@ export const integrationCategories = [
|
|||||||
"smartHomeServer",
|
"smartHomeServer",
|
||||||
"indexerManager",
|
"indexerManager",
|
||||||
"healthMonitoring",
|
"healthMonitoring",
|
||||||
"beszel",
|
|
||||||
"search",
|
"search",
|
||||||
"mediaTranscoding",
|
"mediaTranscoding",
|
||||||
"networkController",
|
"networkController",
|
||||||
|
|||||||
@@ -148,8 +148,6 @@ const optionMapping: OptionMapping = {
|
|||||||
},
|
},
|
||||||
mediaServer: {
|
mediaServer: {
|
||||||
showOnlyPlaying: () => undefined,
|
showOnlyPlaying: () => undefined,
|
||||||
showBitrate: () => undefined,
|
|
||||||
showLocation: () => undefined,
|
|
||||||
},
|
},
|
||||||
indexerManager: {
|
indexerManager: {
|
||||||
openIndexerSiteInNewTab: (oldOptions) => oldOptions.openIndexerSiteInNewTab,
|
openIndexerSiteInNewTab: (oldOptions) => oldOptions.openIndexerSiteInNewTab,
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ import { z } from "zod/v4";
|
|||||||
export const appHrefSchema = z
|
export const appHrefSchema = z
|
||||||
.string()
|
.string()
|
||||||
.trim()
|
.trim()
|
||||||
.refine((val) => !/^javascript:/i.test(val), "JavaScript URIs are not permitted")
|
.url()
|
||||||
|
.regex(/^(?!javascript)[a-zA-Z]*:\/\//i) // javascript: is not allowed, i for case insensitive (so Javascript: is also not allowed)
|
||||||
.or(z.literal(""))
|
.or(z.literal(""))
|
||||||
.transform((value) => (value.length === 0 ? null : value))
|
.transform((value) => (value.length === 0 ? null : value))
|
||||||
.nullable();
|
.nullable();
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ const columnTranslationKeyMap = {
|
|||||||
export const { definition, componentLoader } = createWidgetDefinition("dockerContainers", {
|
export const { definition, componentLoader } = createWidgetDefinition("dockerContainers", {
|
||||||
icon: IconBrandDocker,
|
icon: IconBrandDocker,
|
||||||
queryKey: [["docker", "getContainers"]],
|
queryKey: [["docker", "getContainers"]],
|
||||||
refetchInterval: 30,
|
|
||||||
createOptions() {
|
createOptions() {
|
||||||
return optionsBuilder.from(
|
return optionsBuilder.from(
|
||||||
(factory) => ({
|
(factory) => ({
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { optionsBuilder } from "../options";
|
|||||||
|
|
||||||
export const { componentLoader, definition } = createWidgetDefinition("notifications", {
|
export const { componentLoader, definition } = createWidgetDefinition("notifications", {
|
||||||
icon: IconMessage,
|
icon: IconMessage,
|
||||||
|
refetchInterval: null,
|
||||||
createOptions() {
|
createOptions() {
|
||||||
return optionsBuilder.from((factory) => ({
|
return optionsBuilder.from((factory) => ({
|
||||||
hideLogos: factory.switch({ defaultValue: false }),
|
hideLogos: factory.switch({ defaultValue: false }),
|
||||||
|
|||||||
Generated
+1057
-995
File diff suppressed because it is too large.
Load diff
+2
-2
@@ -37,9 +37,9 @@ catalog:
|
|||||||
"@octokit/auth-app": ^8.2.0
|
"@octokit/auth-app": ^8.2.0
|
||||||
"@paralleldrive/cuid2": ^3.3.0
|
"@paralleldrive/cuid2": ^3.3.0
|
||||||
"@playwright/test": ^1.61.1
|
"@playwright/test": ^1.61.1
|
||||||
"@semantic-release/changelog": ^7.0.0
|
"@semantic-release/changelog": ^6.0.3
|
||||||
"@semantic-release/commit-analyzer": ^13.0.1
|
"@semantic-release/commit-analyzer": ^13.0.1
|
||||||
"@semantic-release/git": ^11.0.1
|
"@semantic-release/git": ^10.0.1
|
||||||
"@semantic-release/github": ^12.0.9
|
"@semantic-release/github": ^12.0.9
|
||||||
"@semantic-release/npm": ^13.1.5
|
"@semantic-release/npm": ^13.1.5
|
||||||
"@semantic-release/release-notes-generator": ^14.1.1
|
"@semantic-release/release-notes-generator": ^14.1.1
|
||||||
|
|||||||
Reference in new issue
Block a user