ExamForge

Un programma che legge i materiali di un corso (PDF, markdown, testo) e genera domande d'esame originali, con soluzione e teoria. È un progetto personale e presto sarà open source.

Perché l'ho fatto

Per prepararsi a un esame universitario servono domande nuove, costruite sul proprio materiale e non su banche di quiz generiche. Il primo a usarlo sono stato io, per un esame di statistica. Non ho notizie di altri utenti.

È nato come programma da riga di comando e poi è cresciuto in tre parti: un'app web, un'app desktop con lo stesso frontend e alcuni strumenti per lo studio personale.

Indice degli argomenti ricavato dai materiali del corso (dati di prova).

Come funziona

Il programma legge i file del corso in due passaggi: una chiamata a un modello AI per ogni file per estrarre gli argomenti, poi un'unione che elimina i doppioni. Da quell'indice genera l'esame con il numero di domande, la difficoltà e gli argomenti scelti. Ogni domanda viene controllata dall'AI e rigenerata se incoerente. Le formule sono rese con KaTeX.

Per i modelli si può usare un servizio esterno (OpenRouter) oppure, sul desktop, gli strumenti da riga di comando di Claude o Codex già installati, senza bisogno di una chiave.

Alcune schermate

Scelte tecniche

  • Backend in Rust (Axum, sqlx) con PostgreSQL; frontend React e TypeScript condiviso tra web e desktop (Tauri).
  • Accesso con hash delle password (Argon2), token di breve durata con rinnovo, limiti di richieste per indirizzo e verifica dell'email. Il piano gratuito è limitato dal server.
  • Le formule tra dollari vengono messe da parte prima del markdown e riscritte con KaTeX dopo, perché altrimenti il markdown le rovina.
  • Il ciclo di generazione delle domande è scritto due volte, per web e desktop: l'ho lasciato così per ora.

Strumenti per lo studio

Nello stesso repository ci sono tre strumenti nati dall'uso personale. Il primo trasforma slide e appunti in pagine di studio in HTML con formule, schemi, quiz e trappole, con PDF per Kindle, tablet e A4 ed EPUB. Il secondo è una pagina vocale: il telefono ascolta e legge, mentre la risposta viene generata sul server di casa. Il terzo produce audio-lezioni con una sintesi della mia voce, da ascoltare correndo.

Limiti onesti

Gira sul mio server di casa e non ha ancora un servizio pubblico né una demo. Mancano la correzione delle risposte scritte, la difficoltà adattiva e un'interfaccia per più utenti che collaborano. Il codice di web e desktop non ha test automatici: lo controllo con la compilazione e con l'uso. Sono circa 72 commit, 5.900 righe di Rust e 10.200 tra TypeScript e CSS; ho lavorato da solo, con Claude Code.

Stack: Rust (Axum, sqlx, Tauri), PostgreSQL, React, Vite, TypeScript, KaTeX, Docker, Nginx, Node.js.