diff --git a/web/i18n/pt/a11y/dialog.json b/web/i18n/pt/a11y/dialog.json
new file mode 100644
index 000000000..04008f86a
--- /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 000000000..047baab0d
--- /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 000000000..b8398e8bc
--- /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 000000000..2d67b0742
--- /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": "atalho para adicionar a 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": "atalho adicionar aos arquivos"
+}
diff --git a/web/i18n/pt/a11y/tabs.json b/web/i18n/pt/a11y/tabs.json
new file mode 100644
index 000000000..2c96dfa52
--- /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 000000000..0967ef424
--- /dev/null
+++ b/web/i18n/pt/about.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/about/credits.md b/web/i18n/pt/about/credits.md
new file mode 100644
index 000000000..abf30ec8d
--- /dev/null
+++ b/web/i18n/pt/about/credits.md
@@ -0,0 +1,67 @@
+
+
+
+
+
+huge shoutout to our thing breakers for testing updates early and making sure
+they're stable. they also helped us ship cobalt 10!
+- codfish246
+- [damir](https://otomir23.me/)
+- Hunter
+- [hyperdefined](https://hyper.lol/)
+- [KwiatekMiki](https://kwiatekmiki.com/)
+- [Lao](https://lao.ooo/)
+- lostdusty
+- [noblereign](https://fursona.directory/@frost)
+- [Spax](https://spax.zone/)
+- [synzr](https://synzr.space/)
+- [vimae](https://mae.wtf/)
+
+all links are external and lead to their personal websites or social media.
+
+
+
+
+
+meowbalt is cobalt's speedy mascot. he is an extremely expressive cat that loves
+fast internet.
+
+all amazing drawings of meowbalt that you see in cobalt were made by
+[GlitchyPSI](https://glitchypsi.xyz/). he is also the original designer of the
+character.
+
+you cannot use or modify GlitchyPSI's artworks of meowbalt without his explicit
+permission.
+
+you cannot use or modify the meowbalt character design commercially or in any
+form that isn't fan art.
+
+
+
+
+
+cobalt processing server is open source and licensed under
+[AGPL-3.0]({docs.apiLicense}).
+
+cobalt frontend is [source first](https://sourcefirst.com/) and licensed under
+[CC-BY-NC-SA 4.0]({docs.webLicense}). we decided to use this license to stop
+grifters from profiting off our work & from creating malicious clones that
+deceive people and hurt our public identity.
+
+we rely on many open source libraries, create & distribute our own. you can see
+the full list of dependencies on [github]({contacts.github}).
+
diff --git a/web/i18n/pt/about/general.md b/web/i18n/pt/about/general.md
new file mode 100644
index 000000000..4850fa903
--- /dev/null
+++ b/web/i18n/pt/about/general.md
@@ -0,0 +1,87 @@
+
+
+
+
+
+cobalt helps you save anything from your favorite websites: video, audio, photos
+or gifs. just paste the link and you're ready to rock!
+
+no ads, trackers, paywalls, or other nonsense. just a convenient web app that
+works anywhere, whenever you need it.
+
+
+
+
+
+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 000000000..efc58eaa1
--- /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.
+
+{/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 000000000..76517a234
--- /dev/null
+++ b/web/i18n/pt/about/terms.md
@@ -0,0 +1,62 @@
+
+
+
+
+
+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, as cobalt is 100%
+anonymous. however, you can report such activities to us and we will do our best
+to comply manually: [safety@imput.net](mailto:safety@imput.net)
+
+please note that this email is not intended for user support. 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 000000000..52a3c6910
--- /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 000000000..72350db45
--- /dev/null
+++ b/web/i18n/pt/dialog.json
@@ -0,0 +1,17 @@
+{
+ "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"
+}
diff --git a/web/i18n/pt/donate.json b/web/i18n/pt/donate.json
new file mode 100644
index 000000000..0967ef424
--- /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 000000000..bf550d833
--- /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 000000000..0967ef424
--- /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 000000000..0967ef424
--- /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 000000000..0967ef424
--- /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 000000000..0967ef424
--- /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 000000000..0967ef424
--- /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 000000000..0967ef424
--- /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 000000000..90d5b1b95
--- /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 000000000..0967ef424
--- /dev/null
+++ b/web/i18n/pt/updates.json
@@ -0,0 +1 @@
+{}