logo falcao Dev
.../projects

Deentz

An ERP/CRM for a solo dental clinic, replacing paper forms and a nightly spreadsheet close. A GraphQL API on Node and Postgres, where tenant isolation is enforced by the database instead of by remembering to check it. A Next.js app over it, and a copilot that answers questions about the clinic without the model ever seeing a patient's name, or a number it could alter. In beta at two clinics.

Role
Sole technical owner
Company
Deentz

Frontend

  • Next.js
  • React
  • TanStack Query
  • Apollo Client
  • Tailwind CSS
  • Astro

Backend

  • Node.js
  • Express
  • GraphQL
  • PostgreSQL
  • Onion Architecture
  • Prisma
  • Row-Level Security

Tooling

  • TypeScript
  • Docker
  • Git
  • Vitest
  • Playwright
97%
Copilot task accuracy on open-weight models

The agent runs on an open-weight model, Qwen3-235B, served through OpenRouter. The accuracy is scored by the author across the copilot task set, not yet by an automated suite.

2 into 1
Money streams in a purpose-built ledger

The finance module is its own ledger rather than an accounting integration: appointment billing lines and the expense book merge in get-finance-ledger.ts, and the filter plus both totals run before the page slice, so the sums cover every row the filters keep and not just the page on screen.

+ 1200 tests
Tests on every pull request

Orchestrated multiple CI workflows triggered on PRs across frontend and backend repositories to enforce strict continuous integration quality gates. The automated test matrix validates static typing, architecture, unit/integration, and database migrations, while inherently performing differential coverage regression against main, detecting stateful schema drift, and running headless Playwright E2E assertions for critical user flows.

4 h/day
Admin time removed

Self-reported by the clinic owner, measured against the manual routine it replaced.

The walkthrough

6 sections
01 / 06

The copilot, on the web and on the phone

A tool-calling agent on the backend, answering in plain Portuguese. The figures in its cards come from the query result rather than from the model, so a number on screen cannot be rewritten by a language model.

Deentz copilot answering a question about the clinic in a chat panel
02 / 06

The day, closed without a spreadsheet

Revenue, appointments and no-shows on one screen. Closing the day stops being a nightly retyping job, which is the four hours this was built to remove.

Deentz dashboard showing the day: revenue, appointments booked, patients seen and a revenue chartDeentz schedule view with appointments laid out by hour and dentistDeentz appointment room view with the appointment in progress and its procedures
03 / 06

The patient record

Paper forms became one screen, filled once at the point of care. Health data sits under art. 11 of the LGPD, so a patient's name never reaches an external model unaliased.

Deentz patient list with search, status and last visit per rowDeentz new patient form with personal data, contact and address fieldsDeentz patient record with the dental chart, treatments, appointments and paymentsDeentz medical history form for a patient, with health questions and allergiesDeentz treatment detail showing the teeth in the plan, the estimate and how much is already paid
04 / 06

Money, and where it comes from

Catalogue prices are copied onto the billing line and frozen, so repricing a service does not rewrite last year's invoices. Partial refunds are atomic: two concurrent refunds against one payment resolve to exactly one winner.

Deentz financial overview with revenue, expenses and result for the periodDeentz transaction list with payments received, method and statusDeentz expense screen with recurring and one-off costs of the clinicDeentz expense category management screenDeentz service catalogue with the price of each procedure
05 / 06

Stock, team and what each role sees

Four roles, and the role decides the screen. A receptionist sees what a receptionist needs, and the agent is handed only the tools that role is allowed to call.

Deentz stock screen with materials, quantity on hand and low-stock warningsDeentz team screen listing staff with their role in the clinicDeentz employee view, showing what a receptionist or assistant sees instead of the owner view
06 / 06

Consent, privacy and the account

Consent records, retention and the account settings. Every mutation that touches a patient is written to an audit log.

Deentz legal screen with LGPD consent records and documents per patientDeentz notification centre listing alerts for the clinicDeentz settings screen with the clinic configuration sectionsDeentz subscription plan screen showing the current plan and its limitsDeentz profile settings with the user name, photo and contact detailsDeentz security settings with password change and session controlsDeentz privacy settings with data handling and LGPD optionsDeentz sign-in screenDeentz account creation screen for a new clinic
Go back to projects