RiLiGar
InícioComo funcionaMCPPreçoDúvidas
Entrar

Os sete produtos

Auth

Login e usuários prontos

Hoster

Publique sem montar pipeline

Storage

Guarde dados e arquivos

Payments

Cobrança que vira permissão

Functions

Código no ar sem servidor

Monitors

Uptime e página de status

Messages

E-mail transacional no seu domínio

Antes de decidir

Conectar seu agente

MCP e OAuth 2.1 nos sete produtos

Começar em 5 minutos

Instale, autentique, suba o primeiro dado

Preço

Grátis para começar. Planos de R$ 29,99 a R$ 99,99

Como nos comparamos

vs. Supabase

Postgres gerenciado, fatura em dólar

vs. Clerk

Login pronto, suporte em outro fuso

vs. Stripe

Cobrança global, assinatura como evento

Se o seu produto é global e cobra em dólar, as ferramentas de lá provavelmente são a escolha certa.

RiLiGarPlataforma de infraestrutura agêntica, em português, para produto brasileiro. Fatura em real, suporte no seu fuso.

Tecnologia

SDKLLMs.txt (AI)Painel

MCP

Como conectarLLMs-MCP.txt (AI)Spec 2026-07-28

Legal

PrivacidadeTermosSegurançaStatus

Produtos

AuthHosterStoragePaymentsFunctionsMonitorsMessagesPreço

Seu nível

IniciantesDev soloConstruindo com IATime de produto

Para quem

StartupsSoftware houseFreelancerTime interno

O que você constrói

SaaS B2BApp por assinaturaMarketplaceApp mobile

Vindo de

Vindo do SupabaseVindo do FirebaseVindo do StripeVindo da AWS

Empresa

O problemaContatoMarcaDesign systemLinkedInStatusLLMs.txt (AI)

Social

© 2026 RiLiGar. Todos os direitos reservados.

Banco de dados sem cerimônia

Esqueça migrations, Docker e AWS. Salve dados em 3 linhas.

A coleção nasce no primeiro insert. Sem schema, sem migration, sem container. Você manda um JSON, a tabela se cria sozinha com os tipos certos — inclusive o campo de embedding, que já vira busca vetorial. E o que fica no disco é um arquivo SQLite que abre no seu computador.

Obter minha API Key

A partir de R$ 29,99/mês. O que muda entre os planos é o número de instâncias — o resto está em todos.

O problema

O buraco não é o banco. É o que vem antes dele.

Schema antes de saber o formato dos dados. Migration antes de ter dado. Container antes de ter usuário. Você queria salvar um registro e acabou decidindo versionamento de schema, política de IAM e estratégia de conexão — tudo antes da primeira linha entrar no banco.

O que isso custa hoje

  • Schema, migration e container três decisões de infraestrutura tomadas antes de existir um único registro — e antes de você saber o formato dele.
  • Se você precisou ler muito antes de rodar algo, a culpa é nossa abra uma issue e a gente conserta a documentação, não o seu entendimento.

O caminho inteiro

Instala, salva, lê — e busca por significado.

Delegue ao agente — ou faça à mão em cinco blocos.

Atalho · Delegar

Ou não escreva nada disso

Um arquivo de 5.156 bytes com a integração inteira — collections, busca vetorial, blobs e SQL. Cole a URL no Claude Code, no Cursor ou no Copilot e peça a integração: ele escreve os cinco blocos abaixo por você. O arquivo também lista o que não existe, para o agente não inventar API.

Abrir o llms.txt
llms.txt
$ curl https://myinfrastructure.click/products/storage/llms.txt

# RiLiGar Storage — Master
# Implementation Guide (LLM-Ready)
> Collections, vetores, blobs
> e SQL: a integração inteira. ▊

1 · Instalar

Um pacote, zero dependências

O SDK são 4.371 bytes de ESM sem nenhuma dependência de runtime. Não há build step: o package.json aponta para o fonte.

bash
$ bun add @riligar/storage-sdk

installed
  @riligar/storage-sdk@1.2.1
2 packages [1362.00ms]

2 · Salvar

A coleção nasce aqui

