Português · English
Um cartão de memória para o seu PS5: backup automático e versionado dos saves de um console com jailbreak para um computador da sua rede, com interface web.
Dados de exemplo. No uso real, cada bloco mostra o ícone do jogo.
- Somente leitura no PS5. Só lista e baixa arquivos pelo FTP do console. Nada é gravado, apagado ou restaurado nele.
- Todos os perfis, cada um ligado ou desligado com um toque.
- Histórico de versões de cada save, com checksum, para voltar no tempo.
- Limpeza que não destrói o passado: versões antigas são rareadas, não zeradas, e passam por uma lixeira.
- Avisos no Discord sem enxurrada: uma mensagem por sessão de jogo, editada no lugar.
- Sem dependências em execução: só a biblioteca padrão do Python.
- Interface e avisos em português ou inglês.
Este projeto serve para guardar os seus próprios saves. Ele não copia jogos e não ajuda a desbloquear o console.
- Um PS5 já desbloqueado, com o payload ftpsrv (ps5-payload-dev/ftpsrv) rodando (porta 2121). A maioria dos pacotes de payloads já o carrega.
- Um computador sempre ligado na mesma rede (servidor, notebook, mini PC, NAS) com Windows ou com Docker e Docker Compose.
- O IP do PS5 fixo no roteador (reserva de DHCP), para ele não mudar.
Para restaurar um save você também vai querer o Garlic SaveMgr no PS5.
Comparação com o Garlic SaveMgr v1.13:
| Garlic SaveMgr v1.13 | Memcard | |
|---|---|---|
| Cópia automática | 15 s após fechar o jogo, se o save mudou | Save alterado, PS5 ligou, agenda ou manual; uma versão a cada 10 min durante o jogo |
| Histórico | ZIP por jogo, acumulado sem apagar | Versões por arquivo, com retenção, lixeira e versões fixadas |
| Destino | PS5, USB, FTP simples ou Google Drive (só com o navegador aberto) | Pasta no PC ou servidor |
| Integridade | Sem conferência após a cópia | SHA-256 por versão e conferência semanal |
| Avisos | Na tela do PS5 | Discord por sessão e resumo semanal |
O Garlic sozinho basta se você quer cópias automáticas ao fechar o jogo e um histórico fora do console, sem retenção nem conferência de integridade. Se você não precisa de cópias durante o jogo nem de avisos no Discord, pode ficar com ele, que também é a ferramenta indicada abaixo para restaurar saves.
Primeira vez? Siga o guia de instalação em 5 minutos, com os caminhos Windows e Docker, a primeira cópia e os avisos no Discord. Quer entender como o projeto funciona por dentro? Leia a arquitetura explicada, escrita para quem não programa.
git clone https://github.com/bps2414/memcard.git
cd memcard
cp config.example.toml config.toml
cp .env.example .envAbra o config.toml e troque host pelo IP do seu PS5. Se errar ou o IP mudar, o
Memcard procura o PS5 sozinho na rede (IP e porta do FTP) e corrige o arquivo; em
Ajustes há o botão Procurar agora. A busca varre o /24 do host configurado;
para outra rede, defina subnet (ex.: "192.168.0.0/24"). Depois:
docker compose up -dIsso baixa a imagem pronta de ghcr.io/bps2414/memcard (amd64 e arm64), publicada
a cada mudança na main. O compose.yml já traz o Watchtower, que a cada 15 min confere se há imagem nova e atualiza
sozinho (para manual, remova esse serviço e use docker compose pull && docker compose up -d).
Se preferir construir a partir do código desta pasta, use docker compose up -d --build.
Abra http://<ip-do-computador>:8765. Com o PS5 ligado e o ftpsrv carregado, a
primeira cópia acontece sozinha em menos de um minuto.
Os backups ficam na pasta data/, ao lado do projeto. Para guardar em outro
disco, mude BACKUP_DIR no .env.
-
Baixe
memcard.exeememcard.exe.sha256na release e guarde os dois numa pasta sua, onde você possa gravar arquivos. Não precisa instalar Python. -
Confira o SHA-256 no PowerShell, dentro dessa pasta:
(Get-FileHash .\memcard.exe -Algorithm SHA256).Hash.ToLower() Get-Content .\memcard.exe.sha256
O primeiro resultado deve ser igual ao hash no começo do segundo.
-
Abra
memcard.execom dois cliques. O executável não tem assinatura digital, então o SmartScreen pode mostrar O Windows protegeu o computador. Depois de conferir o hash, use Mais informações › Executar assim mesmo. -
A interface abre no navegador em
http://127.0.0.1:8765. Em Ajustes › Console, confira o IP do PS5 ou use Procurar agora. Mantenha a janela do console aberta enquanto quiser os backups. Abrir o executável de novo só reabre a interface.
Os ajustes (config.toml, criado ao salvar na interface) e a pasta data/
ficam ao lado do executável, mesmo quando ele é iniciado por um atalho de outra
pasta. data/ guarda os saves, o histórico, o registro e o webhook. Para usar
outros caminhos, defina PS5BACKUP_CONFIG e PS5BACKUP_DATA no ambiente.
No executável, a interface só escuta no próprio PC (127.0.0.1). A variável de
ambiente WEB_BIND muda esse endereço; 0.0.0.0 permite acesso pela rede local.
Para iniciar com o Windows, crie um atalho para memcard.exe, pressione
Win+R, digite shell:startup e coloque o atalho na pasta que abrir. Ele
inicia depois que você entrar na sua conta do Windows.
Não há atualização automática no Windows. Para atualizar, feche o Memcard,
baixe a nova versão, confira o SHA-256 e substitua só o memcard.exe, preservando
config.toml e data/.
Com Python 3.13, copie config.example.toml para config.toml e ajuste o
IP do console. Defina PS5BACKUP_CONFIG com o caminho completo desse arquivo e
PS5BACKUP_DATA com o caminho completo da pasta dos backups. No PowerShell,
dentro da pasta do projeto:
$env:PS5BACKUP_CONFIG = "$PWD/config.toml"
$env:PS5BACKUP_DATA = "$PWD/data"
python -c "import sys; sys.path.insert(0, 'app'); import ps5backup; sys.exit(ps5backup.main())" daemonNo Linux, use export PS5BACKUP_CONFIG="$PWD/config.toml" e
export PS5BACKUP_DATA="$PWD/data" antes do mesmo comando. Abra
http://localhost:8765; o terminal precisa ficar aberto enquanto o serviço roda.
A interface segue o idioma do navegador (português ou inglês) e pode ser trocada
em Ajustes › Idioma; essa escolha fica guardada no navegador. Os avisos do
Discord usam a chave language de [notify] ("pt-BR" ou "en"), que também
aparece em Ajustes. O registro do serviço e a linha de comando ficam em português.
Cartões. Cada perfil do PS5 é um cartão de memória e cada jogo é um bloco. O número no bloco é quantos saves aquele jogo tem (um jogo costuma gravar vários arquivos: perfil, sistema, cada slot). O interruptor do cartão tira ou coloca o perfil no backup. Clique num bloco para ver os saves do jogo, o histórico de cada um, baixar, fixar uma versão ou tirar o jogo do backup.
Ajustes. Tudo é configurável ali e vale na hora, sem reiniciar: gatilhos,
regras de limpeza, avisos e endereço do console. A interface regrava o
config.toml; editar o arquivo à mão também funciona.
Projeção de espaço. Abaixo dos cartões, o painel estima quanto os backups vão ocupar em 30 dias, 90 dias e 1 ano. O cálculo repete o ritmo real de cópias dos últimos dias e simula cada dia futuro com as suas regras de limpeza.
Painel. Um mapa de quando o console foi usado (por hora, nos últimos 14 dias, com filtro por perfil), o tempo de jogo estimado por jogo, o espaço que cada jogo ocupa e a curva de espaço projetada para 12 meses. O tempo de jogo é medido pelos momentos em que o jogo gravou saves, então é uma estimativa por baixo.
Registro. Cópias recentes, conferência de integridade e o log do serviço.
Uma vez por semana o serviço refaz o checksum de todas as versões guardadas e
compara com o que foi anotado na hora da cópia. Não depende do PS5 estar ligado.
Se tudo bate, nada acontece; se alguma versão não bate (disco com defeito,
arquivo apagado por engano), chega um aviso no Discord e a interface mostra
quais são. O intervalo fica em Ajustes › Quanto guardar (verify_interval_days,
0 desliga), e o botão Conferir agora da aba Registro roda na hora.
| Gatilho | O que faz |
|---|---|
| Save alterado | Olha os saves a cada 30 s e copia quando um muda e fica igual por duas leituras seguidas. |
| PS5 ligou | Copia assim que o ftpsrv responde depois do desbloqueio. |
| Agendamento | Conferência completa por intervalo ou em horários fixos, com o PS5 ligado. |
| Manual | Botão Copiar agora ou docker compose exec ps5-backup ps5backup backup. |
Com o console desligado ou em repouso não existe nada rodando nele para ler os saves, então não há como fazer backup "ao desligar". O que resolve é o gatilho de save alterado: quando o console cai, a cópia já foi feita. O que for gravado no último minuto antes de desligar entra na próxima vez que ele ligar.
O jailbreak atual não sobrevive a um desligamento completo. Até você rodar o desbloqueio de novo, o PS5 aparece como desligado, e isso é esperado.
Quando um perfil novo aparece no console, ele segue a regra de Ajustes › Perfis e jogos: entra no backup sozinho (padrão) ou fica de fora até você decidir. Nos dois casos você é avisado e ele ganha a etiqueta "novo". Desligar um perfil não apaga as versões que já estavam guardadas.
Alguns jogos regravam o save a cada minuto (medido: ~17 vezes por hora, 6 MB cada, em 5 arquivos, o que daria uns 500 MB por hora de jogo). Guardar tudo encheria o disco; apagar por idade deixaria você sem o save de meses atrás. A solução tem duas etapas.
Durante o jogo: a cópia mais recente é sempre guardada, mas só fica uma versão a cada 10 minutos. As intermediárias são substituídas pela seguinte. Você não perde nada ao desligar; só deixa de acumular uma versão por minuto.
Com o tempo: as versões antigas são rareadas, nunca zeradas.
| Idade da versão | O que fica |
|---|---|
| Última hora | Todas (uma a cada 10 min) |
| Até 2 dias | A última de cada hora |
| Até 14 dias | A última de cada dia |
| Até 12 semanas | A última de cada semana |
| Mais velho que isso | A última de cada mês, sem prazo |
Travas de segurança:
- A limpeza só mexe na pasta de backup. No PS5 nada é apagado nem alterado.
- As 3 versões mais novas de cada save nunca saem.
- Versões fixadas nunca saem. Fixe o save de antes de um chefe, de um final, de uma decisão.
- Versões com mais de 2 dias, quando rareadas, vão para
data/trash/e só são apagadas de vez depois de 7 dias. Para recuperar, mova a pasta de volta para o mesmo caminho emdata/saves/. - Os limites de espaço (tamanho dos backups e espaço livre no disco) só avisam. Nunca apagam nada.
- Desligar um perfil ou um jogo, ou o save sumir do console, não apaga nada.
Projeção para um save de 6 MB regravado 17 vezes por hora, 3 horas por dia:
| Sem limpeza | Com as regras padrão | |
|---|---|---|
| 30 dias | 9 GB | 0,26 GB |
| 200 dias | 61 GB | 0,34 GB |
Um jogo com 5 saves assim fica em torno de 1,7 GB enquanto é jogado todo dia, e encolhe depois que você para de jogar. Comprimir não ajuda: as imagens são criptografadas (ganho medido de 1 a 2%).
Todos os números são ajustáveis em Ajustes › Quanto guardar, que também mostra quanto cada jogo ocupa e quanto resta no disco.
Em Ajustes › Avisos no Discord, cole a URL de um webhook do seu canal e toque em Enviar teste. Quando o PS5 liga chega uma mensagem, que é editada em silêncio a cada cópia (o Discord não notifica edições). Quando ele desliga, ela é trocada por um resumo da sessão: duração, jogos, cópias e espaço total. São dois avisos por sessão. Falhas repetidas geram no máximo um aviso por hora. A mensagem mostra como "jogando agora" os jogos que gravaram saves nos últimos 15 minutos; a janela é ajustável.
Toda segunda de manhã chega também um resumo da semana: tempo de jogo por jogo e por perfil, o dia mais jogado e o espaço ocupado. Semana sem jogo não gera mensagem, e dá para desligar em Ajustes.
O webhook fica em data/secrets.json, fora do repositório. Qualquer outra URL
recebe um POST de texto simples (serve para ntfy, por exemplo).
O projeto nunca escreve no PS5. Restaurar é sempre uma ação sua:
- Na interface, abra o save e baixe a versão desejada.
- Abra o Garlic SaveMgr (
http://<ip-do-ps5>:8082), aba Import, escolha o perfil de destino e envie o arquivosdimg_.... - O Garlic compara a conta do save com a do perfil e oferece o resign se for outra.
O save de PS5 é uma imagem criptografada única. Restaurar no mesmo console é o caso garantido; em outro console não foi verificado.
data/
saves/<perfil>/<TITLE_ID>/<arquivo>/<data-hora>/<arquivo> imagem do save
saves/<perfil>/<TITLE_ID>/<arquivo>/<data-hora>/meta.json sha256, jogo, perfil, gatilho
trash/... versões rareadas, aguardando o prazo
cache/art/<TITLE_ID>/ ícone e arte do jogo
state.json backup.log secrets.json
São arquivos comuns: dá para copiar a pasta inteira para outro disco ou nuvem.
docker compose logs -f ps5-backup # acompanhar
docker compose exec ps5-backup ps5backup status # estado
docker compose exec ps5-backup ps5backup diag # diagnóstico de compatibilidade
docker compose exec ps5-backup ps5backup backup # copiar agora
docker compose exec ps5-backup ps5backup list # saves e caminho da última versão
docker compose exec ps5-backup ps5backup verify # conferir checksums
docker compose exec ps5-backup ps5backup verify --remote # comparar com o PS5 ao vivo
docker compose exec ps5-backup ps5backup prune # aplicar a limpeza agora- Por padrão a interface não tem senha. No executável, só o próprio PC abre;
no Docker e no código-fonte, qualquer aparelho da rede local abre.
Para exigir login, defina
WEB_PASSWORDno ambiente. No Docker, use o.enve rodedocker compose up -d. Com a senha definida, tudo pede login: páginas, API e downloads. A sessão dura 30 dias e cinco senhas erradas seguidas bloqueiam novas tentativas daquele aparelho por 5 minutos. - Mesmo com senha, use só na rede local e não encaminhe a porta 8765 no roteador: a conexão é HTTP, sem criptografia.
- O ftpsrv do PS5 também não tem senha e dá acesso de escrita ao console para
qualquer aparelho da rede. Este projeto só usa os comandos de leitura
(
CWD,MLSD,RETR, além deFEATeSYSTsó no diagnóstico).
O histórico de mudanças está em CHANGELOG.md e nas
Releases. Versionamento semântico.
ps5backup --version mostra a instalada.
| Sintoma | O que verificar |
|---|---|
| PS5 não é encontrado sozinho | A busca só vê o bloco subnet (ou o /24 do host). Ajuste subnet ao da sua rede e confira docker compose logs. |
| "PS5 desligado" com o console ligado | O desbloqueio foi rodado depois de ligar? O ftpsrv está carregado? Teste nc -vz <ip-do-ps5> 2121. |
| Nenhum perfil aparece | Confira o IP em Ajustes › Console e toque em Copiar agora. |
| Jogo aparece só com o ID | O console não tem os metadados dele (comum em jogos de PS4). O backup funciona igual. |
| Save fica "aguardando" por muito tempo | O jogo está regravando sem parar; ele é copiado assim que estabiliza. |
A cada ciclo o serviço lista /user/home/<perfil>/savedata_prospero/<jogo>/
(e savedata/ para PS4) pelo FTP, compara tamanho e data com a última leitura,
baixa só o que mudou e confere, relistando, que o arquivo não mudou durante a
cópia. Nomes e artes vêm de /user/appmeta e do banco de saves do console.
Testado com ftpsrv v0.21.1 no firmware 13.42.
Veja a tabela de compatibilidade e como relatar o
resultado de ps5backup diag ou memcard.exe diag no seu console.
Veja o ROADMAP, incluindo a avaliação de um payload próprio.
MIT. Veja LICENSE.
