diff --git a/apps/server/src/qbit/qbit.types.ts b/apps/server/src/qbit/qbit.types.ts
index c53edd2..82763b3 100644
--- a/apps/server/src/qbit/qbit.types.ts
+++ b/apps/server/src/qbit/qbit.types.ts
@@ -4,6 +4,7 @@ export interface QbitTorrentInfo {
size: number;
progress: number;
dlspeed: number;
+ upspeed?: number;
state: string;
magnet_uri?: string;
completed?: number;
diff --git a/apps/web/src/components/torrents/TorrentTable.tsx b/apps/web/src/components/torrents/TorrentTable.tsx
index b398108..b992a24 100644
--- a/apps/web/src/components/torrents/TorrentTable.tsx
+++ b/apps/web/src/components/torrents/TorrentTable.tsx
@@ -37,6 +37,8 @@ const formatSpeed = (bytesPerSec: number) => {
return `${kb.toFixed(1)} KB/s`;
};
+const isUploadState = (state: string) => /upload|stalledup|forcedup|up$/i.test(state);
+
export const TorrentTable = () => {
const torrents = useAppStore((s) => s.torrents);
const selected = useAppStore((s) => s.selectedHash);
@@ -176,7 +178,7 @@ export const TorrentTable = () => {
/>
{Math.round(torrent.progress * 100)}%
- {formatSpeed(torrent.dlspeed)}
+ {formatSpeed(isUploadState(torrent.state) ? (torrent.upspeed ?? 0) : torrent.dlspeed)}
{renderState(torrent.state)}
{getProfileName(torrent.hash) && (
diff --git a/apps/web/src/store/useAppStore.ts b/apps/web/src/store/useAppStore.ts
index 2bc1a2a..05db578 100644
--- a/apps/web/src/store/useAppStore.ts
+++ b/apps/web/src/store/useAppStore.ts
@@ -6,6 +6,7 @@ export interface TorrentInfo {
size: number;
progress: number;
dlspeed: number;
+ upspeed?: number;
state: string;
magnet_uri?: string;
tracker?: string;