PrimoDev/ apps

Recta

Finanças pessoais e da casa num lugar só, na web, iOS e Android

  • Web
  • iOS
  • iPadOS
  • watchOS
  • Android
  • Self-hosted
  • Grátis
  • Open source · MIT

O que é o Recta?

O Recta é um gerenciador financeiro pessoal pra organizar contas, cartões, faturas, orçamentos e metas, sozinho ou junto com quem mora com você. Funciona na web em recta.app e tem apps nativos pra iPhone, iPad, Apple Watch e Android.

O Recta hospedado (web e apps) é grátis, sem planos pagos, sem anúncios e sem cartão de crédito. Também existe uma versão open source sob MIT (backend e frontend web) que você pode hospedar no seu servidor, pagando só a sua hospedagem.

O que ele faz

  1. 01Contas e cartões ilimitados, com limite, fechamento, vencimento e fatura mês a mês
  2. 02Compras parceladas no cartão, com cada parcela na fatura certa
  3. 03Orçamentos por categoria, metas de poupança e transações recorrentes
  4. 04Orçamento compartilhado com a casa, com divisão de despesas entre membros
  5. 05Relatórios por categoria e período, com exportação dos dados
  6. 06App iOS com widget, Siri e Atalhos, Apple Watch e layout próprio pro iPad
  7. 07Disponível em 8 idiomas, com tema claro e escuro
  8. 08Versão self-hosted open source com backend Fastify e PostgreSQL

Perguntas frequentes

O Recta é grátis?
Sim. Segundo o próprio site, não tem planos pagos, período de teste nem cartão de crédito, e todos os recursos são liberados pra todo mundo. Os apps na App Store e no Google Play também são grátis.
Dá pra usar o Recta com a família ou parceiro?
Dá. Você convida quem mora com você pra mesma casa, define limites por categoria juntos e pode dividir uma despesa entre os membros. Também existe acesso somente leitura.
Tem app pra iPhone e Android?
Tem. O app de iOS roda no iPhone, iPad e Apple Watch (iOS 17 ou mais novo) e o de Android está no Google Play. A mesma conta funciona na web e nos apps.
Posso hospedar o Recta no meu próprio servidor?
Pode. O backend (recta-selfhosted-backend) e o frontend web (recta-selfhosted-frontend) estão no GitHub. Você precisa de Node.js 20+ e PostgreSQL 16+, e pode usar login próprio sem Firebase com o modo de autenticação local.
Qual a diferença entre o recta.app e a versão self-hosted?
O recta.app é o produto hospedado, com web e apps nativos. A versão self-hosted é o código aberto de backend e web que você roda por conta própria. Contribuições no repositório aberto não garantem que a mudança entre no recta.app.
O Recta mostra anúncios ou rastreia meus dados?
Não. A descrição na App Store diz que o app não tem anúncios nem rastreamento, e dá pra ocultar os saldos e bloquear o app com Face ID, Touch ID ou senha.

Guias

Documentação

README do repositório lucianodiisouza/recta-selfhosted-backend, atualizado a cada deploy. O texto original é em inglês.

Backend for Recta — personal finance app with household collaboration. Open source & self-hostable.

About this project

Recta is an open source personal finance manager. This repository is the public backend: anyone can self-host it, fork it, submit pull requests, or build on top of it. Submitting PRs or contributing does not guarantee that any feature or change will be incorporated into the hosted product at recta.app. The maintainers decide what is merged and what is shipped on recta.app.

This project is maintained by PrimoDev.

Other part of the project: recta-selfhosted-frontend — web app (React/Vite).

Tech stack

  • Node.js 20+
  • Fastify – REST API
  • PostgreSQL – database
  • Prisma – ORM
  • Firebase Admin – auth (Google, Apple, email)
  • Zod – validation

Hosting (self-hosted)

