Seu próprio "Frame.io" — auto-hospedado, sem mensalidade, sem limite de armazenamento.
Receba vídeos de qualquer câmera direto no seu servidor, com proxy leve gerado no aparelho e painel web para organizar, assistir e compartilhar.
O Fframe resolve um problema simples: apps de "camera to cloud" (Frame.io, etc.) cobram mensalidade e guardam seus vídeos no servidor de outra empresa. O Fframe é o mesmo fluxo — grava, sobe um proxy leve automaticamente, assiste e organiza em um painel — mas rodando no seu próprio servidor, com seus próprios dados.
O projeto tem duas partes, cada uma com seu README detalhado:
📦 server/ |
Servidor Node.js self-hosted: recebe vídeos, organiza em projetos, painel web (PWA). |
📱 android-app/ |
App Android com bolha flutuante: detecta qualquer vídeo gravado por qualquer app de câmera e envia pro seu servidor. |
flowchart LR
B[🫧 Fframe Uploader<br/>bolha flutuante]
subgraph "Seu servidor"
S[Fframe Server<br/>Node.js + Docker]
D[(data/<br/>vídeos + projetos)]
P[🖥️ Painel web<br/>PWA]
end
B -- "POST /_ingest<br/>header X-Device-Key" --> S
S --> D
P -- assiste / organiza / revoga dispositivos --> S
- 🔓 Sem mensalidade, sem limite artificial — o armazenamento é o disco do seu servidor
- 🎞️ Proxy leve gerado no próprio aparelho antes do envio (720 / 1080 LQ / 1080 HQ)
- 🫧 Bolha flutuante sobre qualquer app de câmera — não precisa ser um app específico
- 📷 Pareamento por QR code — escaneia e já está configurado, sem digitar servidor/chave
- 🔑 Múltiplos dispositivos, cada um com sua própria chave, revogável individualmente pelo painel
- 💬 Revisão estilo Frame.io — player próprio com pins de comentário na barra de reprodução, timecode (
HH:MM:SS:FF) e passo frame a frame, atalhos (espaço/J-K-L/setas), comentário por trecho (in/out), respostas (threads) e o comentário que acende quando o playhead passa por ele - 🌐 Painel bilíngue (português e inglês) com troca de idioma na hora, sem recarregar
- 🗂️ Painel web (PWA): projetos, galeria, player, exclusão
- 📥 Fila de envio (retoma sozinho quando a rede volta)
cd server
cp .env.example .env # ajuste PUBLIC_BASE se for expor publicamente
docker compose up -d --buildAcesse http://localhost:3260 e crie seu usuário/senha de admin no primeiro acesso.
2. Compile o app (ou baixe o APK pronto em Releases)
cd android-app
./gradlew assembleReleaseNo painel: Dispositivos → Adicionar dispositivo → escaneie o QR com o app. Pronto — grave em qualquer app de câmera e o vídeo sobe sozinho.
Detalhes de configuração, variáveis de ambiente e compilação: veja os READMEs de
server/ e android-app/.
| Parte | Idiomas |
|---|---|
| 🖥️ Painel web | 🇧🇷 Português e 🇬🇧 Inglês — troca por um menu suspenso (na tela de login e na barra lateral). A escolha fica salva no navegador e vale também para datas e horas. Na primeira visita, o idioma é detectado pelo navegador. |
| 📱 App Android | 🇧🇷 Apenas português. A interface do app não é traduzida. |
Para adicionar um idioma novo ao painel, acrescente um bloco em
server/public/i18n.js com as mesmas chaves — o menu suspenso passa a
mostrar a opção automaticamente, sem mexer em mais nada. Chaves que faltarem caem no português.
O Fframe Server é só um container Docker Compose — não roda "direto" no hypervisor, mas dentro de uma VM ou LXC que o Proxmox hospeda. Dois caminhos, ambos leves (o container usa 512 MB de RAM e 1 CPU no limite configurado):
- LXC (recomendado) — crie um container LXC (Debian/Ubuntu), instale o Docker dentro dele e
rode o
docker compose up -dnormalmente. É o caminho mais leve; os Proxmox VE Helper-Scripts têm um script pronto de "Docker LXC" que poupa a instalação manual. - VM — se preferir isolamento total (kernel próprio), sobe uma VM pequena (Debian/Ubuntu, 1 vCPU / 1 GB RAM já sobra) com Docker e roda do mesmo jeito.
Em qualquer um dos dois, exponha a porta do docker-compose.yml (padrão 3260) na rede do
Proxmox e, se quiser acesso de fora de casa, coloque um reverse proxy na frente (Nginx Proxy
Manager, Caddy, ou um túnel Cloudflare) apontando pro PUBLIC_BASE do .env.
- Nenhum segredo, IP ou domínio fica hardcoded no código — tudo é configurado via
.env(servidor) ou digitado/pareado por QR no app (nunca embutido no APK) - Senha de admin com hash bcrypt; sessão httpOnly + secure + sameSite
- Cada dispositivo tem sua própria chave aleatória de 48 caracteres, revogável individualmente
- Gerenciar dispositivos (criar/revogar) exige sessão de admin — uma chave de dispositivo sozinha não consegue criar ou revogar outras
- Container roda com
cap_drop: ALL,no-new-privileges, limite de memória e sem privilégios extras
Veja detalhes completos em server/README.md e
android-app/README.md.
Issues e PRs são bem-vindos. Este é um projeto de estudo/interoperabilidade — use com apps e contas que você tem direito de usar.