BRYAN CASTRO APRESENTA Sete capítulos: quem eu sou, como construo sistemas, como penso segurança, os jogos, as ferramentas, os projetos e o contato.
ROLAR下へ
BRYAN CASTRO 人物
始動
19 ANOS · RIO DE JANEIROComeçou cedo, movido por curiosidade e por fóruns antigos de programação.
SOBRE MIM 自己紹介
弓
QUEM ESCREVE O CÓDIGO.
Desenvolvedor full-stack na Caixa, CEO e desenvolvedor da BFL Studio e, nas horas livres, professor de quem está começando.
Idade
19 anos
Base
Rio de Janeiro
Hoje
Dev full-stack na Caixa
Empresa
BFL Studio · CEO
Ensino
Castro School
SOBRE MIM 自己紹介
弓
QUEM ESCREVE O CÓDIGO.
Desenvolvedor full-stack na Caixa, CEO e desenvolvedor da BFL Studio e, nas horas livres, professor de quem está começando.
Idade
19 anos
Base
Rio de Janeiro
Hoje
Dev full-stack na Caixa
Empresa
BFL Studio · CEO
Ensino
Castro School
FULL-STACK 構築
撃
TODO PROJETO TERMINA EMDEPLOY
Interface, servidor, dados e infraestrutura. O sistema inteiro, do primeiro commit ao servidor no ar.
COMO EU TRABALHO 仕事
RESOLVERPROBLEMADE VERDADE.
Gosto de resolver problema de verdade: interface que respeita o usuário, backend que não cai, e código que o eu do futuro não odeie. Aceitando conversas sobre projetos web, produtos e comunidades dev.
Aprender do zero devia ser menos doloroso. Por isso eu ensino.
0Trilhas na Castro School
0Projetos próprios no ar
0Divisões na BFL Studio
O QUE EU FAÇO 分野4 FRENTES
01網
APLICAÇÕES WEB
Interfaces em React e TypeScript, pensadas primeiro para o celular
APIs em Node.js e Python, com entrada validada
Login com OAuth2 e sessões seguras
Deploy em servidor Linux e na Cloudflare, com HTTPS
Castro School · GamesOff · site da BFL Studio
02学
PRODUTOS DIGITAIS
Trilhas de 7 linguagens, de HTML a Rust, com progresso salvo
Conteúdo didático escrito para quem está começando
Interface, texto e manutenção do produto no ar
Castro School
03繋
INTEGRAÇÕES
Vitrine que reúne promoções de Steam, Epic, GOG e outras lojas
Filtros por loja, moeda e desconto sobre dados externos
APIs REST pequenas, com erro virando resposta clara
GamesOff
04遊
JOGOS E APPS
O Orfanato das Cinzas, jogo narrativo em produção na Godot
Exploração, puzzles e lanterna como mecânicas
Apps web responsivos, do protótipo à primeira versão
VAKAR · Castro School · GamesOff
PROCESSO 工程
DO PROBLEMAÀ EVOLUÇÃO.
Como um projeto sai da ideia e chega ao ar.
01
01
PROBLEMA
Entender quem usa, o que precisa ser resolvido e o que não pode quebrar.
02
PLANEJAMENTO
Escopo curto, prioridades claras e o que fica para a versão seguinte.
03
ARQUITETURA
Interface, regras, dados e infraestrutura definidos antes da primeira tela.
04
CÓDIGO
Componentes pequenos, APIs explícitas e entrada validada nas bordas.
05
TESTES
Fluxos principais testados no navegador, no celular e no desktop.
06
DEPLOY
Prévia protegida antes de publicar, depois HTTPS em produção.
07
EVOLUÇÃO
Medir o que pesa, corrigir e começar de novo pelo problema.
ARQUITETURA 構造
ANATOMIA DE UM SISTEMA.
画CAMADA 1 / 4
FRONTEND
Interfaces e componentes em React e TypeScript, responsivos do celular ao ultrawide. Foco visível, respeito ao movimento reduzido e integração com APIs que continua de pé quando o navegador bloqueia armazenamento.
React
TypeScript
Tailwind
Three.js / R3F
GSAP
Vite
TypeScript · estado que sobrevive a navegador restrito
export function readPref<T>(key: string, fallback: T): T {
try {
const raw = localStorage.getItem(key);
return raw ? (JSON.parse(raw) as T) : fallback;
} catch {
// modo privado ou WebView sem armazenamento: a interface seguereturn fallback;
}
}
核CAMADA 2 / 4
BACKEND
APIs pequenas e explícitas, autenticação OAuth2 com state validado, regras de negócio isoladas e integrações com serviços externos. Só passa o que foi listado; erro vira resposta clara.
Node.js
Python
FastAPI
OAuth2
REST
Cloudflare
Node.js · entrada validada antes da regra de negócio
const ALLOWED = new Set(['page', 'q', 'sort']);
export function parseQuery(url: URL) {
if (url.search.length > 2048) throw new HttpError(414);
const out: Record<string, string> = {};
for (const [k, v] of url.searchParams)
if (ALLOWED.has(k)) out[k] = v.slice(0, 200);
return out; // o resto nem chega ao serviço
}
蔵CAMADA 3 / 4
BANCO DE DADOS
Modelagem antes da tabela: o que precisa persistir, quem lê e quem escreve. MongoDB e PostgreSQL no stack. Chave primária pensada para a consulta mais comum e nenhuma SQL montada com texto do usuário.
MongoDB
PostgreSQL
Modelagem
Consultas parametrizadas
PostgreSQL · modelagem e consulta parametrizada
create table lesson_progress (
user_id uuid not nullreferences users(id),
lesson_id text not null,
done_at timestamptz not null default now(),
primary key (user_id, lesson_id)
);
-- a aplicação nunca concatena texto do usuário na SQLselect lesson_id from lesson_progress where user_id = $1;
基CAMADA 4 / 4
INFRAESTRUTURA
Servidores Linux, containers Docker, HTTPS em todas as rotas e deploy estático na Cloudflare.
Linux
Docker
nginx
Cloudflare
AWS
Git
Docker · imagem enxuta, sem root, com verificação de saúde
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
HEALTHCHECK CMD wget -qO- http://localhost:3000/health || exit 1
CMD ["node", "server.js"]
Ver o sistema pelo outro lado. Com autorização, método e registro.
MÉTODO 手順
SEM ESCOPO, NÃO EXISTE TESTE.
Como eu conduzo uma verificação de segurança, da autorização ao reteste.
01
ESCOPO AUTORIZADO
O que pode ser verificado, por quem e até quando, por escrito. Fora disso, nada é tocado.
02
PREPARAÇÃO
Ambiente de laboratório isolado, ferramentas conferidas e o hash dos arquivos originais guardado antes de tudo.
03
RECONHECIMENTO
Levantar o que o sistema expõe publicamente: cabeçalhos, certificados, rotas e versões.
04
ANÁLISE
Comparar o que foi encontrado com boas práticas e configurações recomendadas.
05
VALIDAÇÃO
Confirmar cada ponto sem causar dano, só no ambiente combinado.
06
DOCUMENTAÇÃO
Cada ponto com evidência, impacto e como reproduzir.
07
CORREÇÃO
Corrigir a causa, não o sintoma, e registrar o que mudou.
08
RETESTE
Repetir a verificação original. Só fecha quando o resultado se mantém.
LABORATÓRIO 実験
A ESTAÇÃO DE TRABALHO.
O ambiente onde eu verifico sistemas: escopo, checklist, scripts e relatórios no mesmo lugar. Abra os arquivos, digite help no terminal ou teste um arquivo seu nas abas Integridade e Metadados. Tudo roda no seu aparelho; nada é enviado.
◆1234bryan@lab: ~/lab
LABORATÓRIO somente leiturasem redeamostras próprias
SHA-256 calculado no seu navegador, como o sha256sum. O arquivo não sai do aparelho.
# nenhum arquivo ainda
Lê EXIF, GPS, XMP, ICC e blocos de texto de uma imagem JPEG, PNG ou WebP, e gera uma cópia sem eles. Tudo no aparelho.
Cabeçalhos de uma resposta HTTP, como saem de curl -sI. As amostras são do servidor de teste do laboratório, antes e depois da correção. Cole outra para comparar.
Escolha uma etapa para ver por que ela existe e rodar o comando dela.
# uma requisição ao servidor de teste do laboratório, fase por fase
scripts/hash_check.sh
#!/usr/bin/env bash# confere se as amostras continuam idênticas ao que foi registradoset -euo pipefail
cd "$(dirname "$0")/../amostras"
if sha256sum --check --quiet SHA256SUMS; then
echo "integridade: OK"
else
echo "integridade: DIVERGENTE" >&2; exit 1
fi
scripts/headers.py
import re, sys
# cabeçalhos que toda resposta do site precisa ter
EXIGIDOS = {
"strict-transport-security": "só HTTPS, mesmo no primeiro acesso",
"content-security-policy": "de onde a página pode carregar scripts",
"x-content-type-options": "o navegador não adivinha o tipo",
"referrer-policy": "links externos não recebem o endereço",
"permissions-policy": "câmera, microfone e localização fechados",
}
def ler(caminho):
linhas = open(caminho, encoding="utf-8").read().splitlines()[1:]
return [(k.strip().lower(), v.strip())
for k, v in (l.split(":", 1) for l in linhas if ":" in l)]
def verificar(caminho) -> int:
cab = ler(caminho)
nomes, csp = {k for k, _ in cab}, dict(cab).get("content-security-policy", "")
faltas = 0
for h, motivo in EXIGIDOS.items():
faltas += h not in nomes
print(("ok " if h in nomes else "FALTA ") + f"{h:27} {motivo}")
if "x-frame-options" not in nomes and "frame-ancestors" not in csp:
faltas += 1
print("FALTA " + f"{'x-frame-options':27} a página pode ser embutida")
for k, v in cab:
if k == "x-powered-by" or (k == "server" and re.search(r"\d", v)):
print("AVISO " + f"{k:27} expõe a tecnologia: {v}")
if k == "set-cookie":
for f in ("secure", "httponly", "samesite"):
if f not in v.lower():
print("AVISO " + f"{'set-cookie':27} cookie sem {f}")
return 1 if faltas else 0
sys.exit(verificar(sys.argv[1]))
ÁREAS 分野
LINUX E LABORATÓRIO
Ambientes isolados para testar, servidor de teste local e o laboratório de metadados.
SEGURANÇA DE APLICAÇÕES
Validação de entrada, cabeçalhos restritivos, segredos fora do código e autenticação comparada em tempo constante.
REDES E PROTOCOLOS
HTTP, TLS, DNS e o caminho de uma requisição até o servidor.
FERRAMENTAS
ExifTool, MAT2, ImageMagick, OpenSSL, dig, ss e sha256sum.
AUTOMAÇÃO COM SCRIPTS
Bash e Python para verificações repetíveis, como as da aba Scripts.
PRÁTICAS AUTORIZADAS
Verificação só em ambiente e arquivos próprios, sempre com escopo escrito.
JOGOS & APPS 遊戯
灰
O ORFANATODAS CINZAS.
THE ASHEN ORPHANAGE
Estúdio
VAKAR · BFL Studio
Gênero
Suspense e terror narrativo
Engine
Godot
Mecânicas
Exploração, puzzles e lanterna
Estado
Em produção · previsão jan. 2027
01
CONCEITO
Premissa, tom e referências.
02
PROTÓTIPO
A versão jogável mais simples da ideia.
03
MECÂNICAS
O que o jogador faz, e por quê.
04
PROGRAMAÇÃO
Cenas, nós e scripts na Godot.
05
ARTE
Ambientação, luz e som.
06
TESTES
Jogar, anotar e ajustar.
07
BUILD
Exportar e testar de novo.
APPS 応用
APPS NO AR.
Dois produtos web que eu criei e mantenho, do código ao servidor.
CASTRO SCHOOL
学
Ensinar programação sem curso enrolado, com exemplos reais e progresso visível.
Trilhas
7 linguagens, de HTML a Rust, ordenadas por dificuldade
Progresso
salvo por trilha, para retomar de onde parou
Interface
pensada primeiro para o celular, no tema escuro
Arquitetura
React · Node.js · conteúdo próprio
Manutenção
No ar desde 2026. Conteúdo, interface e código mantidos por mim.