Social impact / NGO
MinaTech
Technology with purpose.
The platform of the Jornada Minatech — a free program organized by two NGOs that brings girls from public schools into technology and engineering.
- Role
- Full‑stack developer
- Team
- Four developers
- Year
- 2026
- Organization
- Corali & Engenheiros sem Fronteiras (Florianópolis)
- React
- Vite
- Node.js
- Supabase


The impact
Opening doors through technology.
150+
girls impacted in Greater Florianópolis
The Jornada Minatech shows girls from public schools that engineering and technology are for them too.
100%
free for the girls
3
Saturdays: talks, a visit to UFSC’s labs, a hands‑on day at Neoway
11
women on the program’s team
2
NGOs behind it: Corali and Engenheiros sem Fronteiras
The experience
From a girl’s first visit to the team’s decision.
A girl and her family
Is this program for me?
A sponsor
How can I help?
The team
Who takes each spot?
Public experience
Six pages, open to anyone.
Everything a family asks before saying yes — who runs the program, when and where, the usual questions — and two actions: signing up or sponsoring.
Visit the live siteRegistration. Five sections: personal data, contact, diversity and inclusion, family situation, digital access.
Sponsorship. The PIX QR code, and a button that copies the key.
Curator dashboard
Everything the team needs to choose.
Behind a login: totals by status, tabs and search, approve, reject or delete, each registration in full, a CSV export — and the list of who can get in.
Registrations. The list, each row with its actions; below, the admins.
One registration. A registration in full: the form’s five sections, as the team reads them.
The architecture
One platform. Two experiences.
- /Home
- /oscsTeam & NGOs
- /programacaoSchedule
- /faqFAQ
- /doacaoSponsorship
- /inscricaoRegistration
MinaTech
Shared baseSupabase
- LoginSupabase Auth
- List · search · CSVGET /api/admin/inscricoes
- Approve · rejectPATCH /api/admin/inscricoes/:id
- DeleteDELETE /api/admin/inscricoes/:id
- AdminsGET · POST · DELETE /api/admin/admins
The API's two doors
POST /api/inscricao
Open to anyone, with a limit: 10 registrations per IP every 15 minutes. Each one is saved as pending.
/api/admin/*
Every call carries the session token from Supabase Auth, and the e‑mail must be one the program authorized.
What it keeps
inscricoes
Ten answers in five groups, a status — pending, approved or rejected — and its dates.
admin_emails
The admins the team manages. No policy opens it: only the API reaches it.
Row Level Security
With the public key, a registration can only be inserted; reading, changing or deleting it needs a session.
The one public page that writes to the base.
Fig. 05 — Drawn from the code: the routes of one React app, the two doors of its Express API, and the base behind both.
Decisions
One deploy, one domain
The React app and the Express API ship as one Vercel project: every /api call goes to a single serverless function on the site’s own domain, with one set of environment variables.
Checked on both ends
The form flags each required field as she leaves it; the API checks everything again — the allowed options, the e‑mail, the age as a whole number — and stores only the cleaned record.
Runs without credentials
With no Supabase keys, the same code switches to memory, with three sample registrations and a demo login — anyone can run and evaluate it without touching real data.
Engineering & contribution
Simple for the girls. Careful with their data.
Structure
One repository, two halves
A React 18 app with eight routes, the dashboard’s behind a guard; an Express API in layers — routes, middleware, controllers, and a repository, the only part that knows where the data lives.
Registration
A long form, made doable
The stepper watches which section is on screen; the phone gets a +55 mask; required fields are checked as she leaves them, and sending jumps to the first one left to fix.
Panel
Fast on the list it has
Totals, tabs and search work on the list already loaded, so filtering costs no request; a status change updates only its row; deleting asks first; the CSV is what’s on screen, encoded for Excel.
Users & access
Two levels of admin
Super‑admins live in an environment variable — hidden, and impossible to remove from the panel. The team adds the others itself; each new e‑mail gets an invite, and nobody can remove their own access.
Database
Rules in the schema
Postgres on Supabase: the status is a constraint with three values, an index backs the API’s filter by status, and each registration keeps when it was created and last changed.
My part
Full‑stack, in a team of four: from the public site and the registration to the API, the database and the curation panel.
The team’s work came in through pull requests, on a shared repository.
Built with
- React
- JavaScript
- Vite
- Node.js
- REST APIs
- Supabase
- PostgreSQL
- Vercel
- Express
- React Router
- Helmet
- express-rate-limit
Results & next steps
From sign‑up to selection, in the program’s own hands.
The Jornada has a home of its own: girls and families find what they need to say yes, sponsors find the PIX key, and the team decides every spot and manages its own access to the panel.
Selection with context
Each registration arrives as pending, with what the program asks — school level, family situation, digital access — for the team to weigh.
Access in the team’s hands
The program’s own e‑mail comes in as admin, and the team adds or removes the others from the panel.
Easy to pick up
One repository, one command to run the site and the API together, and a README that walks through Supabase and Vercel step by step.
NextA blog and online courses — planned, not built yet.