Compare commits

..
Author SHA1 Message Date
Thomas Camlong ae2a1df453 fix(dev): preserve background build errors 2026-08-02 08:26:56 +02:00
Thomas Camlong ca7e50fb96 docs(dev): explain local PR preference 2026-08-02 08:19:45 +02:00
Thomas Camlong db6aa0b26e feat(dev): prefer current local PR builds 2026-08-02 08:19:29 +02:00
Thomas Camlong d096aecd59 feat(dev): track pull request head revisions 2026-08-02 08:19:12 +02:00
Thomas Camlong 49a41431b9 docs(dev): document dashboard navigation 2026-08-01 23:49:23 +02:00
Thomas Camlong df587ec76a feat(dev): toggle dashboard screens 2026-08-01 23:49:23 +02:00
Thomas Camlong 3b450eb04a feat(dev): launch browser by default 2026-08-01 23:49:23 +02:00
Thomas 406fb4c0b6 Merge branch 'dev' into feat/dev-cli-tool 2026-08-01 23:46:16 +02:00
Thomas Camlong f23c35645c fix(dev): surface registry pull errors 2026-08-01 23:40:41 +02:00
Thomas Camlong 667bf62396 docs(dev): document remote PR builds 2026-08-01 23:36:38 +02:00
Thomas Camlong c5a056b8e5 feat(dev): build remote pull requests locally 2026-08-01 23:35:08 +02:00
Thomas Camlong 934b6e69f4 fix(dev): shallow clone pull requests 2026-08-01 23:35:08 +02:00
Thomas Camlong c8c5dbc506 fix(dev): cache GitHub pull requests 2026-08-01 23:35:08 +02:00
Thomas Camlong b1e79e4641 fix(dev): keep optional tools optional 2026-08-01 14:01:52 +02:00
Thomas Camlong 5b04ed1ab5 refactor(dev): make setup explicit and portable 2026-07-31 23:52:14 +02:00
Thomas Camlong b733ed6a79 fix(dev): make key creation atomic 2026-07-31 15:28:00 +02:00
Thomas Camlong ae3e9f7793 fix(dev): persist unique local encryption key 2026-07-31 15:11:38 +02:00
Thomas Camlong c8485ed7fc fix(dev): address CLI review feedback 2026-07-31 14:53:43 +02:00
Thomas Camlong e97eb7fc58 feat(dev): add Docker development CLI 2026-07-31 14:28:31 +02:00
10 changed files with 1068 additions and 1012 deletions

No files matched your search

+4 -7
View File
@@ -7,8 +7,8 @@ tags:
- Ping
---
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.
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.
Apps are used in the bookmark and app widget.
## Create an app
@@ -27,7 +27,7 @@ The name must be at least one character long and can be chosen freely.
### 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.
![Icon URL](./img/app-icon-url.png)
@@ -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.
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
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.
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
+1 -1
View File
@@ -173,7 +173,7 @@ export const appRouter = createTRPCRouter({
mcp: {
enabled: true,
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 }) => {
@@ -119,7 +119,6 @@ export type HomarrDocumentationPath =
| "/docs/tags/variables"
| "/docs/tags/widgets"
| "/docs/advanced/command-line"
| "/docs/advanced/command-line/development"
| "/docs/advanced/command-line/fix-usernames"
| "/docs/advanced/command-line/integrations"
| "/docs/advanced/command-line/password-recovery"
+1 -2
View File
@@ -442,7 +442,7 @@ export const integrationDefs = {
name: "Beszel",
secretKinds: [["username", "password"]],
iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/beszel.svg",
category: ["beszel"],
category: ["healthMonitoring"],
documentationUrl: createDocumentationLink("/docs/integrations/beszel"),
defaultPort: 8090,
},
@@ -565,7 +565,6 @@ export const integrationCategories = [
"smartHomeServer",
"indexerManager",
"healthMonitoring",
"beszel",
"search",
"mediaTranscoding",
"networkController",
@@ -148,8 +148,6 @@ const optionMapping: OptionMapping = {
},
mediaServer: {
showOnlyPlaying: () => undefined,
showBitrate: () => undefined,
showLocation: () => undefined,
},
indexerManager: {
openIndexerSiteInNewTab: (oldOptions) => oldOptions.openIndexerSiteInNewTab,
+2 -1
View File
@@ -3,7 +3,8 @@ import { z } from "zod/v4";
export const appHrefSchema = z
.string()
.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(""))
.transform((value) => (value.length === 0 ? null : value))
.nullable();
-1
View File
@@ -26,7 +26,6 @@ const columnTranslationKeyMap = {
export const { definition, componentLoader } = createWidgetDefinition("dockerContainers", {
icon: IconBrandDocker,
queryKey: [["docker", "getContainers"]],
refetchInterval: 30,
createOptions() {
return optionsBuilder.from(
(factory) => ({
@@ -7,6 +7,7 @@ import { optionsBuilder } from "../options";
export const { componentLoader, definition } = createWidgetDefinition("notifications", {
icon: IconMessage,
refetchInterval: null,
createOptions() {
return optionsBuilder.from((factory) => ({
hideLogos: factory.switch({ defaultValue: false }),
+1057 -995
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -37,9 +37,9 @@ catalog:
"@octokit/auth-app": ^8.2.0
"@paralleldrive/cuid2": ^3.3.0
"@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/git": ^11.0.1
"@semantic-release/git": ^10.0.1
"@semantic-release/github": ^12.0.9
"@semantic-release/npm": ^13.1.5
"@semantic-release/release-notes-generator": ^14.1.1