Skip to content
flutter test      3159 ok   7 skipped
supabase test db  1782 ok
node --test         82 ok   0 failures

Each dot in this fox is a check that passed: 5,023 in the last CI run of Mindy, on October 12, 2026.

João Leite, Developer

I'm João Leite. I build software for the day something goes wrong.

The job site with no signal. The payment notified twice. The data one resident must not see from another. These are problems I have already solved in real systems, and you can test two of them here.

The bad day.

Every system works on a good day. The real work is what it does when the internet drops, when the notice arrives twice, when someone tries to see what is not theirs.

  1. Wrong total on the invoice. The AI reads. The code redoes the math and flags in the spreadsheet what does not add up. Invoice extractordemoPython, FastAPI, AI API
  2. Site down in the middle of a run. A temporary error tries again with a growing wait. A permanent error stops and reports. And the robot goes slowly: four pages at a time, with pauses between them. Catalog collectordemoPython, Playwright
  3. The payment notice came twice. A repeated, late or out-of-order notice does not undo a paid order. Two customers do not get the last piece. D'Andrade Moda storeliveReact, Cloudflare Workers, D1
  4. No signal on site. The record waits on the device and uploads by itself when the connection returns, with no duplicates. Daily construction reportwent into production, previous jobNext.js, Supabase, IndexedDB
  5. One person's data on another's screen. What belongs to the home is visible to everyone. What is yours stays yours, and the database enforces it. Mindyprivate beta, pausedFlutter, Postgres with RLS

Other work

  • Dermatech Medical Client website, live, with nine pages and an interface in Portuguese, English and Spanish. The WhatsApp buttons alternate between consultants.
  • Plateia Flutter and Supabase prototype, with the access rule tested in Postgres. It has not run in a real project yet.
  • Procurement automation in an ERP Earlier experience: Python and Playwright routines in a corporate system. No public screens and no code to show.

Try to break it.

Don't take my word for it. These pieces run in your browser, with logic ported from the real systems and fictional data. Each one says what is real and what is simulated.

Record with the network cut. Lose the server reply. Try to create a duplicate.

The same problem as the job-site app: the record waits on the device and is created only once on the server.

This demo needs JavaScript. The rest of the page works without it.

See the full project: Daily construction report

Fire repeated, late and out-of-order notices at an order.

The store payment rule, ported to the browser: a paid order does not go back, and stock never goes negative.

This demo needs JavaScript. The rest of the page works without it.

See the full project: D'Andrade Moda store

Inside.

The number that matters is the one that limits the code, not the one that measures volume. Each one below shows where it came from.

o_banco_da_so_o_que_as_policies_prometem

  • 3,159 app tests
  • 1,782 database assertions
  • 82 edge function tests

5,023

checks passed in the last CI run of Mindy: 3,159 app tests, 82 edge function tests and 1,782 database assertions. None failed.

CI of October 12, 2026, commit 567a46a
3159 tests passed, 7 skipped.
Files=75, Tests=1782 ... Result: PASS
pass 82, fail 0

35.46%

is what the dark layer takes up in the fox. Database assertions are 35.48% of the total. The symbol already existed when I measured it: it is a coincidence, and I left it.

159989 of 451150 pixels of the symbol
1782 of 5023 checks

117/117

Mindy tables have RLS on: with no policy, the table stays closed. CI rejects a migration that creates a table without RLS, a policy that allows everything, or an owner-privilege function without a fixed search path.

SQL guards passed for 147 migration file(s).

3 of 117

tables accept direct writes from the app: two for the user's own profile, and the waiting list. Everything else goes through a versioned function, with the rule inside the database.

grant update on table public.profiles to authenticated;
grant update on table public.user_preferences to authenticated;
grant insert on table public.lista_de_espera to anon, authenticated;

Byte by byte

is how the Mindy notification encryption matches the official example in RFC 8291. No library, in 368 lines.

encrypts the RFC 8291 example byte for byte

249

tests in the D'Andrade store, with payment and shipping simulated. An unknown host throws an error: no test touches the network.

npm test: 249 of 249, in 21 files

And this page?

No framework, no library, no tracker, fonts served from here. The home page opens with no internet after the first visit.

curl -s foxer.dev.br

What broke.

It broke on a real device, in production, in CI or on the first run. Each case left a guard behind.

  1. Key is not 44 characters or its check digit is invalidExtractor

    The AI lost digits. The code caught it.

    Cause

    On the first run of the extractor, the invoice key came back with 42 and 43 digits. Nothing in the response showed an error: only the check noticed.

    What stayed

    The key is checked on every read. The report from that run is kept with the code.

  2. 42501 permission denied for schema privateMindy

    Creating worked. Fixing and deleting did not.

    Cause

    A deferred trigger runs at commit, already outside the function with special permission. Database tests end in rollback, so they never fired it, and the screen translated the error as "you have no access".

    What stayed

    The trigger now runs as owner: o_gatilho_adiado_roda_como_dono. And the lesson was written where the next test reads it.

  3. HTTP 2xx, and nothing on the screenMindy

    Apple accepted it. The iPhone did not show it.

    Cause

    The device had three subscriptions, two of them orphans, and the push service answers success even for an orphan. Even the last-used column lied, because it was also written at registration.

    What stayed

    A receipt in three layers: accepted, shown and clicked. The column became last_accepted_at, and orphans get cleaned up.

  4. cross-database references are not implementedMindy

    The first device would have broken task creation.

    Cause

    extensions.net.http_post is read as database.schema.function. The line only ran with a subscribed device, so no test reached it.

    What stayed

    The right name and a bigger rule: the queue is the guarantee, the call is the hurry. push_dispatch_never_costs_the_task.

  5. otp_expiredMindy

    The email provider's robot used the link before the person.

    Cause

    Antivirus and preview tools open links in email on their own. The single-use link died before the click, and the person only saw "link expired".

    What stayed

    The link now opens a page of mine, which trades the token for a session with POST. Robots do not POST. The bug reproduces with two curl commands.

  6. NetworkFirst em /api/*/pdfJob-site app

    The report opened with old data.

    Cause

    The PDF route went through the service worker cache, and some records received the old file.

    What stayed

    PDF is now NetworkOnly: it never goes through the cache.

  7. lang=en-USDermatech

    Google stored the page in English.

    Cause

    The Google robot renders as en-US, and the site followed the browser language.

    What stayed

    The first language is always Portuguese. Whoever chooses another one stays in it while browsing.

What I build.

You talk to the builder.

Portrait of João Leite in dots

I'm João Leite, a developer in Embu das Artes, Brazil. Foxer is my brand and there is no team behind it: the person who answers is the person who codes.

Before this, I was a buyer and the only IT person at a multinational. I read a lot of vendor proposals, so I write mine the way I wanted to receive them: what is in, what is out, the price and the date.

I work best in writing: scope, questions and updates go through text, so nothing gets lost.

Front end
React, TypeScript, Flutter
Back end
Cloudflare Workers, Supabase, Python (FastAPI)
Database
Postgres, SQLite (D1)
In the field
Offline PWA, server-side PDF
Automation
Playwright, Pydantic, AI APIs
Education
Associate degree in Systems Analysis and Development at Descomplica, in progress (expected Dec 2026)
Languages
Portuguese (native), Spanish (advanced), English (intermediate, written preferred)
Where
Remote, UTC-3, with hours that overlap US Eastern time
Not a fit
Full-time roles with daily calls in English

Tell me the problem.

One message is enough to start. I reply myself and, if it makes sense, I send a written proposal: what is in, what is out, deadline and price.

WhatsApp +55 11 99227-9903