flowchart LR
C["🎛️ ~/Dropbox/Portfolio/<br><b>PAINEL DE CONTROLE</b><br>cwd do VS Code<br>memórias compartilhadas"]
P["📁 projeto/portfolio/<br><b>FONTE DE VERDADE</b>"]
R[("🔒 GitHub<br>repo privado")]
S(("🌐 vitorwilher.github.io<br>público"))
C -->|frases-gatilho| P
P -->|README.md + código| R
P -->|.qmd + imagens| S
P -->|PDF público + página HTML<br><i>opcional, se virar paper</i>| S
style C fill:#e1f0ff,stroke:#1f6feb,stroke-width:2px
style P fill:#fff4d6,stroke:#d4a017,stroke-width:2px
style R fill:#fde2e2,stroke:#c0392b
style S fill:#d4edda,stroke:#27ae60
Workflow de Portfólio Pessoal — Guia Operacional
Como organizar projetos e papers entre repos privados e o site público com fricção mínima
Por que este guia existe
Quem trabalha em vários projetos paralelos — alguns que viram papers acadêmicos, outros que viram cursos, outros que ficam apenas no portfólio — enfrenta um problema clássico de fricção operacional: cada projeto tem seu próprio repositório, seu próprio README, e ainda precisa virar uma página no site pessoal e, eventualmente, um working paper público. Mantida à mão, essa cadeia se desincroniza rapidamente: o README diverge da documentação do site, o PDF público fica defasado em relação à versão técnica, e cada novo projeto reinventa a roda.
Este guia documenta o fluxo unificado que adoto desde o projeto Sentimento COPOM (abril/2026), construído ao redor de três decisões fundamentais:
- Uma pasta
portfolio/por projeto funciona como fonte de verdade para tudo o que vai público (site, README do repo, PDF do working paper). - Metodologia CRISP-DM estrutura cada
.qmdde divulgação em seis fases padronizadas — torna a curva de aprendizado próxima de zero quando um novo projeto é iniciado. - Código privado, conhecimento público — repositórios dos projetos seguem privados; o site oferece prosa, metodologia, PDF de working paper e CHANGELOG, mas nunca o código-fonte executável.
O resultado é um conjunto curto de frases-gatilho que disparam workflows completos sem precisar lembrar de comandos, caminhos ou ordem de operações.
Filosofia em três princípios
1. Fonte de verdade única
Toda documentação pública de um projeto vive em um único arquivo .qmd dentro de <projeto>/portfolio/. Esse arquivo é editado, e suas cópias para o site e para o README do repositório são geradas a partir dele. Editar a cópia diretamente é proibido — só editar a fonte e re-sincronizar.
2. Privacidade granular
Nem tudo do projeto vai público. A regra é simples:
| Artefato | Vai para o site? | Vai para o repo público? |
|---|---|---|
Código (.py, .qmd com chunks) |
❌ Nunca | ❌ Repo é privado |
.qmd técnico do paper (com echo: true) |
❌ Nunca | ❌ Repo é privado |
| Prosa CRISP-DM do projeto | ✅ Sim | ✅ Como README |
PDF público do paper (com echo: false) |
✅ Sim | — |
| CHANGELOG | ✅ Sim (em prosa) | ✅ Sim (técnico) |
| Imagens e diagramas | ✅ Sim | ✅ Sim |
3. Um conjunto curto de frases-gatilho
Em vez de memorizar comandos git, caminhos de pasta e ordem de operações, basta dizer uma frase e o agente executa o workflow completo. As frases ficam em memória persistente do agente, no nível pai ~/Dropbox/Portfolio/ (ver seção Painel de controle único abaixo).
Painel de controle único
~/Dropbox/Portfolio/
Todo o workflow de portfólio é operado a partir do diretório pai que contém todos os subprojetos:
~/Dropbox/Portfolio/ ← abrir o VS Code AQUI
├── Sentimento_COPOM/
├── ROI_Diagnostico/
├── Github_Portfolio/
├── <futuros projetos>/
└── ...
A escolha é deliberada: se eu abro o VS Code dentro de um subprojeto (ex: Sentimento_COPOM/), o agente só enxerga as memórias específicas daquele projeto. Como as frases-gatilho são genéricas e atravessam projetos, elas vivem em uma camada acima — a memória do diretório pai ~/Dropbox/Portfolio/.
Concretamente, o agente carrega quatro memórias compartilhadas a partir desse cwd:
| Memória | Conteúdo |
|---|---|
user_profile.md |
Quem é o autor, área de atuação, idioma de trabalho |
portfolio_workflow.md |
Convenção da pasta portfolio/ e da subpasta research/ |
github_portfolio_repos.md |
Caminhos locais, URLs dos remotos, branch defaults |
portfolio_frases_gatilho.md |
Lista completa das frases e o que cada uma executa |
A partir desse painel, o agente:
- Cria pastas de subprojetos novos via path absoluto (
~/Dropbox/Portfolio/<NomeNovo>/). - Sincroniza qualquer subprojeto existente com o site público em
Github_Portfolio/. - Mantém memórias específicas de subprojeto (como o sistema de releases do Sentimento COPOM) dentro das pastas individuais — só as memórias de workflow geral sobem para o nível pai.
Memórias globais (~/.claude/CLAUDE.md) seriam carregadas em todas as sessões, incluindo trabalhos completamente fora do portfólio. A camada ~/Dropbox/Portfolio/ é o escopo correto: acima dos subprojetos, abaixo do usuário-todo.
A estrutura padrão
Todo projeto adota a mesma estrutura:
<projeto>/
├── <código do projeto> ← parte privada
├── <paper técnico>.qmd ← com chunks, privado
│
├── portfolio/ ← fonte de verdade do material público
│ ├── <slug>.qmd ← documentação CRISP-DM (vai para projetos/)
│ ├── README.md ← versão enxuta (vai para README do repo)
│ ├── _TEMPLATE.md ← documenta a convenção
│ ├── *.png ← imagens de capa
│ └── research/ ← OPCIONAL, quando vira paper
│ ├── <slug>.qmd ← página HTML (vai para research/)
│ ├── <slug>_publico.pdf ← PDF da edição do leitor
│ └── <slug>_indice.png
│
├── CHANGELOG.md ← histórico técnico
├── versions/vX.Y_AAAA-MM-DD/ ← snapshots por release
└── _rollback/ ← checkpoints ad-hoc (não vai pro repo)
E o destino no Github_Portfolio:
Github_Portfolio/
├── projetos/
│ ├── <slug>.qmd ← cópia de portfolio/<slug>.qmd
│ ├── <slug>_*.png ← cópias das imagens
│ └── ...
└── research/ ← criada quando o projeto vira paper
├── <slug>.qmd ← cópia de portfolio/research/<slug>.qmd
├── <slug>_publico.pdf ← cópia do PDF público
└── ...
Fluxo de informação: painel, fonte de verdade, duas pontas
O painel de controle é onde você opera (cwd ~/Dropbox/Portfolio/). A pasta portfolio/ de cada subprojeto é a única fonte que se edita. O agente sincroniza para as duas pontas (repo privado e site público) sob demanda.
Cenário 1 — Abrir projeto novo
Frase-gatilho: “vamos abrir o projeto <nome>” (ou “abrir projeto <slug>”)
Onde você está quando diz isso: com o VS Code aberto em ~/Dropbox/Portfolio/ (o painel de controle). O agente já tem todas as memórias do workflow carregadas — não precisa replicar nada para a pasta nova.
flowchart TB
A([💬 'vamos abrir o projeto X']) --> B[Cria pasta<br>~/Dropbox/Portfolio/X/]
B --> C[Cria X/portfolio/ com<br>slug.qmd, README.md,<br>_TEMPLATE.md]
C --> D[Cria .gitignore<br>blindado]
D --> E[git init -b main<br>+ primeiro commit]
E --> F{Criar repo<br>privado<br>agora?}
F -->|sim| G[gh repo create<br>privado + push]
F -->|depois| H[Pronto]
G --> H
O que o agente faz automaticamente:
- Cria pasta
~/Dropbox/Portfolio/<nome>/(continuando no cwd do painel) - Cria
<nome>/portfolio/com<slug>.qmdno template CRISP-DM (6 fases já estruturadas),README.mdenxuto,_TEMPLATE.md(referência) - Cria
.gitignoreblindado:.env,.quarto/,_freeze/,__pycache__/,_rollback/,archive/,.venv/,.DS_Store git init -b main+ primeiro commit- Pergunta se cria repo privado já agora (criar repo é ação visível, requer confirmação)
Sua responsabilidade: desenvolver o projeto. Edita o .qmd do portfolio/ à medida que as fases CRISP-DM amadurecem. Tudo continua a partir do mesmo cwd ~/Dropbox/Portfolio/ — o agente alcança qualquer subprojeto via path absoluto.
Cenário 2 — Publicar/atualizar projeto no site (sem paper)
Frase-gatilho: “publica <slug> no portfólio” ou “atualiza <slug> no site”
flowchart LR A([💬 'publica X<br>no portfólio']) --> B[cp portfolio/.qmd<br>+ imagens →<br>Github_Portfolio/projetos/] B --> C[git stash<br>cv, blog, etc.] C --> D[git add slug<br>+ commit] D --> E[git pull --rebase<br>+ git push] E --> F[git stash pop] F --> G([✅ Site atualiza<br>via CI ~2min])
O que o agente faz automaticamente:
- Copia
<projeto>/portfolio/<slug>.qmd+ imagens →Github_Portfolio/projetos/<slug>.qmd - Stash de mudanças não-relacionadas em
Github_Portfolio(cv.qmd,blog/,cv.pdfsão típicos) git addapenas dos arquivos do<slug>, commit no estilo “Projetos: …”git pull --rebase origin master+git push origin master- Restaura stash com
git stash pop - Confirma resultado do CI e dá URL final
Cenário 3 — Projeto virou paper (primeira release pública)
Frase-gatilho: “<slug> vai virar paper” ou “abrir paper de <slug>”
flowchart TB A([💬 'X vai virar paper']) --> B[Cria portfolio/research/<br>com slug.qmd<br>baseado no template] B --> C[Copia PDF público<br>+ imagem de capa] C --> D[Replica em<br>Github_Portfolio/research/] D --> E[Adiciona callout cruzado<br>em projetos/slug.qmd] E --> F[Commit + push<br>nos dois repos] F --> G([✅ Paper vivo<br>publicado])
O que o agente faz automaticamente:
- Cria
<projeto>/portfolio/research/<slug>.qmdbaseado no template do Sentimento COPOM:- Callout “working paper · em desenvolvimento contínuo”
- Botão 📄 Baixar PDF
- Abstract bilíngue PT/EN
- Histórico de versões em prosa
- Como citar (BibTeX)
- Contato para diálogo acadêmico
- Cross-link para
projetos/<slug>.html - Nota explícita: “O código-fonte é mantido privado”
- Copia
<paper>_publico.pdf(edição do leitor, comecho: false) + imagem de capa - Replica em
Github_Portfolio/research/ - Adiciona callout cruzado em
projetos/<slug>.qmdapontando para a pesquisa - Commit + push em ambos os repos
Pré-requisito: o _publico.pdf precisa existir. Você renderiza — auto mode não autoriza render.
Cenário 4 — Nova versão do paper
Frase-gatilho: “fechar vX.Y do <slug>”
flowchart TB A([💬 'fechar v1.1<br>de X']) --> B[Atualiza titlepage<br>remove 'em desenvolvimento'] B --> C[Finaliza CHANGELOG<br>técnico no projeto] C --> D[Cria snapshot<br>versions/v1.1_DATA/] D --> E[Sugere render<br>do PDF público] E --> F[Copia PDF público<br>atualizado para research/] F --> G[Atualiza histórico<br>de versões em prosa<br>no research/.qmd] G --> H[Atualiza BibTeX<br>versão e mês/ano] H --> I[Commit + push<br>nos dois repos] I --> J([✅ v1.1 fechada<br>e pública])
O que o agente faz automaticamente:
- Atualiza titlepage do
.qmdtécnico (remove sufixo “em desenvolvimento”) - Finaliza entrada da
vX.YnoCHANGELOG.mdtécnico - Cria snapshot em
versions/vX.Y_AAAA-MM-DD/ - Sugere que você renderize os PDFs
- (Novo) Copia PDF público atualizado para
portfolio/research/eGithub_Portfolio/research/ - (Novo) Atualiza “Histórico de versões” do
<slug>.qmdemresearch/com a entrada da nova versão (em prosa, mais legível que o CHANGELOG técnico) - (Novo) Atualiza o BibTeX (campo
note = {Working paper, versão X.Y}e mês/ano) - Commit + push em ambos os repos
Cenário 5 — Edição pequena no site
Frase-gatilho: “corrige <descrição> no site” ou “sincroniza <slug>”
flowchart LR A([💬 'corrige typo<br>em X']) --> B[Edita<br>portfolio/slug.qmd] B --> C[Sincroniza<br>para Github_Portfolio] C --> D[Commit + push] D --> E([✅ Site atualiza])
Para mudanças pontuais (typo, ajuste de prosa) — eu sincronizo portfolio/<slug>.qmd (e/ou portfolio/research/<slug>.qmd) para Github_Portfolio/, commit + push.
Cheat sheet — onde edito o quê
| Quero editar… | Edito em… |
|---|---|
| Código do pipeline / paper técnico (com chunks) | <projeto>/<paper>_base.qmd |
| Prosa do projeto para o portfólio (CRISP-DM) | <projeto>/portfolio/<slug>.qmd |
| README do repo GitHub do projeto | <projeto>/portfolio/README.md |
| Working paper público (abstract, changelog, contato) | <projeto>/portfolio/research/<slug>.qmd |
Nunca edito direto: Github_Portfolio/... (o agente sincroniza) |
— |
Tabela completa de frases-gatilho
| Você diz | Eu faço |
|---|---|
| “vamos abrir o projeto X” | Cria estrutura padrão (pasta + portfolio/ + git + opção de repo privado) |
| “publica X no portfólio” | Sincroniza prosa do projeto → Github_Portfolio/projetos/ + push |
| “X vai virar paper” | Cria portfolio/research/ com PDF público + página HTML + cross-links |
“fechar vX.Y de Y” |
Versão fechada + snapshot + sincroniza paper público no site |
| “sincroniza X” | Edição pontual: copia + commit + push |
| “diff vX.Y” | Compara estado atual com snapshot da versão X.Y |
| “rollback para vX.Y” | Volta o paper para a versão anterior (com confirmação prévia) |
Princípios fixos do workflow
- Fonte de verdade é sempre
<projeto>/portfolio/—Github_Portfolio/é alvo de cópia, nunca editar direto lá. - Código-fonte do paper (
.qmdbase) nunca vai para o site — só o PDF da edição do leitor. - Repos de projeto continuam privados — público é só o site (
vitorwilher.github.io). - Cross-links bidirecionais — projeto e pesquisa do mesmo
<slug>se referenciam mutuamente via callout. - Stash + rebase + pop é o padrão de push em
Github_Portfolio(sempre temcv.qmd/blog/modificados localmente). - Render é responsabilidade do autor — agente nunca renderiza PDFs em auto mode.
Ciclo de vida típico de um projeto
flowchart TB
A([Ideia]) -->|"💬 'abrir projeto X'"| B[Projeto criado<br>estrutura padrão]
B --> C[Desenvolvimento<br>local]
C -->|"💬 'publica X<br>no portfólio'"| D[Card no site<br>vitorwilher.github.io/projetos/]
D --> E{Vira paper?}
E -->|não| F([Projeto<br>publicado])
E -->|sim| G["💬 'X vai virar paper'"]
G --> H[Working paper v1.0<br>vitorwilher.github.io/research/]
H --> I[Crítica acadêmica<br>via e-mail]
I --> J[Próximos Passos]
J -->|"💬 'fechar v1.1 de X'"| K[Nova versão<br>histórico atualizado]
K --> I
style A fill:#e3f2fd
style F fill:#d4edda
style H fill:#d4edda
style K fill:#d4edda
O ciclo de paper é deliberadamente cíclico: cada versão fechada gera nova janela para crítica e nova rodada de melhorias.
Notas finais
Este workflow foi inaugurado com o projeto Sentimento COPOM em 26 de abril de 2026 e será replicado em todos os projetos novos a partir desta data. Se você é meu aluno ou colaborador e quer adaptar a estrutura ao seu próprio portfólio, sinta-se à vontade — todo o sistema é replicável e usa apenas Quarto, Git e GitHub Actions.
Este guia também serve como material de aula para os meus cursos de Engenharia de Dados aplicada à Economia e Pesquisa Reproduzível com Quarto. Uso-o para mostrar como sustentar uma agenda de pesquisa pública e replicável sem expor código proprietário.