Um widget nativo para KDE Plasma 6 que monitora o Transmission RPC em tempo real, filtrando torrents por categorias do Sonarr/Radarr, com gráfico de velocidade ao vivo e estatísticas acumuladas.
Este widget foi criado com Hermes Agent — um agente de IA desenvolvido pela Nous Research.
A criadora deste projeto não é desenvolvedora de software. A ideia surgiu da necessidade real de monitorar a rede de um Arr Stack (Sonarr + Radarr + Transmission) em tempo real, diretamente no desktop KDE Plasma. Como não havia um widget que atendesse a essa necessidade específica — monitorar apenas os torrents gerenciados pelo Sonarr/Radarr com gráfico em tempo real —, a solução foi usar um agente de IA que pudesse escrever o código QML necessário a partir das descrições do que se queria.
O Hermes Agent foi escolhido por sua capacidade de:
- Iterar rapidamente entre código e teste visual (escrever QML → reiniciar Plasma → ajustar)
- Debugar problemas de escopo QML do Plasma 6 que são não-intuitivos
- Aprender com os erros e documentar as soluções (skills persistentes)
- Trabalhar com o usuário em português brasileiro
Todo o código fonte, estrutura do plasmoid, lógica de RPC, Canvas do gráfico, e UI foram escritos pelo agente de IA com direção e feedback da criadora.
- Cards de velocidade em tempo real — Download, Upload, Ativos (B/s, KB/s, MB/s auto-formatado)
- Gráfico de velocidade ao vivo — Linhas de download/upload com fill, grid e eixos rotulados, janela configurável (minutos ou tempo real)
- Lista de torrents filtrada — Mostra apenas torrents marcados como
sonarrouradarrno Transmission - Status individual — Progresso (%), velocidades, ETA, peers, status (Enfileirado, Baixando, Semeando, Pausado)
- Estatísticas de sessão — Total de download/upload desde o início da sessão atual
- Estatísticas acumuladas — Total de download/upload de toda a vida do Transmission
- Representação compacta — No painel, mostra ▼/▲ velocidades em formato reduzido
- Tooltip — Velocidades atuais ao passar o mouse
- 6 temas: Synthwave (padrão), Leve (transparente), Cyberpunk 2077, Matrix, AMOLED e Personalizado
- Tema Personalizado — 10 cores editáveis via hex com preview ao vivo: fundo (topo/base), 2 acentos, download, upload, texto, texto suave, alerta, crítico
- Tamanho da fonte — Escala global 80–140%
- Espessura da borda (0–4px) e raio dos cantos (0–24px)
- Transparência real — 0–100%, o fundo mistura direto no wallpaper (HUD do Plasma removido via
NoBackground)
- Botão de teste de conexão — Valida credenciais RPC com feedback inline ✅/❌ (retry automático de session-id 409)
- Modo Econômico — 4× menos updates, sem gráfico (economia de CPU/bateria)
- Máx. torrents na lista — Limita a lista de 5 a 50 itens
- Configuração persistente — Tudo salvo via KConfigXT
- Versão dinâmica — O campo Versão na config lê direto do metadata
| Synthwave (padrão) | Cyberpunk 2077 |
|---|---|
![]() |
![]() |
| Matrix | AMOLED |
|---|---|
![]() |
![]() |
| Componente | Versão Mínima | Notas |
|---|---|---|
| KDE Plasma | 6.0+ | O widget usa a API declarativa do Plasma 6 (PlasmoidItem, PlasmaComponents3) |
| Qt | 6.0+ | Import QtQuick sem versão explícita (QML 3) |
| Transmission | 2.40+ | Com RPC habilitado |
| Sonarr | qualquer | Opcional — filtro funciona por categoria/label no Transmission |
| Radarr | qualquer | Opcional — filtro funciona por categoria/label no Transmission |
| Distro | qualquer distro com Plasma 6 | Testado em Bazzite (Fedora Atomic), Fedora, Arch |
Não compatível com KDE Plasma 5 — O widget usa
PlasmoidItem(nãoPlasmaWidgets.Applet),metadata.jsoncomKPlugin, eX-Plasma-API-Minimum-Version: "6.0".
Baixa e instala a versão mais recente direto da última release, sem clone:
curl -fsSL https://github.com/Amielle-Inside/TransmissionMonitorwidget/releases/latest/download/transmission-monitor.plasmoid -o /tmp/transmission-monitor.plasmoid && kpackagetool6 --type Plasma/Applet --upgrade /tmp/transmission-monitor.plasmoid 2>/dev/null || kpackagetool6 --type Plasma/Applet --install /tmp/transmission-monitor.plasmoid; kbuildsycoca6 --noincremental; systemctl --user restart plasma-plasmashell.serviceNota: o restart do plasmashell é necessário para a transparência do fundo aplicar (Plasma só lê
backgroundHintsno startup).
- Baixe o arquivo
transmission-monitor.plasmoidda página de Releases - No KDE Plasma, clique com o botão direito no desktop ou painel → Adicionar Widgets → ⋮ → Instalar do arquivo
- Selecione o arquivo baixado
- Reinicie o Plasma:
systemctl --user restart plasma-plasmashell.service
git clone https://github.com/Amielle-Inside/TransmissionMonitorwidget.git
cd TransmissionMonitorwidget
kpackagetool6 --type Plasma/Applet --install . && kbuildsycoca6 --noincremental
systemctl --user restart plasma-plasmashell.serviceApós adicionar o widget ao desktop ou painel:
- Clique com o botão direito no widget → Configurar
- Preencha os dados do Transmission RPC:
| Campo | Descrição | Padrão |
|---|---|---|
| Host | IP ou hostname do Transmission | localhost |
| Porta | Porta RPC do Transmission | 9091 |
| Usuário | Usuário RPC (deixe vazio se não usar auth) | (vazio) |
| Senha | Senha RPC (deixe vazio se não usar auth) | (vazio) |
| Caminho RPC | Path do endpoint RPC | /transmission/rpc |
| Intervalo | Frequência de atualização (ms) | 5000 |
| Título do Widget | Nome exibido no header | Transmission Monitor |
| Mostrar gráfico | Exibir/ocultar o gráfico de velocidade | true |
| Tempospan do gráfico | Janela de tempo em minutos (0 = tempo real) | 5 |
| Tema | Synthwave, Leve, Cyberpunk 2077, Matrix, AMOLED, Personalizado |
Synthwave |
| Tamanho da Fonte | Escala global da fonte | 100% |
| Espessura da Borda | Borda dos cards (px) | 1 |
| Raio dos Cantos | Cantos arredondados (px) | 12 |
| Cores Personalizadas | 10 cores editáveis (fundo, acentos, texto...) — só no tema Personalizado | (defaults synthwave) |
| Transparência | Opacidade do fundo (0–100%) | 0% |
| Modo Econômico | 4× menos updates, sem gráfico | off |
| Máx. torrents na lista | Limite de itens na lista (5–50) | 15 |
- Clique em Testar Conexão — se mostrar ✅, está pronto
- Clique em OK
Dica: Para que o filtro funcione, seus torrents do Sonarr/Radarr precisam estar marcados com as categorias
sonarrouradarrno Transmission. O Sonarr e Radarr fazem isso automaticamente ao enviar torrents para o Transmission.
org.kde.transmissionmonitor/
├── metadata.json # Metadata do plugin (Plasma 6 KPlugin)
├── metadata.desktop # Metadata legado (compatibilidade)
└── contents/
├── ui/
│ ├── main.qml # UI principal + lógica RPC + Canvas do gráfico
│ └── ConfigGeneral.qml # Interface de configuração
├── config/
│ ├── config.qml # ConfigModel apontando para ConfigGeneral.qml
│ └── main.xml # Schema KConfigXT (persistência das config)
└── code/
└── main.js # Helper de teste de conexão (chamado pela config UI)
- Timer disputa a cada
updateIntervalms (padrão 2000ms) fetchData()faz chamada RPC ao Transmission viaXMLHttpRequestsíncrono (POST)- Três métodos RPC são chamados:
session-stats,torrent-get(com filtro) updateUI()processa a resposta e atualiza as properties do root- QML bindings reagem automaticamente: cards, lista de torrents, texto do gráfico
- Canvas do gráfico é repintado via pattern
paintTick(incrementa →ConnectionsdispararequestPaint()) - Lista de torrents é filtrada client-side: apenas torrents com
labelscontendosonarrouradarr
O widget consulta todos os torrents ativos do Transmission e filtra no client-side:
var labels = t.labels || []
var isArr = labels.some(function(l) {
return l === "sonarr" || l === "radarr"
})Apenas torrents marcados são exibidos na lista.
O widget usa o endpoint RPC do Transmission (POST /transmission/rpc):
- Primeira requisição pode retornar
409com headerX-Transmission-Session-Id - O código captura esse header e refaz a requisição com ele
- Autenticação via Basic Auth (
Authorization: Base64...s))
Métodos usados:
| Método | Uso |
|---|---|
session-stats |
Velocidades atuais + estatísticas de sessão e acumuladas |
torrent-get |
Lista de torrents com nome, status, progresso, velocidades, peers, labels |
O gráfico é desenhado em um Canvas QML:
- 3 camadas de Canvas:
gridCanvas(grid + eixos + labels),dataCanvas(linhas + fills),speedCanvas(valores atuais) - Pattern
paintTick: Como IDs dentro defullRepresentationnão são visíveis do escopo root, um contadorproperty int paintTickno root é incrementado a cada update. Cada Canvas observa viaConnections { target: root; function onPaintTickChanged() { requestPaint() } } - Headroom de 20%:
maxSpeed * 1.2garante que a linha nunca encoste no topo - Fill antes de lines: Fills de upload/download são desenhados primeiro, linhas por cima, evitando sólido block
- Time-based X-axis: Pontos são posicionados por timestamp, não por índice
- KDE Plasma 6 development packages (já incluído em qualquer instalação do Plasma 6)
kpackagetool6(parte do pacoteplasma-frameworkouplasma5-sdk)git
# 1. Clone
git clone https://github.com/Amielle-Inside/TransmissionMonitorwidget.git
cd transmission-monitor
# 2. Verifique a estrutura
ls -la
# Deve conter: metadata.json, metadata.desktop, contents/
# 3. Empacote como .plasmoid (estrutura interna: org.kde.transmissionmonitor/)
mkdir -p /tmp/pkg/org.kde.transmissionmonitor
cp -r metadata.json metadata.desktop contents README.md /tmp/pkg/org.kde.transmissionmonitor/
cd /tmp/pkg && zip -r transmission-monitor.plasmoid org.kde.transmissionmonitor
# 4. Instale o pacote
kpackagetool6 --type Plasma/Applet --install transmission-monitor.plasmoid
# 5. Reconstrua o cache do sistema
kbuildsycoca6 --noincremental
# 6. Reinicie o Plasma
systemctl --user restart plasma-plasmashell.service
# 7. Adicione o widget:
# Clique direito no desktop → Adicionar Widgets → procure "Transmission Monitor"# Após fazer alterações no código:
kpackagetool6 --type Plasma/Applet --upgrade transmission-monitor.plasmoid
rm -rf ~/.cache/plasma* # limpar cache QML
systemctl --user restart plasma-plasmashell.servicekpackagetool6 --type Plasma/Applet --remove org.kde.transmissionmonitor| Problema | Solução |
|---|---|
| Widget não aparece na lista | Execute kbuildsycoca6 --noincremental |
| "Widget sem suporte" | Verifique se seu Plasma é versão 6.0+ |
| Gráfico vazio mas dados chegam | Reinicie o Plasma após instalar (systemctl --user restart plasma-plasmashell) |
| "Sessão: 0 B" sempre | Confirme que o Transmission RPC está acessível (curl http://host:9091/transmission/rpc) |
| Lista de torrents vazia | Verifique se seus torrents têm labels sonarr ou radarr no Transmission |
| 409 Conflict | É normal — o widget trata isso automaticamente |
| Erro de auth 401 | Verifique usuário e senha do RPC nas configurações |
transmission-monitor/
├── metadata.json # KPlugin JSON (Plasma 6 obrigatório)
├── metadata.desktop # Desktop entry (compatibilidade)
├── contents/
│ ├── ui/
│ │ ├── main.qml # ~850 linhas — UI + RPC + Canvas
│ │ └── ConfigGeneral.qml # Interface de configuração (KCM.SimpleKCM)
│ ├── config/
│ │ ├── config.qml # ConfigModel → ConfigGeneral.qml
│ │ └── main.xml # KConfigXT schema (10 propriedades)
│ └── code/
│ └── main.js # testConnection() helper
└── README.md # Este arquivo
MIT License — sinta-se livre para usar, modificar e distribuir.
- Idealização e direção: Amielle
- Implementação: Hermes Agent (IA) com correções e feedback da criadora
- Nous Research pelo desenvolvimento do Hermes Agent
- KDE Community pelo Plasma 6 e PlasmaComponents3
- Transmission Project pelo excelente cliente de torrent e RPC



