diff --git a/CHANGELOG.md b/CHANGELOG.md
index 336f22fe..8b3ffbb3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Fixed
+
+- Channel table onboarding shown when filter returns zero results: The channel store refactor changed to loading only channel IDs instead of full channel objects, leaving `Object.keys(channels).length` always `0` and incorrectly triggering the onboarding state on any empty filter. Fixed by checking `channelIds.length` instead.
+
## [0.20.1] - 2026-02-26
### Fixed
diff --git a/frontend/src/components/tables/ChannelsTable.jsx b/frontend/src/components/tables/ChannelsTable.jsx
index 9a65aae0..06fe652a 100644
--- a/frontend/src/components/tables/ChannelsTable.jsx
+++ b/frontend/src/components/tables/ChannelsTable.jsx
@@ -282,6 +282,7 @@ const ChannelsTable = ({ onReady }) => {
// store/channels
const channels = useChannelsStore((s) => s.channels);
+ const channelIds = useChannelsStore((s) => s.channelIds);
const profiles = useChannelsStore((s) => s.profiles);
const selectedProfileId = useChannelsStore((s) => s.selectedProfileId);
const [tablePrefs, setTablePrefs] = useLocalStorage('channel-table-prefs', {
@@ -1438,13 +1439,12 @@ const ChannelsTable = ({ onReady }) => {
{/* Table or ghost empty state inside Paper */}
- {channelsTableLength === 0 &&
- Object.keys(channels).length === 0 && (
-
- )}
+ {channelsTableLength === 0 && channelIds.length === 0 && (
+
+ )}
- {(channelsTableLength > 0 || Object.keys(channels).length > 0) && (
+ {(channelsTableLength > 0 || channelIds.length > 0) && (