diff --git a/.cursor/goal/archive/scratchpad-20260721T123448.md b/.cursor/goal/archive/scratchpad-20260721T123448.md
deleted file mode 100644
index bb751f121..000000000
--- a/.cursor/goal/archive/scratchpad-20260721T123448.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-iteration: 2
-max_iterations: 10
-status: active
-goal: "Maximize the downloads widget by leveraging every mantine-datatable feature, adding hover tooltips with stats, click-to-expand rich detail rows, toggleable global stats, and comprehensive customization options"
-success_criteria:
- - "Leverage all mantine-datatable features: row expansion, column toggling, custom row styling, striped rows, scroll area tracking, pinned columns, and context menus"
- - "Add hover tooltips on rows showing additional stats (size, speed, ETA, ratio, category)"
- - "Implement click-to-expand row details with comprehensive download info"
- - "Add toggleable global stats bar showing total speeds, ratios, queue counts, and queue size (disk usage not available from integration API)"
- - "Use every relevant DataTable prop from the mantine-datatable docs"
- - "Typecheck passes with pnpm turbo typecheck --filter=@homarr/widgets"
- - "No regressions in existing functionality (context menu, sorting, filtering still work)"
-last_verdict: null
-last_reason: null
-last_next: null
-engine: cursor
----
-
-## Progress log
-
-### Iteration 1
-- Added hover tooltips on name column showing size, state, speeds, ETA, ratio, category
-- Added toggleable global stats bar with overall progress, total size, speeds, ratio, status counts
-- Enhanced row expansion with RingProgress, SimpleGrid layout, collapse on click
-- Added striped rows, highlightOnHover colors, rowBackgroundColor for failed/paused
-- Added defaultColumnProps with noWrap and dynamic cellsStyle
-- Added collapseProps for smooth expansion animation
-- Added onScroll to auto-close context menu
-- Added new translations for stats bar
-- TypeCheck: PASS
-
-### Iteration 2
-- Migrated to `useDataTableColumns` hook with toggleable, draggable, resizable, pinnable columns
-- Added `storeColumnsKey` for localStorage column preference persistence
-- Added `pinFirstColumn`, `pinLastColumn`, `textSelectionDisabled`, `withColumnBorders`
-- Added `scrollAreaProps`, `customRowAttributes`, enhanced scroll tracking (`onScroll`, `onScrollToTop`, `onScrollToBottom`)
-- Added column settings menu in footer with reset visibility/order/width/pinning
-- Added scroll position indicator badge when scrolled
-- Explicit `rowExpansion.trigger: "click"`
-- Updated docs and translations for column controls
-- TypeCheck: PASS
-
-## Blockers
-None
-
-## Verification
-- pnpm turbo typecheck --filter=@homarr/widgets: PASS (exit code 0)
-- Context menu: preserved via onRowContextMenu
-- Sorting: preserved via sortStatus/onSortStatusChange
-- Filtering: preserved in WidgetFooter
-- Column toggling/reordering/resizing/pinning: via useDataTableColumns + header UI
-
-## Task
-
-Maximize the downloads widget by leveraging every mantine-datatable feature, adding hover tooltips with stats, click-to-expand rich detail rows, toggleable global stats, and comprehensive customization options
diff --git a/apps/docs/docs/widgets/downloads/index.ts b/apps/docs/docs/widgets/downloads/index.ts
index b5f66f5ca..4245af310 100644
--- a/apps/docs/docs/widgets/downloads/index.ts
+++ b/apps/docs/docs/widgets/downloads/index.ts
@@ -18,7 +18,7 @@ const columnsList = [
"index",
"type",
];
-const sortColumns = columnsList.filter((c) => !["state", "category"].includes(c));
+const sortColumns = columnsList.filter((c) => !["state", "category", "integration"].includes(c));
export const downloadsWidget: WidgetDefinition = {
icon: IconDownload,
diff --git a/packages/request-handler/src/weather.ts b/packages/request-handler/src/weather.ts
index 24e51a735..5f5a097a4 100644
--- a/packages/request-handler/src/weather.ts
+++ b/packages/request-handler/src/weather.ts
@@ -9,7 +9,7 @@ export const weatherRequestHandler = createWidgetRequestHandler({
async requestAsync(input: { latitude: number; longitude: number }) {
const res = await withTimeoutAsync(async (signal) => {
return await fetchWithTrustedCertificatesAsync(
- `https://api.open-meteo.com/v1/forecast?latitude=${input.latitude}&longitude=${input.longitude}&daily=weathercode,temperature_2m_max,temperature_2m_min,sunrise,sunset,wind_speed_10m_max,wind_gusts_10m_max,relative_humidity_2m¤t_weather=true&timezone=auto`,
+ `https://api.open-meteo.com/v1/forecast?latitude=${input.latitude}&longitude=${input.longitude}&daily=weathercode,temperature_2m_max,temperature_2m_min,sunrise,sunset,wind_speed_10m_max,wind_gusts_10m_max¤t_weather=true&timezone=auto`,
{ signal },
);
});
@@ -27,7 +27,6 @@ export const weatherRequestHandler = createWidgetRequestHandler({
sunset: weather.daily.sunset[index],
maxWindSpeed: weather.daily.wind_speed_10m_max[index],
maxWindGusts: weather.daily.wind_gusts_10m_max[index],
- humidity: weather.daily.relative_humidity_2m[index],
};
}),
} satisfies Weather;
@@ -49,7 +48,6 @@ const atLocationOutput = z.object({
sunset: z.array(z.string()),
wind_speed_10m_max: z.array(z.number()),
wind_gusts_10m_max: z.array(z.number()),
- relative_humidity_2m: z.array(z.number()),
}),
});
@@ -68,6 +66,5 @@ export interface Weather {
sunset: string | undefined;
maxWindSpeed: number | undefined;
maxWindGusts: number | undefined;
- humidity: number | undefined;
}[];
}
diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json
index b109bcdd3..08d1be3b2 100644
--- a/packages/translation/src/lang/en.json
+++ b/packages/translation/src/lang/en.json
@@ -2257,8 +2257,7 @@
"sunrise": "Sunrise",
"sunset": "Sunset",
"maxWindSpeed": "Max wind speed: {maxWindSpeed} {unit}",
- "maxWindGusts": "Max wind gusts: {maxWindGusts} {unit}",
- "humidity": "Humidity: {humidity}%"
+ "maxWindGusts": "Max wind gusts: {maxWindGusts} {unit}"
},
"kind": {
"clear": "Clear",
diff --git a/packages/widgets/src/weather/component.tsx b/packages/widgets/src/weather/component.tsx
index 27ab5d19e..6e76ef8f2 100644
--- a/packages/widgets/src/weather/component.tsx
+++ b/packages/widgets/src/weather/component.tsx
@@ -1,7 +1,7 @@
"use client";
import { Box, Group, HoverCard, Stack, Text } from "@mantine/core";
-import { IconArrowDownRight, IconArrowUpRight, IconDroplets, IconMapPin, IconWind } from "@tabler/icons-react";
+import { IconArrowDownRight, IconArrowUpRight, IconMapPin, IconWind } from "@tabler/icons-react";
import combineClasses from "clsx";
import dayjs from "dayjs";
@@ -87,12 +87,6 @@ const DailyWeather = ({ options, weather }: WeatherProps) => {
)}
- {weather.daily[0]?.humidity !== undefined && (
-
-
- {t("dailyForecast.humidity", { humidity: weather.daily[0].humidity })}
-
- )}
@@ -210,7 +204,6 @@ function Forecast({ weather, options }: WeatherProps) {
sunset={dayjs(dayWeather.sunset).format("HH:mm")}
maxWindSpeed={dayWeather.maxWindSpeed}
maxWindGusts={dayWeather.maxWindGusts}
- humidity={dayWeather.humidity}
/>
diff --git a/packages/widgets/src/weather/icon.tsx b/packages/widgets/src/weather/icon.tsx
index 6153484f0..fe4ad92b0 100644
--- a/packages/widgets/src/weather/icon.tsx
+++ b/packages/widgets/src/weather/icon.tsx
@@ -5,7 +5,6 @@ import {
IconCloudRain,
IconCloudSnow,
IconCloudStorm,
- IconDroplets,
IconMoon,
IconQuestionMark,
IconSnowflake,
@@ -52,7 +51,6 @@ interface WeatherDescriptionProps {
sunset?: string;
maxWindSpeed?: number;
maxWindGusts?: number;
- humidity?: number;
}
/**
@@ -80,7 +78,6 @@ export const WeatherDescription = ({
sunset,
maxWindSpeed,
maxWindGusts,
- humidity,
}: WeatherDescriptionProps) => {
const t = useScopedI18n("widget.weather");
const tCommon = useScopedI18n("common");
@@ -100,9 +97,6 @@ export const WeatherDescription = ({
}>{`${tCommon("information.min")}: ${minTemp}`}
}>{`${t("dailyForecast.sunrise")}: ${sunrise}`}
}>{`${t("dailyForecast.sunset")}: ${sunset}`}
- {humidity !== undefined && (
- }>{t("dailyForecast.humidity", { humidity })}
- )}
{maxWindSpeed !== undefined && (
}>
{t("dailyForecast.maxWindSpeed", {