🐦 Arah

Arah é uma plataforma digital comunitária orientada ao território.
Um espaço onde tecnologia serve à vida local, à convivência e à autonomia das comunidades.

Não é uma rede social genérica.
É uma extensão digital do território vivo.


Vivemos um tempo em que plataformas digitais:

  • capturam atenção,
  • desorganizam comunidades,
  • e desconectam pessoas do lugar onde vivem.

O Arah nasce como um contraponto consciente a esse modelo.

Território como referência.
Comunidade como prioridade.
Tecnologia como ferramenta — não como fim.

A proposta é simples e profunda:
recolocar o território no centro da experiência digital.


O Arah é um aplicativo/plataforma que permite:

  • 📍 Descobrir e reconhecer territórios reais
  • 👥 Organizar comunidades locais
  • 🗞️ Compartilhar informações relevantes ao lugar
  • 🗺️ Visualizar eventos, avisos e iniciativas no mapa
    • Uma entidade do território pode ser um estabelecimento, um órgão do governo, um espaço público ou um espaço natural.
  • 🧑‍🌾 Diferenciar moradores e visitantes com respeito
  • 🤝 Fortalecer redes locais de cuidado, troca e presença
  • 💬 Chat territorial (canais e grupos) com governança (curadoria/moderação) e feature flags por território

Tudo isso sem algoritmos de manipulação,
sem feed global infinito,
sem extração de dados para publicidade.


🧠 Princípios fundamentais

No Arah, territory representa apenas um lugar físico real:

  • nome
  • localização
  • fronteira geográfica

Ele não contém lógica social.

O território existe antes do app
e continua existindo mesmo sem usuários.

Essa decisão arquitetural evita:

  • centralização indevida
  • conflitos de poder
  • confusão entre espaço físico e relações sociais

Relações humanas como:

  • moradores
  • visitantes
  • visibilidade de conteúdo
  • regras de convivência
  • moderação

não pertencem ao território.

Elas pertencem a camadas sociais que referenciam o território.

Isso torna o sistema:

  • mais claro
  • mais justo
  • mais adaptável ao tempo

O Arah não é:

  • um marketplace agressivo
  • uma rede de engajamento infinito
  • um produto de vigilância

Ele é uma infraestrutura digital comunitária, pensada para:

  • autonomia local
  • cuidado coletivo
  • continuidade da vida no território
  • fortalecimento do vínculo entre pessoas e lugar

O backend segue princípios de Clean Architecture, com separação clara de responsabilidades:

backend/ ├── Arah.Api # API HTTP (controllers, endpoints) ├── Arah.Application # Casos de uso / regras de aplicação ├── Arah.Domain # Modelo de domínio (territory, regras centrais) ├── Arah.Infrastructure # Persistência, integrações, adapters ├── Arah.Shared # Tipos e utilitários compartilhados └── Arah.Tests # Testes automatizados

Conceitos centrais do domínio

  • Territory
    Lugar físico real, neutro e persistente.

📚 Documentação

📋 Índice Completo da Documentação - Navegação estruturada de toda a documentação

Documentação técnica das fases de implementação: Instalador, Modularização, BFF e Frontend.

  • Índice de Documentação Técnica ⭐ - Índice completo de todas as fases técnicas
  • Instalador Visual 🛠️ - Sistema de instalação e configuração visual (15 passos, Monolito/Multi-Cluster, módulos, feature flags)
  • Modularização 🧩 - Arquitetura modular e organização por domínios (15 módulos, feature flags, dependências)
  • Backend for Frontend (BFF) 🔌 - Camada de abstração para interfaces (jornadas, contratos, exemplos)
  • Frontend Flutter 📱 - Planejamento completo do app mobile (arquitetura, stack, funcionalidades, UX/UI)

Histórico

  • Changelog

  • Contribuindo

  • Membership
    Relação entre uma pessoa e um território (morador, visitante, etc.).

  • Feed / Map
    Informação contextual, sempre relacionada a um território específico.

    • Integração de dados via GET /api/v1/map/pins (MapEntity + GeoAnchors de posts).

🧩 Feature flags (MVP)

  • GET /api/v1/territories/{territoryId}/features
  • PUT /api/v1/territories/{territoryId}/features (curadoria)
  • GET /api/v1/territories/nearby?lat=-23.37&lng=-45.02&radiusKm=25&limit=20
  • GET /api/v1/map/pins?territoryId={territoryId}
  • GET /api/v1/reports?territoryId={territoryId}&targetType=POST&status=OPEN
  • GET /api/v1/notifications?skip=0&take=50
  • POST /api/v1/notifications/{id}/read
  • GET /api/v1/territories/{territoryId}/chat/channels
  • GET /api/v1/territories/{territoryId}/chat/groups

  • ✅ Backend inicial estruturado
  • ✅ Autenticação social com JWT e gestão básica de usuários
  • ✅ Descoberta e seleção de territórios
  • ✅ Vínculos (morador e visitante) com regras de visibilidade
  • ✅ Feed territorial com criação e moderação de conteúdo
  • ✅ Mapa territorial com entidades e relações
  • ✅ Moderação (reports e bloqueios)
  • ✅ Notificações in-app com outbox e inbox persistido
  • ✅ Feature flags e health check
  • ✅ Testes automatizados
  • ✅ Chat territorial: canais (público/moradores) + grupos com aprovação por curadoria
  • ✅ CI configurado com builds reprodutíveis (packages.lock.json)
  • ✅ App Flutter em uso (versão estável: auth, onboarding, feed, mapa, eventos, perfil, notificações). Ver Release estável e Matriz API/BFF/App.