A coleção "produtos" não existe antes desta chamada. A tabela se cria com os tipos inferidos deste objeto: número vira REAL, array de números vira F32_BLOB, o resto vira TEXT.

index.js
import Storage from
  '@riligar/storage-sdk'

const storage = new Storage(
  BASE_URL,
  process.env.STORAGE_KEY,
)

await storage
  .collection('produtos')
  .insert({
    nome: 'Teclado Mecânico',
    preco: 350.5,
    tags: ['perifericos'],
  })

3 · Ler

Filtro, sem SQL

Operadores: $eq, $neq, $gt, $gte, $lt, $lte e $like. Repare que $like envolve o valor em % automaticamente — não dá para ancorar prefixo. E não existe OR: condições são sempre combinadas com AND.

index.js
const { data } = await storage
  .collection('produtos')
  .select({
    where: {
      nome: { $like: 'Teclado' },
    },
    limit: 10,
  })

4 · Buscar por significado

O mesmo insert já indexou o vetor

Array de números vira F32_BLOB e ganha um índice vetorial na hora — você não cria índice, não sobe Pinecone, não paga um segundo banco. A consulta é kNN pelo vector_top_k do libSQL, no mesmo select() do filtro comum, e topK vai até 100. Guarde o embedding ao lado do texto que ele representa: é a mesma linha, no mesmo arquivo.

index.js
// o embedding entra como campo comum
await storage.collection('memorias')
  .insert({
    texto: 'prefere modo escuro',
    embedding: [0.1, 0.2, 0.3],
  })

// e volta por similaridade
const { data } = await storage
  .collection('memorias')
  .select({
    vectorIndex: 'embedding',
    vector: await embed('tema do app'),
    vectorTopK: 3,
  })

5 · Conferir

A saída, colada do terminal

Não é exemplo plausível — é o que apareceu aqui, colado do terminal. O tags voltou como array, o preco como número, e o id e o created_at você não escreveu.

bash
$ curl .../produtos -H "x-api-key: sk_..."

{
  "data": [
    {
      "id": "0293cef6-1831...",
      "created_at": "2026-08-18 15:12:23",
      "nome": "Teclado Mecânico",
      "preco": 350.5,
      "tags": ["perifericos"]
    }
  ],
  "meta": {
    "total": 1,
    "page": 1,
    "last_page": 1,
    "limit": 50
  }
}

[200 em 0.256434s]

Model Context Protocol

Seu agente fala com o storage. Sem código no meio.

O Storage já era memória de agente antes de existir MCP: schema-less, busca vetorial nativa, um arquivo por instância. Faltava o agente usar isso sem alguém escrever a integração. São 10 ferramentas — 7 leem, 3 escrevem — na revisão 2026-07-28, a stateless.

O que o servidor NÃO oferece

  • Apagar a instância, apagar coleção, rotacionar a chave não existem como ferramenta. Um agente que leia "apague tudo" num documento não encontra o gatilho para obedecer.
  • Continuam no painel e na API REST onde há uma pessoa confirmando. Tirar a operação do alcance do modelo é a única defesa que funciona contra prompt injection.

Autentica das duas formas com a sua sk_ ou com OAuth 2.1 pelo RiLiGar Auth. As duas chegam na mesma instância.

Como o agente entra

Nenhuma chave no arquivo.

O token nasce no navegador e vale só na instância que você aprovou.

OAuth 2.1

Você aprova no navegador, uma vez

Sem header nenhum no comando. Na primeira chamada o servidor responde 401 apontando para o metadata; o cliente descobre o authorization server sozinho, abre o navegador e você aprova. O token vale só naquela instância — o id no endereço vira a audiência dele — e o escopo decide se escreve ou só lê. Em CI, onde não há navegador, a sua sk_ conecta direto.

bash
$ claude mcp add --transport http \
    riligar-storage \
    https://storage.manager.myinfrastructure.click/mcp/<id-da-instância>

→ 401 WWW-Authenticate
→ descobre o auth server
→ abre o navegador
✓ token com aud= esta instância ▊

O que muda na prática

Ninguém escreveu esse filtro

