diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index ba593523..1edf79cc 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -6,6 +6,7 @@
==================== STOP ====
⚠️ Before opening this pull request please review the guidelines in the checklist below.
+
If this PR does not meet those guidelines it will not be accepted, and everyone will be sad.
-->
@@ -14,9 +15,6 @@ If this PR does not meet those guidelines it will not be accepted, and everyone
@@ -30,13 +28,13 @@ What type of change does your PR introduce to Homepage?
- [ ] New service widget
- [ ] Bug fix (non-breaking change which fixes an issue)
-- [ ] New feature (non-breaking change which adds functionality)
+- [ ] New feature or enhancement (non-breaking change which adds functionality)
- [ ] Documentation only
- [ ] Other (please explain)
## Checklist:
- [ ] If applicable, I have added corresponding documentation changes.
-- [ ] If applicable, I have reviewed the [feature](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines).
+- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines).
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/more/development/#code-linting).
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0cc5fad0..0d85c731 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -63,7 +63,7 @@ The homepage team appreciates all effort and interest from the community in fili
- Issues, pull requests and discussions that are closed will be locked after 30 days of inactivity.
- Discussions with a marked answer will be automatically closed.
- Discussions in the 'General' or 'Support' categories will be closed after 180 days of inactivity.
-- Feature requests that do not meet the following thresholds will be closed: 5 "up-votes" after 180 days of inactivity or 10 "up-votes" after 365 days.
+- Feature requests that do not meet the following thresholds will be closed: 10 "up-votes" after 180 days of inactivity or 20 "up-votes" after 365 days.
In all cases, threads can be re-opened by project maintainers and, of course, users can always create a new discussion for related concerns.
Finally, remember that all information remains searchable and 'closed' feature requests can still serve as inspiration for new features.
diff --git a/docs/configs/services.md b/docs/configs/services.md
index 6ef25c39..b1883043 100644
--- a/docs/configs/services.md
+++ b/docs/configs/services.md
@@ -134,7 +134,7 @@ Services may have descriptions,
## Icons
-Services may have an icon attached to them, you can use icons from [Dashboard Icons](https://github.com/walkxcode/dashboard-icons) automatically, by passing the name of the icon, with, or without `.png` or with `.svg` to use the svg version.
+Services may have an icon attached to them, you can use icons from [Dashboard Icons](https://github.com/homarr-labs/dashboard-icons) automatically, by passing the name of the icon, with, or without `.png`, `.webp` or `.svg` to specify the desired version.
You can also specify prefixed icons from:
diff --git a/docs/installation/source.md b/docs/installation/source.md
index 42e5fe91..573711a8 100644
--- a/docs/installation/source.md
+++ b/docs/installation/source.md
@@ -23,3 +23,5 @@ Finally, run the server:
```bash
pnpm start
```
+
+When updating homepage versions you will need to re-build the static files i.e. repeat the process above.
diff --git a/docs/widgets/authoring/getting-started.md b/docs/widgets/authoring/getting-started.md
index d3aa106f..8e16b915 100644
--- a/docs/widgets/authoring/getting-started.md
+++ b/docs/widgets/authoring/getting-started.md
@@ -46,9 +46,9 @@ See the [pre-commit documentation](https://pre-commit.com/#install) to get start
In general, homepage is meant to be a dashboard for 'self-hosted' services and we believe it is a small way we can help showcase this kind of software. While exceptions are made, mostly when there is no viable
self-hosted / open-source alternative, we ask that any widgets, etc. are developed primarily for a self-hosted tool.
-## New Feature Guidelines
+## New Feature or Enhancement Guidelines {#new-feature-guidelines}
-- New features should be linked to an existing feature request. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users.
+- New features or enhancements, **no matter how small**, must be linked to an existing feature request. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users.
- If you have ideas for a larger feature you may want to open a discussion first.
## Service Widget Guidelines
diff --git a/docs/widgets/services/customapi.md b/docs/widgets/services/customapi.md
index c392d942..0deb8294 100644
--- a/docs/widgets/services/customapi.md
+++ b/docs/widgets/services/customapi.md
@@ -62,10 +62,12 @@ widget:
format: size
```
-Supported formats for the values are `text`, `number`, `float`, `percent`, `bytes`, `bitrate`, `size`, `date` and `relativeDate`.
+Supported formats for the values are `text`, `number`, `float`, `percent`, `duration`, `bytes`, `bitrate`, `size`, `date` and `relativeDate`.
The `dateStyle` and `timeStyle` options of the `date` format are passed directly to [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) and the `style` and `numeric` options of `relativeDate` are passed to [Intl.RelativeTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat).
+The `duration` format expects the duration to be specified in seconds. The `scale` transformation tool can be used if a conversion is required.
+
The `size` format will return the length of the array or string, or the number of keys in an object. This is then formatted as `number`.
## Example
diff --git a/docs/widgets/services/gluetun.md b/docs/widgets/services/gluetun.md
index 44775b15..1cc68c9a 100644
--- a/docs/widgets/services/gluetun.md
+++ b/docs/widgets/services/gluetun.md
@@ -11,7 +11,7 @@ Learn more about [Gluetun](https://github.com/qdm12/gluetun).
Allowed fields: `["public_ip", "region", "country"]`.
-To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication).
+To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml.
```yaml
widget:
diff --git a/src/components/errorboundry.jsx b/src/components/errorboundry.jsx
index bad4b552..1b2a3b1e 100644
--- a/src/components/errorboundry.jsx
+++ b/src/components/errorboundry.jsx
@@ -14,8 +14,10 @@ export default class ErrorBoundary extends React.Component {
});
// You can also log error messages to an error reporting service here
- // eslint-disable-next-line no-console
- console.error(error, errorInfo);
+ if (error || errorInfo) {
+ // eslint-disable-next-line no-console
+ console.error("component error: %s, info: %s", error, errorInfo);
+ }
}
render() {
diff --git a/src/components/resolvedicon.jsx b/src/components/resolvedicon.jsx
index de29c0cd..4858f3d5 100644
--- a/src/components/resolvedicon.jsx
+++ b/src/components/resolvedicon.jsx
@@ -101,7 +101,26 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
const iconName = icon.replace(".svg", "");
return (
+ );
+ }
+
+ if (icon.endsWith(".webp")) {
+ const iconName = icon.replace(".webp", "");
+ return (
+ 0) {
+ nestedServices = [...nestedServices, ...group.groups.map(getServices).flat()];
+ }
+ return nestedServices;
+ }
+
+ return [...services.map(getServices).flat()];
+}
+
function Home({ initialSettings }) {
const { i18n } = useTranslation();
const { theme, setTheme } = useContext(ThemeContext);
@@ -182,10 +194,9 @@ function Home({ initialSettings }) {
const { data: bookmarks } = useSWR("/api/bookmarks");
const { data: widgets } = useSWR("/api/widgets");
- const servicesAndBookmarks = [
- ...services.map((sg) => sg.services).flat(),
- ...bookmarks.map((bg) => bg.bookmarks).flat(),
- ].filter((i) => i?.href);
+ const servicesAndBookmarks = [...bookmarks.map((bg) => bg.bookmarks).flat(), ...getAllServices(services)].filter(
+ (i) => i?.href,
+ );
useEffect(() => {
if (settings.language) {
@@ -459,7 +470,7 @@ function Home({ initialSettings }) {
}
export default function Wrapper({ initialSettings, fallback }) {
- const { theme } = useContext(ThemeContext);
+ const { themeContext } = useContext(ThemeContext);
const wrappedStyle = {};
let backgroundBlur = false;
let backgroundSaturate = false;
@@ -490,9 +501,9 @@ export default function Wrapper({ initialSettings, fallback }) {
id="page_wrapper"
className={classNames(
"relative",
- theme && theme,
+ initialSettings.theme && initialSettings.theme,
initialSettings.color && `theme-${initialSettings.color}`,
- theme === "dark" ? "scheme-dark" : "scheme-light",
+ themeContext === "dark" ? "scheme-dark" : "scheme-light",
)}
>