Vol. ICiélio Queiroz

§ 03

Selected work.

Praça Araguaia running
Context
In southern Pará, ranchers decide when to sell based on prices that arrive by WhatsApp and word of mouth. The information exists and is public, but it is scattered across sources that do not speak the language of the people working the land — and it arrives too late for anyone closing a deal today.
What I built
Twelve price feeds gathered by a scheduled job, stored in Postgres and published with revalidation — plus a daily bulletin, rainfall forecast and the market thermometer, which turns the whole set into a single reading: is the market hot or flat.

Stack

Next.js 15 · TypeScript · Supabase · PostgreSQL · Vercel Cron · Tailwind CSS

Takeaway →Gathering the data was not the hard part — deciding what to show was. Information that does not reach the decision-maker in their own language is not information, it is an archive.

Capital Financeiro running
Context
Fifteen years doing the same reconciliation by hand: turn PDF into rows, rows into categories, categories into a decision. The work never changes, only the month — and a typo only surfaces when the total refuses to add up, if anyone checks.
What I built
The PDF is parsed inside the browser and never leaves the machine. The app extracts the entries and checks their sum against the total printed on the document itself before storing anything; only then does it categorise, split by billing period and draw the charts.

Stack

React 19 · TypeScript · Vite · Neon · PostgreSQL · Tailwind CSS

Takeaway →Check against the answer key printed on the document. An importer that does not match the stated total does not fail loudly — it lies confidently, and the error surfaces months later.

Vaga Certa running
Context
Job hunting means reading dozens of listings to find out almost none fit. The filtering is manual, repetitive and exhausting long before it pays off — and career changers are exactly the people least able to judge on their own whether their profile fits.
What I built
The AI reads the résumé and extracts role, seniority and skills; three public sources are queried in parallel and every opening comes back with a score, the points in favour and what the profile is missing. The model output is validated against a schema before it reaches the screen — no sign-up, no résumé stored.

Stack

Next.js 15 · TypeScript · Gemini · Zod · Tailwind CSS · Vitest · Vercel

Takeaway →An LLM answer only becomes a product when its shape is guaranteed: schema on the output, validation before rendering — and the score has to explain itself.

gabarito_AI running
Context
An exam notice runs forty pages and turns into months of study — and almost every candidate does that translation by hand, in a spreadsheet that goes stale within a week. The heavy lifting happens before any studying starts, and that is where most people give up.
What I built
The AI reads the whole document — PDF, photo or scanned, through the OCR of the model itself — builds the plan by subject, weighted the way the board actually tests it, and transcribes the exam questions in independent batches, so one failed batch does not take the rest down. Every record is isolated per user in Postgres.

Stack

Next.js 16 · TypeScript · Supabase · PostgreSQL · Gemini · Tailwind v4 · Vercel

Takeaway →A document the user uploads is data, never instruction. Every prompt says so, because native reading also sees the command printed inside the PDF.

Rendimento running
Context
Every bank simulator shows the gross figure, and gross is the one number nobody ever receives. After the regressive tax and the inflation of the period, what is left is something else — and comparing savings, CDB and Treasury bonds means putting all three under the same rule, which a spreadsheet rarely does.
What I built
A pure calculation engine, covered by tests, projects the future value or solves for the contribution a goal requires, always in present-day money. Eleven investments enter the same scenario and are ranked by net return; the app runs entirely in the browser, with no backend and no data collection.

Stack

React 19 · TypeScript · Vite · Zustand · Recharts · Zod · Vitest

Takeaway →Stale data shown as current is worse than no data. If an API drops, each market block falls back to the last good value and labels itself delayed, instead of lying with a fresh face.

Live archive

List synced hourly via the GitHub API. Pinned first, then by push date.

Updated on Sep 27, 2026

Showing 6 of 40 public repositories · data via GitHub API

View all on GitHub