f# Kairós
Sistema Operacional para a Sociedade
Plataforma genérica que transforma qualquer problema de oferta e demanda em um mercado através de configuração JSON, não código.
Challenge FIAP 2026 - PRIME Society
A infraestrutura universal para mercados de oferta e demanda.
O core é genérico. O comportamento de cada mercado é definido por JSON Schema:
┌─────────────────────────────────────────────────────────────┐
│ KAIRÓS CORE │
│ │
│ apps + offers + demands + matches + contracts + reviews │
│ (genérico, configurado por JSON Schema) │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Gigs │ │ Doações │ │ Ecom │
│ (JSON) │ │ (JSON) │ │ (JSON) │
└─────────┘ └─────────┘ └─────────┘
Mesmo código, diferentes schemasnpm install
npm run dev- App: http://localhost:3000
- API: http://localhost:3000/api/v1
- Emails: http://localhost:1080
| Camada | Tech |
|---|---|
| Frontend | Next.js 16, React 19 |
| Backend | Next.js API Routes |
| Banco | PostgreSQL 16 (JSONB) |
| Auth | Sessions + bcrypt |
| Infra | Docker Compose |
Um App é a definição de um mercado. Ele armazena os JSON Schemas que validam ofertas e demandas, além das regras de matching.
| Método | Endpoint | Descrição | Permissão |
|---|---|---|---|
| GET | /api/v1/apps |
Lista todos os apps ativos | Público |
| GET | /api/v1/apps/[slug] |
Busca app pelo slug | Público |
| POST | /api/v1/apps |
Cria novo app | create:app |
| PATCH | /api/v1/apps/[slug] |
Atualiza app | update:app |
POST /api/v1/apps
{
"slug": "gigs",
"name": "Freelancer Marketplace",
"description": "Conecta freelancers com clientes",
"offer_schema": {
"type": "object",
"properties": {
"title": { "type": "string" },
"skills": { "type": "array", "items": { "type": "string" } },
"hourly_rate": { "type": "number" }
},
"required": ["title", "skills"]
},
"demand_schema": {
"type": "object",
"properties": {
"title": { "type": "string" },
"required_skills": { "type": "array", "items": { "type": "string" } },
"budget_max": { "type": "number" }
},
"required": ["title", "required_skills"]
},
"matching_rules": [
{ "offer_field": "skills", "demand_field": "required_skills", "operation": "array_intersects", "weight": 10 },
{ "offer_field": "hourly_rate", "demand_field": "budget_max", "operation": "less_than_or_equal", "weight": 5 }
],
"config": {
"require_escrow": true
}
}Uma Offer é uma oferta criada por um usuário dentro de um app.
| Método | Endpoint | Descrição | Permissão |
|---|---|---|---|
| GET | /api/v1/offers |
Lista ofertas | Público |
| GET | /api/v1/offers/[id] |
Busca oferta por id | Público |
| POST | /api/v1/offers |
Cria oferta | create:offer |
| PATCH | /api/v1/offers/[id] |
Atualiza oferta | update:offer |
| DELETE | /api/v1/offers/[id] |
Remove oferta | delete:offer |
Filtros disponíveis: ?app_id=, ?user_id=, ?status=
Status possíveis: draft, active, matched, completed, cancelled
POST /api/v1/offers
{
"app_id": "uuid-do-app",
"data": {
"title": "Desenvolvedor Full Stack",
"skills": ["react", "node", "typescript"],
"hourly_rate": 150
},
"status": "active"
}Uma Demand é uma demanda criada por um usuário dentro de um app.
| Método | Endpoint | Descrição | Permissão |
|---|---|---|---|
| GET | /api/v1/demands |
Lista demandas | Público |
| GET | /api/v1/demands/[id] |
Busca demanda por id | Público |
| POST | /api/v1/demands |
Cria demanda | create:demand |
| PATCH | /api/v1/demands/[id] |
Atualiza demanda | update:demand |
| DELETE | /api/v1/demands/[id] |
Remove demanda | delete:demand |
Filtros disponíveis: ?app_id=, ?user_id=, ?status=
Status possíveis: draft, open, matched, completed, cancelled, expired
POST /api/v1/demands
{
"app_id": "uuid-do-app",
"data": {
"title": "Preciso de Dev Full Stack",
"required_skills": ["react", "node", "typescript"],
"budget_max": 50000
},
"status": "open",
"expires_at": "2025-12-31T23:59:59Z"
}| Método | Endpoint | Descrição | Permissão |
|---|---|---|---|
| POST | /api/v1/users |
Cria usuário | Público |
| GET | /api/v1/users/[username] |
Busca usuário | Público |
| PATCH | /api/v1/users/[username] |
Atualiza usuário | update:user |
| GET | /api/v1/user |
Dados do usuário logado | Autenticado |
| Método | Endpoint | Descrição | Permissão |
|---|---|---|---|
| POST | /api/v1/sessions |
Login | create:session |
| DELETE | /api/v1/sessions |
Logout | Autenticado |
| Método | Endpoint | Descrição | Permissão |
|---|---|---|---|
| PATCH | /api/v1/activations/[token] |
Ativa conta | read:activation_token |
npm test # Roda todos os testes
npm run test:watch # Modo watchkairos/
├── pages/api/v1/ # Endpoints da API
│ ├── apps/ # CRUD de mercados
│ ├── offers/ # CRUD de ofertas
│ ├── demands/ # CRUD de demandas
│ ├── users/ # CRUD de usuários
│ ├── sessions/ # Login/logout
│ └── ...
├── models/ # Lógica de negócio
│ ├── app.js # Mercados
│ ├── offer.js # Ofertas
│ ├── demand.js # Demandas
│ ├── user.js # Usuários
│ ├── session.js # Sessões
│ └── ...
├── infra/ # Infraestrutura
│ ├── database.js # Conexão com PostgreSQL
│ ├── controller.js # Middlewares
│ ├── errors.js # Classes de erro
│ └── migrations/ # Migrations do banco
├── tests/ # Testes de integração
└── qa/ # Arquivos .http para testes manuais- Autenticação (users, sessions, activations)
- Apps (definição de mercados via JSON Schema)
- Offers (ofertas genéricas)
- Demands (demandas genéricas)
- Matching engine
- Contracts
- Reviews
- Validar offer.data contra app.offer_schema (JSON Schema)
- Validar demand.data contra app.demand_schema (JSON Schema)