OpenPtl é um cliente nativo multiplataforma para conexões SSH e operações SFTP, construído integralmente em Rust com Slint. A aplicação não depende de runtime web, HTML ou WebView: a interface, a orquestração de tarefas e os serviços de domínio são compilados no mesmo binário.
O cliente oferece um vault local criptografado para perfis e credenciais, proteção por senha mestre com Argon2id e XChaCha20-Poly1305, gerenciamento de conexões SSH/SFTP, shell local, terminal integrado, validação explícita de hosts desconhecidos e armazenamento seguro de known_hosts.
A interface principal é formada por uma sidebar organizada, dashboard de visão geral, cards de conexões, modais dinâmicas, formulários por seção, keychain, workspace de sessões, configurações e informações do produto. As operações de rede permanecem isoladas do código de apresentação e usam Tokio para executar tarefas assíncronas do protocolo SSH.
| Camada | Responsabilidade | Localização |
|---|---|---|
| Entrada | Inicialização da janela e inclusão dos componentes Slint | src/main.rs |
| Aplicação | Estado de navegação, formulários e casos de uso | src/app.rs |
| Ponte | Callbacks Slint e sincronização dos modelos visuais | src/ui/bridge.rs |
| Interface | Componentes, páginas, sidebar e modais | ui/app-window.slint |
| Backend | Coordenação de vault, SSH, SFTP e runtime assíncrono | src/backend.rs |
| Domínio | Modelos, vault criptografado e tarefas de transferência | src/libs/ |
| Protocolos | Sessões SSH e adaptadores SFTP | src/protocols/ |
O arquivo build.rs compila os arquivos declarativos Slint e slint::include_modules!() disponibiliza os componentes exportados para o Rust. O backend não conhece detalhes de layout; a ponte transforma ações da UI em chamadas da fachada Backend.
A interface foi estruturada para uma base visual compartilhada entre Windows, macOS, Linux e Android. O build desktop usa a janela nativa do Slint. O suporte Android requer o fluxo de compilação com Android SDK, NDK e o backend android-activity; a configuração de distribuição móvel deve ser adicionada ao pipeline específico do aplicativo.
É necessário ter o toolchain Rust estável, um compilador C compatível e as bibliotecas gráficas nativas da plataforma. Em distribuições Debian/Ubuntu, o ambiente básico pode ser preparado com build-essential, pkg-config, libx11-dev, libxkbcommon-dev, libwayland-dev e libudev-dev.
Para compilar a interface Slint, o projeto também usa slint-build como dependência de build. O Android requer adicionalmente o Android SDK, NDK e as ferramentas de empacotamento correspondentes.
cargo runPara uma compilação otimizada:
cargo build --releasePara executar os testes:
cargo testPara validar estilo e problemas comuns:
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warningsA primeira execução solicita uma senha mestre com pelo menos seis caracteres. A senha é usada localmente para derivar a chave do vault e não é persistida em texto puro. Ao conectar a um servidor cuja chave ainda não é conhecida, a aplicação exibe a impressão digital e exige uma confirmação explícita antes de gravá-la.
As credenciais devem ser cadastradas no vault e nunca em arquivos de configuração do projeto. O arquivo known_hosts de trabalho é materializado a partir de uma cópia protegida dentro do vault e é recapturado após alterações da sessão.
Este projeto é distribuído sob a licença MIT. Consulte LICENSE para o texto completo.
A interface utiliza um sistema visual próprio para aplicações operacionais modernas. A base segue uma escala de espaçamento em múltiplos de quatro, superfícies escuras em camadas, bordas discretas, hierarquia tipográfica, estados semânticos e alvos de interação confortáveis. A sidebar separa navegação global de conteúdo; cada página tem título, subtítulo e uma região de trabalho previsível; modais ficam reservadas para decisões de segurança, detalhes e confirmações destrutivas.
A aplicação evita usar cor como único indicador. Estados de sucesso, atenção e risco também aparecem por texto, ícones e ações explícitas. Campos sensíveis continuam mascarados e os formulários usam labels persistentes, agrupamento semântico e rolagem nos painéis de listas. A especificação detalhada das decisões está em design-research.md.
A direção foi comparada com os princípios de layout e espaçamento do Fluent 2, a organização de padrões e componentes do GNOME HIG, os fundamentos multiplataforma da Apple Human Interface Guidelines e a estrutura de tokens do Material Design 3. A implementação permanece nativa em Slint e não utiliza HTML, Tauri ou WebView.