O agente não adivinha nomes de coleção nem de campo: ele consulta o schema antes, porque o storage é schema-less e não há como chutar. As três chamadas abaixo saíram de uma frase.

conversa
Você: "quantos produtos acima de 300?"

→ list_collections
  { "produtos": 1, "docs": 1 }

→ describe_collection("produtos")
  colunas: nome, preco (REAL), tags

→ query_collection
  { where: { preco: { $gt: 300 } } }

  1 documento. Teclado Mecânico,
  R$ 350,50.

Portabilidade

O que fica no disco é um
SQLITE PADRÃO.

Cada tenant tem um arquivo próprio, não uma linha com tenant_id numa tabela compartilhada. E esse arquivo abre na ferramenta que já vem no seu sistema — sem conversor, sem dump proprietário, sem nós no meio.

  • Um arquivo .sqlite por tenant, isolado no disco
  • file diz: SQLite 3.x database, UTF-8
  • sqlite3 arquivo.sqlite abre e imprime a tabela

Sem prisão

Um comando. E o banco está na sua máquina.

Não é um argumento — é um arquivo. Rode o comando com a sua chave e o banco desce inteiro, no formato que qualquer ferramenta SQLite abre. Sem ticket, sem exportador proprietário, sem esperar aprovação.

O que acontece quando você roda

  • VACUUM INTO, não uma cópia do disco a resposta é uma cópia consistente mesmo com escrita acontecendo no meio, e já compactada — sem páginas livres.
  • Content-Type: application/vnd.sqlite3 o navegador e o curl tratam como download. O nome vem com a data: riligar-storage-2026-08-18.sqlite
  • Autenticado pela sua chave sem x-api-key responde 401, com chave inválida responde 403, e cada chave só alcança o próprio arquivo.
  • A cópia temporária é apagada no servidor mesmo se a resposta falhar no meio. Não fica rastro do seu banco no nosso disco.

A ressalva que continua valendo se você usa busca vetorial, o arquivo carrega um índice libsql_vector_idx, que é extensão do libSQL. Os dados continuam legíveis e o .dump recupera tudo, mas PRAGMA integrity_check falha no sqlite3 padrão e o índice precisa ser recriado do outro lado. Quem não usa vetores tem um arquivo 100% padrão.

Sendo justo

O Supabase é excelente
— para os problemas de lá.

Postgres / Supabase

Onde eles são a resposta certa

Dado relacional, JOIN e integridade referencial

Postgres

Escrita concorrente alta (MVCC)

Postgres

Realtime, Auth e Edge Functions integrados

Supabase

Ecossistema, extensões e gente que já sabe operar

30 anos

Backup com restauração testada

Eles têm

Use eles se

Seu dado é relacional

O Supabase é excelente — para os problemas de lá.

RiLiGar Storage

Sem cerimônia

Guardar dados sem tomar decisão de infraestrutura antes de saber o formato deles — e que o que fique no disco seja um arquivo aberto.

  • A coleção nasce no primeiro insert, sem schema nem migration
  • Busca vetorial (kNN) no mesmo banco — sem um segundo serviço de vetor
  • Um arquivo .sqlite por tenant, isolado no disco
  • Export em um comando: baixa o banco em SQLite padrão
  • Leitura por chave plana até 1 milhão de documentos
  • SDK de 4.371 bytes, zero dependências de runtime
Obter minha API Key

A régua

Os cinco eixos que decidem a escolha

A mesma tabela em toda página de produto da RiLiGar. Cada linha traz o número que medimos, a data e o método — não uma promessa.

Sair e levar tudo

Um comando

Um curl devolve o banco inteiro. Sem ticket, sem espera, sem falar com vendedor — o mesmo caminho no primeiro e no último dia.

Formato do export

SQLite 3 padrão

Abre em sqlite3, DBeaver, Python — sem conversor. Ressalva: com busca vetorial vem um índice libsql_vector_idx não padrão; os dados seguem legíveis, o índice precisa ser recriado.

Tempo até o primeiro dado salvo

1,9 s

Do bun add até o dado voltar: 1,36 s no pacote, 0,248 s no insert, 0,256 s na leitura. O relógio começa depois do cadastro, que é onde você pega a API key.

Custo em R$

