Packages
O kernel do ecossistema Taina: o schema e o nucleo puro compartilhados pelos produtos.
Current section
Files
Jump to
Current section
Files
README.md
# Ypy
O kernel do ecossistema Taina. Uma biblioteca, nao uma aplicacao.
Ypy (Tupi: origem) e a base compartilhada sobre a qual os produtos sao
construidos: o box do Taina (a nuvem privada da comunidade), a plataforma
hospedada e os produtos futuros. Ela carrega duas coisas, e so duas:
1. **O schema.** As formas de record e o contrato de fio. E o artefato que os
clientes (Swift, Kotlin) espelham e que os produtos compartilham, para que
um produto novo fale o mesmo vocabulario sem redecidir.
2. **O nucleo puro.** Identidade (Maraca), records assinados e endereçados por
conteudo (Ybira), o modelo social (zonas, papeis, a regra de leitura), o
mural e a assembleia. Funcoes puras: sem processo, sem banco, sem relogio
alem do que e passado como argumento.
Tudo que toca o mundo vive em adapters escolhidos pelo produto: persistencia
(SQLite no box da comunidade), transporte e autenticacao, a superficie HTTP, a
federacao. O kernel nunca depende de um produto; um produto depende do kernel.
## Status
As primitivas puras de protocolo ja estao em `lib/`: DAG-CBOR, CID, varint,
base32, base58, secp256k1 e TID. O nucleo de identidade e protocolo esta
entrando conforme o RFC 006; o resto segue a sequencia de build.
## Como consumir
Para o mantenedor de um produto (o box do Taina, a plataforma hospedada),
quatro passos, na ordem (RFC_006 secoes 6, 7 e 10):
1. **A dependencia.** No `mix.exs` do produto: `{:ypy, "~> 0.1"}`. O Ypy nao
importa nada de produto, nao le config de produto e nao nomeia modulo de
produto.
2. **As migracoes.** `mix ypy.install` copia as migracoes do kernel para
`priv/repo/migrations` do produto, com a versao preservada
(`--migrations-path` troca o caminho). Rodar de novo substitui a versao,
nunca duplica. Quem roda as migracoes e o `mix ecto.migrate` do produto.
3. **Os lexicons no boot.** O produto carrega o indice uma vez, com o
diretorio do kernel primeiro e o dele depois (um lexicon do produto
sobrescreve um do kernel de mesmo id):
```elixir
{entries, problems} =
Ypy.Lexicon.Registry.load([
Application.app_dir(:ypy, "priv/lexicons"),
"priv/lexicons"
])
```
4. **O Repo e do produto.** O kernel nao define `Ypy.Repo` nem le config
global: toda funcao de contexto recebe o repo como primeiro argumento. Os
adapters de blob e de chave o produto escolhe (`Ypy.BlobStore.Disk` e
`Ypy.KeyStore.Files` sao os do kernel):
```elixir
Ypy.Ybira.upload(Taina.Repo, keys, blobs, scope, tmp_path, mime: mime)
```
## Relacao com o Pesque
`zeetech/pesque` e um Personal Data Server para ATProto, tambem em Elixir. O
Ypy reusa as **primitivas puras de protocolo** dele (DAG-CBOR, CID, a Merkle
Search Tree, TID, CAR, varint, base32, base58, secp256k1, as formas de record e
commit) sob a licenca WTFPL do Pesque. O Ypy NAO adota a semantica global-ATProto
do Pesque (o diretorio PLC, o servidor OAuth, o crawl de relay, o firehose, o
entryway): o kernel do Taina e community-first, `did:web`-first e praca-only, e
a federacao entre Tekoas e um assunto posterior.
## Licenca
MPL-2.0 (Mozilla Public License 2.0). Copyleft por arquivo: mudancas nos
arquivos do proprio Ypy ficam abertas, e um produto, inclusive proprietario
como a plataforma hospedada, pode depender do Ypy e manter os proprios arquivos
fechados. E por isso MPL e nao AGPL: o kernel e dependencia de codigo dos
produtos, e um deles pode ser proprietario.
Arquivos derivados do Pesque carregam a proveniencia WTFPL dele e sao
relicenciados aqui sob MPL-2.0, o que o WTFPL permite. Ver "Relacao com o
Pesque".