~/rafael-okumaagendalivre 03/11

$ git log --graph --decorate

commit 4f2a9c1 (HEAD -> main, origin/freela)

Author: Rafael Okuma <rafael@okuma.dev>

Date:   seg 28 set 2026 09:14 -0300

RafaelOkuma.

feat: dev full-stack freelancer em Curitiba

Faço sistema cobrar direito. Checkout com Pix e cartão, webhook que não duplica pedido, API que aguenta segunda de manhã e o Postgres que ninguém quis abrir.

TypeScript de ponta a ponta · Node · Postgres

b71e2d0│$ git log --merges --author=rafael

Pull requests mergeados

O problema, o que mudou e o trecho do diff que resolveu. O resto está no repositório, quando o cliente deixa mostrar.

merged#214feat/checkout-pix → mainmergeado em ago/2026

loja online de uma torrefação

Checkout com Pix que confirma sozinho

problema
O front perguntava a cada 3 segundos se o Pix tinha caído. Cliente fechava a aba, o pedido ficava “aguardando” para sempre e o dono conferia o extrato na mão.
o que mudou
Webhook assinado do provedor, atualização idempotente do pedido e o e-mail de confirmação numa fila. Agora a aba pode fechar.
typescriptpixwebhookpostgres
+1.204−380
src/pagamentos/webhook-pix.ts
18export async function confirmarPagamento(req: Request) {
− // o front chama isto a cada 3s até dar certo
− const txid = new URL(req.url).searchParams.get("txid")
− if (await consultarPix(txid)) await marcarPago(txid)
19+ const evento = await validarAssinatura(req)
20+ const { count } = await db.pedido.updateMany({
21+ where: { txid: evento.txid, status: "aguardando" },
22+ data: { status: "pago", pagoEm: evento.horario },
23+ })
24+ if (count) await fila.enviar("email-confirmacao", evento.txid)
25 return new Response(null, { status: 200 })
26}
merged#87perf/relatorio-mensal → mainmergeado em mai/2026

sistema interno de uma clínica

Relatório de faturamento de 40 s para 1,2 s

problema
O relatório trazia todas as consultas do ano para o Node e somava num for. Em dezembro dava timeout, e a recepção imprimia o de novembro.
o que mudou
Soma no Postgres com GROUP BY e um índice composto criado com CONCURRENTLY, sem travar a tabela. Apaguei mais código do que escrevi, que é o melhor tipo de PR.
postgresperformancesql
+212−1.870
src/relatorios/faturamento.ts
7export async function faturamento(de: Date, ate: Date) {
− const consultas = await db.consulta.findMany({ where: { data: { gte: de } } })
− const total: Record<string, number> = {}
− for (const c of consultas) total[c.medicoId] = (total[c.medicoId] ?? 0) + c.valor
− return total
8+ return db.$queryRaw`
9+ SELECT medico_id, date_trunc('month', data) AS mes, sum(valor) AS total
10+ FROM consultas
11+ WHERE data >= ${de} AND data < ${ate}
12+ GROUP BY 1, 2`
13}
merged#31fix/cobranca-duplicada → mainmergeado em fev/2026

SaaS de agenda para barbearias

Parar de cobrar duas vezes na renovação

problema
Quando o gateway demorava a responder, o job de renovação tentava de novo e criava uma segunda cobrança. Todo mês alguém pedia estorno, com razão.
o que mudou
Chave de idempotência por assinatura e ciclo, nova tentativa com espera crescente e um teste que simula o timeout. O suporte esqueceu a palavra estorno.
nodepagamentotestes
+96−14
src/jobs/renovar-assinatura.ts
42async function renovar(assinatura: Assinatura, ciclo: string) {
− await gateway.cobrancas.criar({ cliente: assinatura.clienteId, valor })
43+ await comRetentativa(() =>
44+ gateway.cobrancas.criar(
45+ { cliente: assinatura.clienteId, valor },
46+ { chaveIdempotencia: `renovacao-${assinatura.id}-${ciclo}` },
47+ ),
48+ )
49}

e5c3a18│$ cat package.json

Stack, no formato que você já sabe ler

Ferramenta escolhida pelo problema, não pela moda da semana. Isto resolve quase tudo que me pedem.

package.json32 linhas
1{
2 "name": "rafael-okuma",
3 "description": "full-stack freelancer, Curitiba/PR",
4 "main": "typescript",
5 "dependencies": {
6 "typescript": "strict, sempre",
7 "node": "22 LTS",
8 "postgres": "16, com EXPLAIN aberto",
9 "next": "quando tem front",
10 "prisma": "ou SQL na mão, sem drama",
11 "redis": "fila e cache, nessa ordem"
12 },
13 "integracoes": {
14 "pix": "direto no banco ou via PSP",
15 "cartao": "Stripe, Mercado Pago, Pagar.me",
16 "nota-fiscal": "NFS-e e NF-e por API",
17 "webhooks": "assinados e idempotentes"
18 },
19 "devDependencies": {
20 "vitest": "teste onde dói",
21 "docker": "ambiente igual ao seu",
22 "sentry": "o erro chega antes do cliente",
23 "github-actions": "CI em todo PR"
24 },
25 "peerDependencies": {
26 "voce": "um problema concreto"
27 },
28 "scripts": {
29 "deploy": "terça ou quarta, nunca sexta",
30 "suporte": "30 dias depois da entrega, incluso"
31 }
32}

9d04f7b│$ gh issue list --label servico

Issues abertas

O que dá para me contratar para fazer. Escolha uma e comente.

5 abertas4 fechadas
  • Integrar pagamento no sistema que você já tem

    integração de pagamentoapi

    Pix, cartão, boleto e assinatura recorrente. Com webhook, conciliação e a tela de estorno que o financeiro vai pedir na segunda semana.

    #12 aberta · prazo típico: 2 a 4 semanas

    comentar
  • API nova, ou arrumar a que existe

    apinode

    Node e TypeScript, contrato documentado, autenticação e teste em todo fluxo que mexe com dinheiro.

    #11 aberta · prazo típico: 3 semanas em diante

    comentar
  • Banco lento: achar a consulta culpada

    postgresperformance

    EXPLAIN, índice, consulta reescrita. Você recebe o antes e o depois de cada mudança, medido.

    #9 aberta · prazo típico: 1 a 2 semanas

    comentar
  • Manutenção mensal de sistema em produção

    manutenção

    Horas fixas por mês para atualizar dependência, corrigir bug e atender o alerta das 3h.

    #7 aberta · prazo típico: contrato mensal

    comentar
  • Assumir projeto que o dev anterior largou

    manutençãoresgate

    Leio o código, digo com franqueza o que salvar e o que reescrever, e só depois faço o orçamento.

    #4 aberta · prazo típico: diagnóstico em 1 semana

    comentar
4 fechadas como wontfix›
  • App nativo para iOS e Androidwontfix
  • Site institucional em WordPresswontfix
  • Qualquer coisa com blockchainwontfix
  • Landing com animação 3D de 40 MBwontfix

0000000│$ git status # nada commitado ainda

Manda o problema. Respondo no mesmo dia útil.

Conte o que está quebrado ou o que precisa existir, com prazo e orçamento se já tiver. Se não for comigo, indico quem é.

$ git add ./seu-problema

$ git commit -m "Oi, Rafael. Tenho um checkout que "

Escrever para rafael@okuma.dev

Ajuda muito: link do sistema, se já existe código e até quando precisa.

$ git remote -v

$ gh run list --limit 1

agendadisponível a partir de 03/11
DetalhesCommitcommit