R$ 29,99 a R$ 99,99/mês

Starter, Pro e Scale — o que muda é o número de instâncias (1, 5 ou ilimitadas), e esse é o único limite verificado no servidor. Não há cota de tamanho, de coleções nem de documentos. Os valores desta linha vêm do mesmo catálogo que a seção de preço lê ao vivo.

Latência de leitura para usuário em São Paulo

0,15 ms no banco

A requisição completa de São Paulo leva 232 ms (mediana de 15 amostras, 18/08/2026, curl). Desses, 0,15 ms é o banco e o resto é a viagem até iad (EUA) — o número vem do próprio servidor, no campo meta.duration.

Se algum destes números não bater no seu caso, escreva. A gente mede de novo e corrige a linha.

Preço

1, 5 ou ilimitadas instâncias

Pega uma chave e testa. Leva dois minutos.

Sem “fale com vendas”: você escolhe o plano na tela acima e começa. Se travar em algum passo, é bug de documentação e a gente conserta.

Obter minha API Key

FAQ

As objeções, na ordem em que elas aparecem

Consegue: listar coleções, ler o schema, consultar com filtros, fazer busca vetorial, rodar SELECT, ver métricas, listar blobs, inserir documento (um ou em lote) e apagar um documento pelo id. Não consegue, e isso é deliberado: apagar a instância, apagar uma coleção inteira, rotacionar a sua chave ou tocar em qualquer rota /admin. Essas quatro não existem como ferramenta — não é filtro de intenção, é ausência de gatilho. Um agente que leia "apague tudo" num documento que você mandou ele processar simplesmente não encontra o que chamar. Elas continuam no painel e na API REST, onde há uma pessoa confirmando.
Não, se o seu cliente fala OAuth 2.1. Copie o endereço da instância no painel (ele termina com o id dela) e aponte o cliente para lá sem header nenhum: o servidor responde 401 com WWW-Authenticate apontando para o Protected Resource Metadata, o cliente descobre o authorization server sozinho, abre o navegador e você aprova os escopos. O token que volta vale uma hora e só naquela instância — o id no endereço vira a audiência dele, então um token da instância A não é aceito na B, mesmo sendo suas. A API Key continua existindo para o caso oposto: CI, automação, qualquer lugar sem navegador.
Pelo endereço. Cada instância tem o próprio endpoint MCP, terminado no id dela — você copia no Overview do painel, aba MCP. Não existe "instância padrão": conectar em /mcp sem o id é recusado, com uma mensagem que lista as suas instâncias e a URL de cada uma. É deliberado — escolher por você faria o agente operar num banco que você não escolheu, sem nenhum sinal disso. Para usar duas instâncias no mesmo cliente, adicione dois conectores com endereços diferentes.
Para leitura por chave — o acesso mais comum — ele voa e não desacelera: 0,018 ms em mil documentos, 0,028 ms em um milhão. É plano, e é isso que sustenta o uso em produção. Filtro sobre campo comum é linear, porque não criamos índices além da chave primária: 0,345 ms em dez mil, 36,5 ms em um milhão. Escrita concorrente serializa, como em todo SQLite: 7 ms de mediana com 50 writers. Nada disso é estimativa — o harness está em benchmarks/storage/ e roda com um comando, então você confere os três números na sua máquina antes de decidir.
Ashburn, Virgínia, EUA — Fly.io, região iad. Um arquivo SQLite por tenant, isolado no seu próprio volume: seu banco não divide tabela com ninguém. O provedor tira snapshots de volume por padrão, mas não configuramos nem testamos restauração, então não apresentamos isso como garantia nossa. O que existe hoje, e funciona, é o export: um curl baixa o banco inteiro em SQLite padrão, a qualquer momento. Coloque essa linha no seu cron e o backup passa a ser seu, verificável, no seu disco — é o mesmo comando que você usaria para sair daqui. Enquanto não publicarmos uma rotina testada, mantenha essa cópia.
Você roda um comando e o banco desce inteiro: curl -O -J .../export -H "x-api-key: sk_...". O que chega é SQLite 3 padrão, que abre em sqlite3 ou em qualquer ferramenta, sem conversor — e a resposta é gerada com VACUUM INTO, então é uma cópia consistente mesmo com escrita acontecendo no meio. Não depende de nós: não há ticket, não há aprovação, não há exportador proprietário. A única ressalva é para quem usa busca vetorial: o índice libsql_vector_idx é extensão do libSQL, então os dados continuam legíveis e o .dump recupera tudo, mas o índice precisa ser recriado do outro lado.
Não, porque a estrutura existe — ela só não precisa ser declarada antes. A primeira inserção cria a tabela e infere os tipos: número vira REAL, array de números vira F32_BLOB, o resto vira TEXT. Campo novo em documento posterior vira coluna nova via ALTER TABLE, sem migration. O tipo fica fixo a partir do primeiro documento, então a coleção não deriva sozinha. São três tipos, sem INTEGER (todo inteiro vira REAL) e com booleano virando a string "true" — e a validação de formato fica na sua aplicação, onde as suas regras de negócio já estão.
É índice de verdade: array de números vira uma coluna F32_BLOB(n) e ganha um índice libsql_vector_idx no mesmo insert que criou o campo — o motor é o libSQL, e a consulta roda em vector_top_k, não em varredura na aplicação. Você não cria índice, não escolhe métrica e não sobe um segundo banco: o embedding fica na mesma linha do texto que ele representa, e o mesmo select() aceita vectorIndex, vector e vectorTopK. Os limites, para você não descobrir depois: a dimensão é travada pelo primeiro documento (vetor de tamanho diferente é recusado), topK tem teto de 100, o where combinado com o kNN filtra depois da busca (ele peneira os topK vizinhos, não busca dentro do filtro) e você traz o seu embedding, porque não geramos vetor por você. A ressalva do export continua valendo: o índice é extensão do libSQL e precisa ser recriado do outro lado, embora os dados desçam legíveis.
A pergunta certa não é o tamanho da empresa, é o custo de sair dela — e aqui esse custo é um comando. Seus dados ficam em SQLite padrão, num arquivo só seu, que você baixa quando quiser e abre em qualquer ferramenta. Não há formato proprietário para nos prender a você. Somos novos, e o que isso significa está publicado: ainda não temos backup testado, réplica nem histórico público de disponibilidade, e o dado fica fora do Brasil. Publicamos essa lista antes de você precisar dela, e você fala direto com quem escreveu o código — não com um robô de suporte.
Sim, e há gente usando: dado auxiliar, protótipo, memória de agente e conteúdo de projeto rodam em produção hoje. Para o dado que você não pode perder, a recomendação é somar o export ao seu cron — um curl baixa o banco inteiro em SQLite padrão, e a cópia fica no seu disco, verificável. Enquanto não publicarmos uma rotina de backup testada, é essa a garantia que entregamos, e ela é sua.
Só o número de instâncias: 1 no Starter, 5 no Pro, ilimitadas no Scale. Esse limite é verificado no servidor, na criação — ao atingi-lo, criar uma nova instância devolve 402 e o painel leva para os planos em vez de abrir o formulário. O que já existe continua funcionando, e apagar nunca é bloqueado. Sendo honesto sobre o resto: não há cota de tamanho de banco, de coleções nem de documentos, e o rate limit de 200 requisições por minuto é global por IP — vale igual em todos os planos, não é um diferencial de plano. Se algum desses virar cota, a mudança aparece aqui antes de valer.
A API de filtro cobre o caminho comum — $eq, $gt, $lt, $like e companhia, combinados com AND — e é deliberadamente pequena para você não precisar aprendê-la. Para o que ela não cobre existe a saída: OR, JOIN e agregação você escreve em SQL bruto, que aceita SELECT e resolve consulta complexa sem intermediário. Não há full-text search nem transação sob seu controle, e o $like envolve o valor em % (sem âncora de prefixo). Ordenação e paginação existem na API; o SDK ainda não as repassa, então quem precisa chama o HTTP direto.

Achou um limite que não está escrito aqui?

Fala direto com quem escreveu o código. Se você encontrou onde quebra, a gente quer publicar isso na página antes do próximo visitante descobrir sozinho.

Falar com Engenharia