English · Português
Obrigado pelo interesse. O quark é open source sob a GNU AGPLv3 (veja
LICENSE). Contribuições de código, documentação, testes e relatos
de bug são bem-vindas.
Ao participar você concorda com o Código de Conduta.
Antes do seu pull request ser mergeado, você precisa aceitar o Contributor License Agreement. É uma concessão de licença, não uma transferência de copyright: você continua dono das suas contribuições. Você concede ao mantenedor uma licença ampla (incluindo o direito de relicenciar) para que o quark possa ser oferecido sob a AGPL e, separadamente, sob licença comercial e numa edição hospedada. É o mesmo modelo de Dub, n8n e Grafana.
Assinar é um clique, uma vez só: no seu primeiro PR um bot posta o link; aceite uma vez e vale para todos os PRs seguintes.
- Dúvidas e ajuda para subir o projeto vão para Discussions, Q&A, não para o issue tracker.
- Bugs vão no formulário de bug, com reprodução contra uma instância limpa.
- Problemas de segurança nunca em público. Veja SECURITY.PT_BR.md.
- Pegar uma tarefa: issues com label
good first issueehelp wantedestão livres. Comente na issue antes, para duas pessoas não escreverem o mesmo patch.
Pré-requisitos: toolchain estável do Rust (via rustup) e Node 22+ para o painel. O detalhe está em docs/DEVELOPMENT.PT_BR.md; aqui fica só o mínimo para o primeiro PR.
Backend:
cargo build
cargo test # testes de lib + API, sem serviços externos
cargo fmt --all
cargo clippy --all-targets -- -D warningsPainel admin (web/, React + TypeScript + Vite):
cd web
npm ci
npm run dev
npm run lint # oxlint, --max-warnings 0
npm run typecheck # tsc -b, esse aqui já quebrou deploy
npm run test # Vitest
npm run buildO quark é open core: tudo é AGPL-3.0-only, menos src/ee/ e web/src/ee/,
que estão sob a quark Enterprise Edition License. Pull request que toca esses
dois diretórios é bem-vindo e entra sob aquela licença, e não sob a AGPL; o
resto é AGPL como sempre. Nos dois casos você continua dono da sua contribuição.
Ver docs/LICENSING.PT_BR.md.
O código Enterprise fica atrás de uma flag de build não-default, então rode
cargo clippy --all-targets --features ee -- -D warnings,
cargo test --features ee e npm run test:ee quando mexer nele.
Os testes de integração de Postgres, Valkey e ClickHouse dependem de
QUARK_TEST_DATABASE_URL, QUARK_TEST_VALKEY_URL e
QUARK_TEST_CLICKHOUSE_URL, e são pulados quando as variáveis não estão
definidas. A maioria das mudanças não precisa deles.
- Superfície de API: testes de integração em
tests/*_it.rs. Monte oAppStatepelo builderTestStateemtests/common/mod.rs, não com struct literal na mão. - Unidade: módulos
#[cfg(test)]inline, ao lado do código. - Painel:
web/src/**/*.test.tsxcom Vitest. - Mantenha o caminho quente de redirect com poucas alocações. É o caminho
crítico de performance, veja
benches/redirect_bench.rs.
Duas regras fáceis de esquecer e que serão pedidas no review:
- Toda doc voltada ao usuário tem um gêmeo
.PT_BR.md.docs/WEBHOOKS.mdedocs/WEBHOOKS.PT_BR.md. Os dois começam com o header de troca de idioma:**English** · [Português](X.PT_BR.md)e o espelho no gêmeo. Um PR de doc em um idioma só está incompleto. - Toda string nova do painel entra em
web/src/i18n/en.tse emweb/src/i18n/pt-BR.ts. Nada de string fixa no componente.
Estilo do texto: inglês técnico direto, sem travessão, e pt-BR natural no gêmeo. Não traduza ao pé da letra, escreva como se escreve no idioma.
"Zero dependências em runtime" e "binário de ~1 MB" são o argumento do projeto.
Uma crate nova precisa de justificativa na descrição do PR: o que ela faz, por
que a std ou uma dependência existente não resolve, e quanto custa em tamanho de
binário. Em web/ a régua é ainda mais alta, porque o bundle vai para todo
usuário do painel.
- Branches:
feat/slug-curto,fix/slug-curto,chore/slug-curto. - Commits: Conventional Commits com
escopo,
feat(web):,fix(api):,docs:,chore:. Escreva as mensagens de commit em inglês. O histórico antigo está em português e fica como está. - Atualize o
CHANGELOG.mde oCHANGELOG.PT_BR.mdem## [Unreleased]no mesmo PR, não depois. É a mesma regra do gêmeo bilíngue que vale para qualquer outro doc voltado ao usuário. O que você escrever ali é o que vai sair nas notas da release, então escreva pensando em quem não acompanhou o pull request. - Faça fork e abra o PR contra a
main.
Mergear não lança nada. Só uma tag do git publica imagem e faz deploy, então sua
mudança fica na main até a próxima versão ser cortada. É por isso que a entrada
em ## [Unreleased] importa: é dela que a release é montada.
Como funciona o gate de merge, para nada te pegar de surpresa:
- O CI precisa passar:
cargo fmt --check,cargo clippy -D warnings,cargo test, cargo-deny, dependency review, e o job web delint/typecheck/test/build. - É obrigatório 1 review aprovando, e todo thread de review precisa ser resolvido.
- Qualquer push depois de uma aprovação descarta aquela aprovação. A regra do branch é "require last push approval", então corrigir um typo de última hora significa pedir review de novo. Agrupe suas mudanças.
- Espere a primeira resposta em até uma semana. Silêncio quer dizer "ainda não olhei", não "recusado".
Para você não perder tempo:
- mudanças no caminho quente de redirect que trocam latência por conveniência
- um backend de store novo sem alguém comprometido em mantê-lo
- dependência de serviço externo no caminho padrão
- reescrita de estilo em massa, reformatação ou renomeação sem relação com uma correção
- mudança no esquema de código curto. É o núcleo do projeto e precisa de um
spec em
docs/specs/acordado antes de qualquer código.
O quark tem um mantenedor só, @lucasolopes, que dá a palavra final sobre escopo,
design e o que entra. A direção é pública em
docs/ROADMAP.PT_BR.md, e os specs de design entram em
docs/specs/ antes do código, então dá para discordar de uma decisão enquanto
mudá-la ainda é barato.
O CLA permite que o projeto seja oferecido sob a AGPL e, separadamente, sob licença comercial. É uma escolha deliberada, não um passo para fechar o código: a edição AGPL é o projeto, não uma amostra. Se algum dia fizer sentido um modelo de governança com mais de um mantenedor, ele será escrito aqui primeiro.
docs/ARCHITECTURE.PT_BR.md: como as peças se encaixam.docs/DEVELOPMENT.PT_BR.md: o guia completo de desenvolvimento.docs/ROADMAP.PT_BR.md: direção e próximos passos.docs/SCALING.PT_BR.md: formatos de deploy e seus limites.