You can run this backend on any Node.js host. Some options:

  • Railway – simple deploy, PostgreSQL add-on, cron support
  • Render – free tier, PostgreSQL, background workers
  • Fly.io – global regions, PostgreSQL via Supabase or external
  • DigitalOcean App Platform – managed app + DB
  • VPS (Hetzner, Linode, etc.) – run npm run start behind Nginx and use a managed PostgreSQL (e.g. Supabase, Neon, or self-hosted)

Set DATABASE_URL, pick an auth mode and, in production, ALLOWED_ORIGINS and optionally SWAGGER_USERNAME/SWAGGER_PASSWORD. For recurring transactions, schedule npm run cron:process-recurrences once per day (cron job or Railway cron).

You don't need Firebase to run a working instance — local auth mode plus PostgreSQL is enough.

How to run

Prerequisites

  • Node.js 20+
  • PostgreSQL 16+
  • Firebase project with Authentication enabled

1. Install dependencies

npm install

2. Environment variables

cp env.example .env

Edit .env:

Variable Required Description
DATABASE_URL Yes PostgreSQL URL, e.g. postgresql://user:password@localhost:5432/recta
AUTH_MODE Yes local (no Firebase) or firebase (default). See below.

Auth mode

Choose how users sign in via AUTH_MODE:

  • local (recommended for self-host) — no third-party auth. The backend issues and verifies its own JWTs for email/password login. Requires AUTH_JWT_SECRET (min 32 chars; generate with openssl rand -base64 48). Optional: AUTH_TOKEN_TTL_HOURS (default 720 = 30 days), AUTH_REQUIRE_EMAIL_VERIFICATION (default false). No Firebase setup needed.
  • firebase (default) — Google/Apple/Email sign-in via Firebase. Provide credentials with one of the two options below. Optionally set the public AUTH_FIREBASE_WEB_API_KEY so GET /auth/config hands the client your web config.

Clients call GET /auth/config (public) to discover the mode before showing a login screen.

Firebase – option A (file):

  • Create a service account and download the JSON.
  • Save it in the project (e.g. firebase-service-account.json) and do not commit it.
  • In .env: GOOGLE_APPLICATION_CREDENTIALS=./firebase-service-account.json

Firebase – option B (env vars):

  • In .env set: FIREBASE_PROJECT_ID, FIREBASE_CLIENT_EMAIL, FIREBASE_PRIVATE_KEY (private key with \n for newlines).

Other optional vars: PORT (default 3000), REDIS_URL, SWAGGER_USERNAME/SWAGGER_PASSWORD, ALLOWED_ORIGINS, FIRST_RUN. See env.example.

In production use npm run db:deploy (not db:migrate) to apply migrations, or set FIRST_RUN=true on the first boot to run them automatically, then remove it.

3. Run migrations

npm run db:migrate

4. Start the server

Development:

npm run dev

Production:

npm run build
npm run start

API at http://localhost:3000. Swagger docs (when enabled): http://localhost:3000/docs.

5. Verify

curl http://localhost:3000/health

Returns { status, timestamp, uptime, apiVersion, minClientVersion }. apiVersion is the self-host contract: clients compare it against the official contract to detect a backend that has fallen behind. If your instance reports an older apiVersion than the app expects, pull the latest code and redeploy so the schema and endpoints stay in sync.

Scripts

Command Description
npm run dev Dev server with hot reload
npm run build Production build
npm run start Run production build
npm run db:migrate Run migrations (dev)
npm run db:deploy Run migrations (production)
npm run db:studio Open Prisma Studio
npm run db:generate Generate Prisma Client
npm run lint Lint
npm run typecheck Type check

Recurring transactions (cron)

To process recurring transactions daily, run as a cron job:

npm run build
npm run cron:process-recurrences

Schedule this once per day (cron, systemd, or your host’s scheduler).

Project structure

src/
├── app.ts              # Fastify app
├── index.ts            # Entry point
├── modules/            # API modules (auth, users, households, accounts, transactions, etc.)
├── shared/
│   ├── config/         # env, Firebase
│   ├── db/             # Prisma & migrations
│   ├── middleware/     # Auth & authorization
│   └── utils/
└── jobs/               # Cron (e.g. processRecurrences)

License

MIT