O projeto está em evolução ativa, com foco em solidez antes de escala.


🛠️ Como rodar localmente

Pré-requisitos

  • .NET SDK 8.x
  • Git
  • Docker (para Postgres via compose)

InMemory (padrão)

git clone https://github.com/sraphaz/Arah.git
cd Arah
dotnet restore
dotnet build
dotnet test
dotnet run --project backend/Arah.Api

Postgres (docker compose)

docker compose up --build

Para rodar localmente com Postgres sem compose, defina:

Persistence__Provider=Postgres
ConnectionStrings__Postgres=Host=localhost;Port=5432;Database=Arah;Username=Arah;Password=Arah

Migrations (Postgres)

Aplicar migrations manualmente (recomendado quando não usar auto-migrate):

dotnet ef database update \
  --project backend/Arah.Infrastructure \
  --startup-project backend/Arah.Api

Auto-migrate (opcional, desligado por padrão): defina Persistence__ApplyMigrations=true.


A autenticação utiliza JWT assinado (HS256). O fluxo principal é:

  1. POST /api/v1/auth/social retorna o token JWT.
  2. Use Authorization: Bearer <token> em endpoints protegidos.

Exemplo rápido:

curl -s -X POST http://localhost:8080/api/v1/auth/social \
  -H "Content-Type: application/json" \
  -d '{
    "provider":"google",
    "externalId":"demo-user",
    "displayName":"Demo",
    "cpf":"123.456.789-00",
    "foreignDocument":null,
    "phoneNumber":"(11) 99999-0000",
    "address":"Rua das Flores, 100",
    "email":"demo@Arah.com"
  }' | jq

Configuração JWT (via appsettings/env):

Jwt__Issuer, Jwt__Audience, Jwt__SigningKey, Jwt__ExpirationMinutes

A chave padrão é apenas para DEV. Troque em produção.


  • Declaração: POST /api/v1/territories/{territoryId}/membership
  • Status atual: GET /api/v1/territories/{territoryId}/membership/me

Regras:

  • Se já existe VISITOR e o usuário pede RESIDENT, o vínculo é atualizado para RESIDENT com status PENDING.
  • Se já é RESIDENT e pede VISITOR, mantém RESIDENT (sem downgrade).
  • Se já é o mesmo papel, a operação é idempotente.

📍 PresencePolicy (geo headers)

Configuração: PresencePolicy:Policy (None | ResidentOnly | VisitorAndResident).

Padrão: ResidentOnly (somente RESIDENT exige geo).

  • VisitorAndResident: visitor também exige X-Geo-Latitude / X-Geo-Longitude.
  • None: nenhum vínculo exige geo.

  • X-Session-Id: identifica a sessão do cliente e permite selecionar o território ativo.
    • Usado para POST /api/v1/territories/selection e como fallback de territoryId em feed/mapa.
    • Também sustenta ações anônimas (ex.: likes com session:{id}).
  • X-Geo-Latitude / X-Geo-Longitude: presença física mínima.
    • Obrigatório conforme PresencePolicy (default: somente para RESIDENT).
    • Não é obrigatório para criar posts (GeoAnchors vêm de mídia quando disponíveis).

A página inicial da API (/) serve um portal estático com explicação do produto, domínios, fluxos e quickstart. Em desenvolvimento, acesse também:

  • /swagger (documentação da API)
  • /health (status simples)

Quando a API está rodando localmente em ambiente de desenvolvimento, o portal exibe um preview do Swagger para navegação e testes rápidos.

Para publicação como site estático, o portal também está disponível em docs/ e pode ser hospedado via GitHub Pages (basta apontar a origem para a pasta docs). A versão do GitHub Pages inclui links diretos para documentação, user stories e changelog.

Consulte o guia em CONTRIBUTING.md.

O Arah é aberto à colaboração, especialmente de pessoas interessadas em:

tecnologia com impacto social

comunidades locais

território, cultura e soberania

arquitetura de software consciente

regeneração e autonomia

Formas de contribuir:

código

testes

documentação

ideias

feedback conceitual

Antes de abrir PRs grandes, abra uma issue para alinharmos a direção.

Algumas direções possíveis (não promessas fechadas):

economias e moedas locais

trocas de serviços comunitários

governança distribuída

integração com iniciativas regenerativas

tecnologia como guardiã do território, não como exploradora

O Arah não quer crescer rápido. Quer criar raízes profundas.

✨ Uma nota pessoal

Este projeto nasce de uma escuta atenta:

da vida

do território

das comunidades

e dos limites do modelo digital atual

Se você chegou até aqui e sentiu que isso faz sentido, você já faz parte da conversa.

📜 Licença

Este projeto é distribuído sob uma licença aberta orientada à comunidade e ao território.

  • Versão oficial (EN): LICENSE
  • Versão em português (PT-BR): LICENSE.pt-BR

🐦 Arah canta para avisar, proteger e comunicar. Que esta plataforma faça o mesmo.