Henrique Poltronieri
All work

2026
In development

Mentorly

A study platform where a Flutter client talks to a Flask REST API — accounts, quizzes, and the performance history behind them.

RoleBackend and data model

Year2026

SourcePrivate repository

Overview

Mentorly is a learning app split in two halves: a Flutter client that people actually touch, and a Flask API that owns everything else. Signing in, answering a quiz, and looking at your own progress are three requests to the same service, backed by one relational database.

Problem

Quiz apps are easy to build badly. If each screen keeps its own state, a student's answers, their score, and their history stop agreeing with each other. The interesting requirement was not the quiz — it was making sure that an answer submitted once shows up correctly in every place that reads it later.

Solution

The client never touches the rules. It sends a request and renders what comes back. The API validates the payload, checks who is asking, writes the attempt, and derives the performance numbers from the stored attempts rather than from anything the client sends.

My role

I designed the database, wrote the API endpoints, and defined the JSON contract the Flutter client codes against. On the client side I built the screens that consume it.

Architecture

Client Flutter application HTTPS · JSON
API Flask (Python) REST endpoints
Logic Auth, quiz rules, scoring server side only
Storage MySQL users, quizzes, attempts

Technologies

  • LanguagePython
  • FrameworkFlask
  • DatabaseMySQL
  • ClientFlutter / Dart
  • BoundaryREST · JSON

Challenges

Keeping an attempt, its score, and the student's history consistent when they are written in the same request.

Deciding what the API returns: enough for the client to render a screen, without shipping the answer key along with the question.

Handling authentication in a mobile client where the request may be retried on a bad connection.

What I learned

A feature is a data lifecycle, not a screen. Once I started designing the tables and the response shape first, the client work got noticeably shorter — most of the screens turned out to be a direct rendering of something the API already knew how to say.

Next