diff --git a/docs/configuring.md b/docs/configuring.md
index 62b876f7ab..a9d388cf37 100644
--- a/docs/configuring.md
+++ b/docs/configuring.md
@@ -254,6 +254,7 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
**`description`** | `string` | _Optional_ | Additional info about an item, which is shown in the tooltip on hover, or visible on large tiles
**`url`** | `string` | Required | The URL / location of web address for when the item is clicked
**`icon`** | `string` | _Optional_ | The icon for a given item. Can be a font-awesome icon, favicon, remote URL or local URL. See [`item.icon`](#sectionicon-and-sectionitemicon)
+**`hidden`** | `boolean` | _Optional_ | If set to `true`, this item will be hidden from the default homepage view. It will still appear in search results, and will remain visible while using the Interactive Edit Mode. Defaults to `false`.
**`target`** | `string` | _Optional_ | The opening method for when the item is clicked, either `newtab`, `sametab`, `modal`, `workspace`, `clipboard`, `top` or `parent`. Where `newtab` will open the link in a new tab, `sametab` will open it in the current tab, and `modal` will open a pop-up modal, `workspace` will open in the Workspace view and `clipboard` will copy the URL to system clipboard (but not launch app). Defaults to `newtab`
**`hotkey`** | `number` | _Optional_ | Give frequently opened applications a numeric hotkey, between `0 - 9`. You can then just press that key to launch that application.
**`tags`** | `string[]` | _Optional_ | A list of tags, which can be used for improved search
@@ -283,6 +284,22 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
**[⬆️ Back to Top](#configuring)**
+### Example: Hiding an item from the homepage
+
+```yaml
+sections:
+- name: Media
+ items:
+ - title: Admin Panel
+ url: https://example.local/admin
+ icon: fa fa-tools
+ hidden: true # hidden from the default homepage, but still searchable
+ - title: Plex
+ url: https://plex.local
+ icon: favicon
+```
+
+
## `section.widgets` _(optional)_
**Field** | **Type** | **Required**| **Description**
diff --git a/docs/development-guides.md b/docs/development-guides.md
index ffc6bd75e3..8f506bac4e 100644
--- a/docs/development-guides.md
+++ b/docs/development-guides.md
@@ -159,6 +159,7 @@ Checklist:
- [ ] Update the [Schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js) with the parameters for your new option
- [ ] If required, set a default or fallback value (usually in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js))
- [ ] Document the new value in [`configuring.md`](./configuring.md), and if required under the relevant section in the docs
+ - For example, if adding an item-level flag like `hidden: true`, document its purpose, default, and behavior (e.g., hidden on homepage but still searchable)
- [ ] Ensure your changes are backwards compatible, and that nothing breaks if the attribute isn't specified
---
diff --git a/docs/searching.md b/docs/searching.md
index 6595950cda..7dc4c8844f 100644
--- a/docs/searching.md
+++ b/docs/searching.md
@@ -4,6 +4,9 @@
One of the primary purposes of Dashy is to allow you to quickly find and launch a given app. To make this as quick as possible, there is no need to touch the mouse, or press a certain key to begin searching - just start typing. Results will be filtered in real-time. No need to worry about case, special characters or small typos, these are taken care of, and your results should appear.
+> Note
+> Items marked as hidden in your configuration (using `hidden: true`) will not be shown on the homepage by default, but they will still appear in search results.
+
## Navigating
You can navigate through your items or search results using the keyboard. You can use Tab to cycle through results, and Shift + Tab to go backwards. Or use the arrow keys, ↑, →, ↓ and ←.
diff --git a/src/components/InteractiveEditor/EditItem.vue b/src/components/InteractiveEditor/EditItem.vue
index d8c0be0a70..edd908eb0a 100644
--- a/src/components/InteractiveEditor/EditItem.vue
+++ b/src/components/InteractiveEditor/EditItem.vue
@@ -240,6 +240,7 @@ export default {
return str === 'true';
};
if (newItem.tags) newItem.tags = strToTags(newItem.tags);
+ if (newItem.hidden !== undefined) newItem.hidden = strToBool(newItem.hidden);
if (newItem.statusCheck) newItem.statusCheck = strToBool(newItem.statusCheck);
if (newItem.statusCheckAllowInsecure) {
newItem.statusCheckAllowInsecure = strToBool(newItem.statusCheckAllowInsecure);
diff --git a/src/components/LinkItems/Section.vue b/src/components/LinkItems/Section.vue
index f1659ed582..55cafc9945 100644
--- a/src/components/LinkItems/Section.vue
+++ b/src/components/LinkItems/Section.vue
@@ -128,6 +128,7 @@ export default {
widgets: Array,
index: Number,
isWide: Boolean,
+ searchTerm: String,
},
components: {
Collapsable,
@@ -178,7 +179,14 @@ export default {
},
/* If the sortBy attribute is specified, then return sorted data */
sortedItems() {
- const items = [...this.items];
+ // Filter out items with hidden: true, unless in edit mode or searching
+ let items = [...this.items];
+ if (!this.isEditMode) {
+ // Include hidden items only when there's an active search term
+ if (!this.searchTerm || this.searchTerm.trim() === '') {
+ items = items.filter(item => !item.hidden);
+ }
+ }
if (this.appConfig.disableSmartSort) return items;
if (this.sortOrder === 'alphabetical') {
return this.sortAlphabetically(items);
diff --git a/src/utils/ConfigSchema.json b/src/utils/ConfigSchema.json
index 92039798ab..e7edd4a0e5 100644
--- a/src/utils/ConfigSchema.json
+++ b/src/utils/ConfigSchema.json
@@ -955,6 +955,12 @@
"nullable": true,
"description": "An icon, either as a font-awesome, simple-icon, selfh.st, or mdi identifier, emoji, favicon, generative or the URL/path to a local or remote icon asset"
},
+ "hidden": {
+ "title": "Hidden from Homepage",
+ "type": "boolean",
+ "default": false,
+ "description": "If true, this item will be hidden from the homepage/dashboard but still searchable."
+ },
"url": {
"title": "Service URL",
"type": "string",