Tramo
An open source assistant that compares the analytic program of a passed course with the program of the course a student wants recognized, and drafts an equivalency report for the reviewing professor. Gemma 4, an open weights model running on the same computer through Ollama, extracts the topics of both programs, assesses every destination topic with evidence and explains each decision, while plain code computes the coverage and applies the 50 percent rule of the regulation. The professor can overrule any topic before signing, and no document ever leaves the machine. Submitted to the Hacktoberfest Open Source AI Challenge on DEV, where the full story of the project is told.

Metrics
- Model
- Gemma 4
- Documents sent to the internet
- 0
- Time per analysis
- ~1,5 min
- Automated tests
- 119
- Equivalency rule
- 50% art. 87
- Challenge
- Hacktoberfest DEV 2026
The problem
When a student changes careers or universities, getting the courses they already passed recognized can take months. A professor has to read two long analytic programs side by side, decide topic by topic which content is already covered, compare the result with the percentage the regulation requires and write down which topics remain. It's repetitive work, hard to audit afterwards, and it delays students who have already studied that content.
The solution
Tramo takes both programs as text, PDF or Word and analyzes them in four stages. Gemma 4 extracts the topics of each program through structured outputs validated by a schema, assesses every destination topic against the whole origin program citing up to five topics as evidence, and drafts a recommendation from facts the code has already computed. Coverage and the 50 percent rule are resolved in Python with tests, so no text can change the verdict. Progress streams live to the browser, the professor can overrule any status and the numbers are recalculated on the spot. Everything runs locally, with no keys or external services.
Technical stack
- Frontend
- HTML · CSS · JavaScript · ES Modules
- Backend
- Python · FastAPI · Pydantic · Ollama · Gemma 4
Challenges
Discovering that with thinking mode on the model ignored the JSON schema and returned free text, and turning it off to recover structured outputs, which also cut the analysis from five and a half minutes to one and a half
Replacing a first rule based version that ended up proposing the names of the professors and the weekly hours as topics to retake, with model extraction and a visible fallback when the answer doesn't validate
Accepting that the same pair of programs gave coverage between 24 and 32 percent across runs, and designing the report so every topic shows its reasoning and the professor can correct it
Treating every file as hostile, rejecting PDFs with scripts or attachments and Word documents with macros, manipulated paths or abnormal expanded size, and warning in the report when a text tries to instruct the model
Streaming the actual progress of the analysis to the browser with newline delimited JSON events, so the percentage on screen reflects completed work and not a timer
Learnings
Letting the model propose while code decides is the rule that makes a tool assisting administrative decisions trustworthy
A structured output is only useful when it's validated, every topic must be assessed once and every cited source has to exist
Running an open weights model locally turns privacy into a property of the architecture instead of a promise
Measuring before optimizing saves days, a simple benchmark showed the speed problem came from a single model option
In tools that affect people, explaining the limits and who decides is as much part of the product as the features