diff --git a/web/i18n/pt/a11y/dialog.json b/web/i18n/pt/a11y/dialog.json
new file mode 100644
index 00000000..04008f86
--- /dev/null
+++ b/web/i18n/pt/a11y/dialog.json
@@ -0,0 +1,5 @@
+{
+ "picker.item.video": "miniatura do vídeo",
+ "picker.item.gif": "miniatura do gif",
+ "picker.item.photo": "miniatura da foto"
+}
diff --git a/web/i18n/pt/a11y/donate.json b/web/i18n/pt/a11y/donate.json
new file mode 100644
index 00000000..047baab0
--- /dev/null
+++ b/web/i18n/pt/a11y/donate.json
@@ -0,0 +1,4 @@
+{
+ "share.qr.expand": "qr code. clique para expandir.",
+ "share.qr.collapse": "qr code expandido. pressione para fechar."
+}
diff --git a/web/i18n/pt/a11y/general.json b/web/i18n/pt/a11y/general.json
new file mode 100644
index 00000000..b8398e8b
--- /dev/null
+++ b/web/i18n/pt/a11y/general.json
@@ -0,0 +1,3 @@
+{
+ "back": "voltar"
+}
diff --git a/web/i18n/pt/a11y/save.json b/web/i18n/pt/a11y/save.json
new file mode 100644
index 00000000..e359d43f
--- /dev/null
+++ b/web/i18n/pt/a11y/save.json
@@ -0,0 +1,12 @@
+{
+ "clear_input": "limpar entrada",
+ "download.check": "verificando o download...",
+ "link_area.turnstile": "área de entrada de link. verificando se você não é um robô.",
+ "tutorial.shortcut.photos": "adicionar atalho para fotos",
+ "link_area": "área de entrada de link",
+ "download": "baixar",
+ "download.think": "processando o link...",
+ "download.done": "download pronto",
+ "download.error": "erro ao fazer download",
+ "tutorial.shortcut.files": "adicionar atalho para arquivos"
+}
diff --git a/web/i18n/pt/a11y/tabs.json b/web/i18n/pt/a11y/tabs.json
new file mode 100644
index 00000000..2c96dfa5
--- /dev/null
+++ b/web/i18n/pt/a11y/tabs.json
@@ -0,0 +1,3 @@
+{
+ "tab_panel": "painel de abas"
+}
diff --git a/web/i18n/pt/about.json b/web/i18n/pt/about.json
new file mode 100644
index 00000000..cb0caf56
--- /dev/null
+++ b/web/i18n/pt/about.json
@@ -0,0 +1,35 @@
+{
+ "page.faq": "perguntas frequentes",
+ "page.privacy": "política de privacidade",
+ "page.credits": "agradecimento & licenças",
+ "community.discord": "servidor da comunidade no discord",
+ "community.twitter": "conta de novidades no twitter",
+ "community.email": "email de suporte",
+ "heading.general": "termos gerais",
+ "heading.licenses": "licenças",
+ "heading.summary": "o melhor jeito de salvar o que você ama",
+ "heading.privacy": "privacidade líder",
+ "heading.community": "comunidade aberta",
+ "heading.abuse": "denunciar abuso",
+ "heading.local": "processamento no dispositivo",
+ "heading.saving": "salvando",
+ "heading.encryption": "encriptação",
+ "heading.plausible": "análise de tráfego anônima",
+ "heading.cloudflare": "privacidade web & segurança",
+ "heading.responsibility": "responsabilidade do usuário",
+ "heading.motivation": "motivação",
+ "page.general": "o que é cobalt?",
+ "page.terms": "termos e ética",
+ "community.github": "repositório no github",
+ "community.telegram": "canal de novidades no telegram",
+ "page.community": "comunidade & suporte",
+ "heading.testers": "testadores beta",
+ "support.github": "confira o código-fonte do cobalt, contribua com alterações ou relate problemas",
+ "support.discord": "peça ajuda ou converse com a comunidade e os desenvolvedores sobre o cobalt",
+ "support.twitter": "acompanhe as atualizações e o desenvolvimento do cobalt no twitter",
+ "support.telegram": "mantenha-se atualizado das últimas atualizações do cobalt pelo telegram",
+ "support.description.issue": "se você quiser relatar um bug ou algum outro problema recorrente, por favor relate pelo github.",
+ "support.description.help": "Use o Discord para qualquer outra pergunta. Descreva o problema corretamente em #cobalt-support, caso contrário ninguém poderá ajudá-lo.",
+ "support.description.best-effort": "todo o suporte é feito com o máximo de esforço porém não é garantido; uma resposta pode levar algum tempo.",
+ "support.bluesky": "acompanhe as atualizações e o desenvolvimento do cobalt em seu feed do bluesky"
+}
diff --git a/web/i18n/pt/about/credits.md b/web/i18n/pt/about/credits.md
new file mode 100644
index 00000000..593420e0
--- /dev/null
+++ b/web/i18n/pt/about/credits.md
@@ -0,0 +1,69 @@
+
+
+
+
+
+O cobalt é feito com amor e cuidado pela equipe de pesquisa e desenvolvimento da
+[imput](https://imput.net/).
+
+você pode nos apoiar na [página de doações](/donate)!
+
+
+
+
+
+Um grande agradecimento aos nossos “quebradores de coisas” por testarem as
+atualizações com antecedência e se certificarem de que estão estáveis. Eles
+também nos ajudaram a lançar o cobalt 10!
+
+todos os links são externos e levam a seus sites pessoais ou redes sociais.
+
+
+
+
+
+meowbalt é o mascote do cobalt. ele é um gato muito expressivo que adora
+internet rápida.
+
+todos os incríveis desenhos do meowbalt foram feitos por
+[GlitchyPSI](https://glitchypsi.xyz/). ele é o criador original do personagem.
+
+você não pode usar ou modificar a arte de GlitchyPSI sem sua permissão.
+
+você não pode usar comercialmente ou modificar o meowbalt de nenhuma forma que
+não seja fan art.
+
+
+
+
+
+o servidor de processamento do cobalt é de código aberto e licenciado sobre
+[AGPL-3.0]({docs.apiLicense}).
+
+a página do cobalt é [source first](https://sourcefirst.com/) e licenciado sobre
+[CC-BY-NC-SA 4.0]({docs.webLicense}). decidimos usar essa licença para evitar
+que pessoas ruins lucrem em cima de nosso trabalho e criem clones maliciosos que
+enganem as pessoas e machuque nossa identidade pública.
+
+dependemos de muitas bibliotecas de código aberto, além de criar e distribuir as
+nossas próprias. você pode ver a lista completa de dependências no
+[github]({contacts.github}).
+
diff --git a/web/i18n/pt/about/general.md b/web/i18n/pt/about/general.md
new file mode 100644
index 00000000..194c2162
--- /dev/null
+++ b/web/i18n/pt/about/general.md
@@ -0,0 +1,87 @@
+
+
+
+
+
+o cobalt te ajuda a salvar qualquer coisa dos seus sites favoritos: vídeo,
+áudio, fotos ou gifs. é só colar o link e pronto!
+
+sem anúncios, rastreadores, assinaturas ou outras bobeiras. só um aplicativo da
+web conveniente que funciona em qualquer lugar, sempre que precisar.
+
+
+
+
+
+cobalt was created for public benefit, to protect people from ads and malware
+pushed by its alternatives. we believe that the best software is safe, open, and
+accessible.
+
+it's possible to keep the main instances up thanks to our long-standing
+infrastructure partner, [royalehosting.net]({partners.royalehosting})!
+
+
+
+
+
+all requests to the backend are anonymous and all information about tunnels is
+encrypted. we have a strict zero log policy and don't track *anything* about
+individual people.
+
+when a request needs additional processing, cobalt processes files on-the-fly.
+it's done by tunneling processed parts directly to the client, without ever
+saving anything to disk. for example, this method is used when the source
+service provides video and audio channels as separate files.
+
+additionally, you can [enable forced tunneling](/settings/privacy#tunnel) to
+protect your privacy. when enabled, cobalt will tunnel all downloaded files. no
+one will know where you download something from, even your network provider. all
+they'll see is that you're using a cobalt instance.
+
+
+
+
+
+
+
+newest features, such as [remuxing](/remux), work locally on your device.
+on-device processing is efficient and never sends anything over the internet. it
+perfectly aligns with our future goal of moving as much processing as possible
+to the client.
+
diff --git a/web/i18n/pt/about/privacy.md b/web/i18n/pt/about/privacy.md
new file mode 100644
index 00000000..6ddf12d3
--- /dev/null
+++ b/web/i18n/pt/about/privacy.md
@@ -0,0 +1,96 @@
+
+
+
+
+
+cobalt's privacy policy is simple: we don't collect or store anything about you.
+what you do is solely your business, not ours or anyone else's.
+
+these terms are applicable only when using the official cobalt instance. in
+other cases, you may need to contact the hoster for accurate info.
+
+
+
+
+
+tools that use on-device processing work offline, locally, and never send any
+data anywhere. they are explicitly marked as such whenever applicable.
+
+
+
+
+
+when using saving functionality, in some cases cobalt will encrypt & temporarily
+store information needed for tunneling. it's stored in processing server's RAM
+for 90 seconds and irreversibly purged afterwards. no one has access to it, even
+instance owners, as long as they don't modify the official cobalt image.
+
+processed/tunneled files are never cached anywhere. everything is tunneled live.
+cobalt's saving functionality is essentially a fancy proxy service.
+
+
+
+
+
+temporarily stored tunnel data is encrypted using the AES-256 standard.
+decryption keys are only included in the access link and never
+logged/cached/stored anywhere. only the end user has access to the link &
+encryption keys. keys are generated uniquely for each requested tunnel.
+
+
+{#if env.PLAUSIBLE_ENABLED}
+
+
+
+for sake of privacy, we use [plausible's anonymous traffic
+analytics](https://plausible.io/) to get an approximate number of active cobalt
+users. no identifiable information about you or your requests is ever stored.
+all data is anonymized and aggregated. the plausible instance we use is hosted &
+managed by us.
+
+plausible doesn't use cookies and is fully compliant with GDPR, CCPA, and PECR.
+
+[learn more about plausible's dedication to
+privacy.](https://plausible.io/privacy-focused-web-analytics)
+
+if you wish to opt out of anonymous analytics, you can do it in [privacy
+settings](/settings/privacy#analytics).
+
+{/if}
+
+
+
+
+we use cloudflare services for ddos & bot protection. we also use cloudflare
+pages for deploying & hosting the static web app. all of these are required to
+provide the best experience for everyone. it's the most private & reliable
+provider that we know of.
+
+cloudflare is fully compliant with GDPR and HIPAA.
+
+[learn more about cloudflare's dedication to
+privacy.](https://www.cloudflare.com/trust-hub/privacy-and-data-protection/)
+
diff --git a/web/i18n/pt/about/terms.md b/web/i18n/pt/about/terms.md
new file mode 100644
index 00000000..ccdd46e2
--- /dev/null
+++ b/web/i18n/pt/about/terms.md
@@ -0,0 +1,64 @@
+
+
+
+
+
+these terms are applicable only when using the official cobalt instance. in
+other cases, you may need to contact the hoster for accurate info.
+
+
+
+
+
+saving functionality simplifies downloading content from the internet and takes
+zero liability for what the saved content is used for. processing servers work
+like advanced proxies and don't ever write any content to disk. everything is
+handled in RAM and permanently purged once the tunnel is done. we have no
+downloading logs and can't identify anyone.
+
+[you can read more about how tunnels work in our privacy
+policy.](/about/privacy)
+
+
+
+
+
+you (end user) are responsible for what you do with our tools, how you use and
+distribute resulting content. please be mindful when using content of others and
+always credit original creators. make sure you don't violate any terms or
+licenses.
+
+when used in educational purposes, always cite sources and credit original
+creators.
+
+fair use and credits benefit everyone.
+
+
+
+
+
+we have no way of detecting abusive behavior automatically because cobalt is
+100% anonymous. however, you can report such activities to us and we will do our
+best to comply manually: **safety@imput.net**
+
+**this email is not intended for user support, you will not get a response if
+your concern is not related to abuse.**
+
+if you're experiencing issues, contact us via any preferred method on [the
+support page](/about/community).
+
diff --git a/web/i18n/pt/button.json b/web/i18n/pt/button.json
new file mode 100644
index 00000000..52a3c691
--- /dev/null
+++ b/web/i18n/pt/button.json
@@ -0,0 +1,20 @@
+{
+ "done": "pronto",
+ "download": "baixar",
+ "gotit": "entendi",
+ "cancel": "cancelar",
+ "reset": "reiniciar",
+ "download.audio": "baixar aúdio",
+ "share": "compartilhar",
+ "copy": "copiar",
+ "copy.section": "copiar link da seção",
+ "copied": "copiado",
+ "import": "importar",
+ "continue": "continuar",
+ "star": "estrela",
+ "follow": "seguir",
+ "save": "salvar",
+ "export": "exportar",
+ "yes": "sim",
+ "no": "não"
+}
diff --git a/web/i18n/pt/dialog.json b/web/i18n/pt/dialog.json
new file mode 100644
index 00000000..27d176fc
--- /dev/null
+++ b/web/i18n/pt/dialog.json
@@ -0,0 +1,18 @@
+{
+ "safety.custom_instance.body": "instâncias personalizadas podem potencialmente representar riscos de privacidade e segurança.\n\ninstâncias ruins podem:\n1. redirecionar você para longe do cobalt e tentar enganá-lo.\n2. registrar todas as informações sobre suas solicitações, armazená-las para sempre e usá-las para rastreá-lo.\n3. fornecer arquivos maliciosos (como vírus).\n4. forçá-lo a assistir anúncios ou fazer você pagar pelo download.\n\ndepois desse ponto, não podemos protegê-lo. esteja atento a quais instâncias usar e sempre confie em seu instinto. se algo parecer estranho, volte a esta página, redefina a instância personalizada e nos informe no github.",
+ "reset.title": "apagar todas as configurações?",
+ "reset.body": "você tem certeza que quer apagar todas as configurações? essa ação é imediata e irreversível.",
+ "picker.title": "selecione o que salvar",
+ "picker.description.desktop": "clique em um item para salvar. imagens também podem ser salvas usando o menu do botão direito.",
+ "picker.description.ios": "pressione um item para salvar com o atalho. imagens também podem ser salvas com um toque longo.",
+ "saving.title": "escolha como salvar",
+ "saving.blocked": "cobalt tentou abrir o arquivo em uma nova guia, mas seu navegador bloqueou. você pode permitir pop-ups para evitar que isso aconteça novamente.",
+ "saving.timeout": "cobalt tentou baixar o arquivo automaticamente, mas seu navegador não permitiu. você precisa escolher uma maneira para salvar manualmente.",
+ "safety.title": "notícia importante de segurança",
+ "import.body": "importar arquivos desconhecidos ou corrompidos pode alterar ou quebrar inesperadamente a funcionalidade do cobalt. importe apenas arquivos que você exportou pessoalmente e não modificou. se alguém lhe pediu para importar este arquivo, não continue.\n\nnão somos responsáveis por nenhum dano causado pela importação de arquivos de configuração desconhecidos.",
+ "api.override.title": "substituir instância de processamento",
+ "api.override.body": "{{ value }} é a instância de processamento agora. se você não confia nela, aperte em \"cancelar\".\n\nvocê pode alterar isso depois nas configurações de processamento.",
+ "processing.ongoing": "cobalt está processando mídia nesta guia. se você sair, isso será abortado. tem certeza de que deseja fazer isso?",
+ "processing.title.ongoing": "o processamento será cancelado",
+ "picker.description.phone": "pressione em um item para salvar. imagens também podem ser salvas com um toque longo."
+}
diff --git a/web/i18n/pt/donate.json b/web/i18n/pt/donate.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/donate.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/error.json b/web/i18n/pt/error.json
new file mode 100644
index 00000000..bf550d83
--- /dev/null
+++ b/web/i18n/pt/error.json
@@ -0,0 +1,16 @@
+{
+ "captcha_ongoing": "ainda verificando se você não é um robô. espere o spinner desaparecer e tente novamente.\n\nse demorar muito, por favor nos avise! usamos o turnstile da cloudflare para proteção de bots e às vezes ele bloqueia as pessoas sem motivo.",
+ "api.auth.turnstile.missing": "não foi possível confirmar se você não é um robô porque o servidor não recebeu seu token de acesso humano. tente novamente em alguns segundos ou recarregue a página!",
+ "api.timed_out": "o servidor demorou muito para responder. talvez ele esteja sobrecarregado no momento, tente de novo mais tarde!",
+ "remux.out_of_resources": "cobalt ficou sem recursos e não pode continuar com o processamento no dispositivo. isso está relacionado a limitações no seu navegador. tente atualizar ou reabrir o aplicativo e tente novamente. alguns dispositivos só conseguem processar arquivos pequenos.",
+ "import.no_data": "não tem nada nesse arquivo. tem certeza que este é o certo?",
+ "import.invalid": "seu arquivo não parece ter configurações válidas para ser importado. tem certeza que é esse mesmo?",
+ "import.unknown": "não consegui carregar os dados do arquivo. ele pode estar corrompido ou está num formato inválido. mensagem de erro:\n\n{{ value }}",
+ "remux.corrupted": "não foi possível ler os metadados do arquivo, talvez ele esteja corrompido.",
+ "tunnel.probe": "não consegui ver se você pode baixar esse arquivo. tente novamente em alguns segundos!",
+ "api.auth.jwt.missing": "não foi possível confirmar se você não é um robô porque o servidor de processamento não recebeu o token de acesso humano. tente novamente em alguns segundos ou recarregue a página!",
+ "api.auth.jwt.invalid": "não foi possível confirmar se você não é um robô porque seu token de acesso humano expirou e não foi renovado. tente novamente em alguns segundos ou recarregue a página!",
+ "api.auth.turnstile.invalid": "não foi possível confirmar se você não é um robô porque seu token de acesso humano expirou e não foi renovado. tente novamente em alguns segundos ou recarregue a página!",
+ "api.unreachable": "não consegui conectar ao servidor de processamento. verifique sua conexão a internet e tenta de novo.",
+ "api.rate_exceeded": "você fez muitas requisições. tente novamente em {{ limit }} segundos!"
+}
diff --git a/web/i18n/pt/general.json b/web/i18n/pt/general.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/general.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/notification.json b/web/i18n/pt/notification.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/notification.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/receiver.json b/web/i18n/pt/receiver.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/receiver.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/remux.json b/web/i18n/pt/remux.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/remux.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/save.json b/web/i18n/pt/save.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/save.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/settings.json b/web/i18n/pt/settings.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/settings.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/tabs.json b/web/i18n/pt/tabs.json
new file mode 100644
index 00000000..90d5b1b9
--- /dev/null
+++ b/web/i18n/pt/tabs.json
@@ -0,0 +1,3 @@
+{
+ "save": "salvar"
+}
diff --git a/web/i18n/pt/updates.json b/web/i18n/pt/updates.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/updates.json
@@ -0,0 +1 @@
+{}