<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fabrizio</title>
    <description>The latest articles on DEV Community by Fabrizio (@fabrizio_1c2e9c1e8a75218d).</description>
    <link>https://dev.to/fabrizio_1c2e9c1e8a75218d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4068976%2Facc7aca5-0915-43a9-9a1b-faccfc1624a6.png</url>
      <title>DEV Community: Fabrizio</title>
      <link>https://dev.to/fabrizio_1c2e9c1e8a75218d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabrizio_1c2e9c1e8a75218d"/>
    <language>en</language>
    <item>
      <title>How I Built an Open-Source Electronic School Register in Go + Vue (and Why It Matters)</title>
      <dc:creator>Fabrizio</dc:creator>
      <pubDate>Thu, 10 Sep 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/fabrizio_1c2e9c1e8a75218d/how-i-built-an-open-source-electronic-school-register-in-go-vue-and-why-it-matters-4g38</link>
      <guid>https://dev.to/fabrizio_1c2e9c1e8a75218d/how-i-built-an-open-source-electronic-school-register-in-go-vue-and-why-it-matters-4g38</guid>
      <description>


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — Italian public schools pay thousands of euros every year to private software vendors for proprietary electronic class registers, locking away student data. As a computer science teacher in a public high school, I decided to build a free, open-source alternative in &lt;strong&gt;Go&lt;/strong&gt;, &lt;strong&gt;Vue 3&lt;/strong&gt;, &lt;strong&gt;Kotlin&lt;/strong&gt;, and &lt;strong&gt;Swift&lt;/strong&gt;. Here is the full technical and architectural story behind &lt;strong&gt;il_registro&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;





&lt;h2&gt;
  
  
  The Problem: Italian Schools Are Locked into Proprietary Software
&lt;/h2&gt;

&lt;p&gt;Every Italian school is legally required to operate an &lt;em&gt;electronic class register&lt;/em&gt; (registro elettronico). Attendance, grades, disciplinary notes, circular communications, parent justifications, and official term scrutinies — all of it must flow through a certified digital platform.&lt;/p&gt;

&lt;p&gt;Today, this multi-million euro public sector market is dominated by an oligopoly of proprietary vendors. Every single year, schools sign recurring contracts, pay annual fees with taxpayer money, and hand over the sensitive personal and academic data of millions of underage students to private commercial entities — with virtually zero transparency into their algorithms, databases, or privacy guarantees.&lt;/p&gt;

&lt;p&gt;As a computer science teacher working in a public secondary school, I lived this frustration every day in the classroom: sluggish interfaces, clunky mobile workflows, vendor lock-in, and proprietary software that treats public institutions as captive customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public schools deserve public tools.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;So I set out to build one — open, verifiable, high-performance, and designed directly from real classroom experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  What il_registro Does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;il_registro&lt;/strong&gt; is a full-stack, multi-tenant, self-hostable electronic school register tailored to the legal and pedagogical reality of public education:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📋 &lt;strong&gt;Grades &amp;amp; Evaluation&lt;/strong&gt; — spreadsheet-style keyboard matrix navigation (&lt;code&gt;Tab&lt;/code&gt;/arrows), weighted averages, target grade simulator, and special educational needs (BES/DSA) compensatory measure tags.&lt;/li&gt;
&lt;li&gt;🕐 &lt;strong&gt;Attendance &amp;amp; Lessons&lt;/strong&gt; — daily period register, instant 1-click lesson signature, absence alerts, and parent justification workflows.&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Scrutiny &amp;amp; Board Deliberations&lt;/strong&gt; — final term grade matrices, conduct deliberation, academic credit calculation, and deferred scrutiny (recovery of educational debts).&lt;/li&gt;
&lt;li&gt;📘 &lt;strong&gt;PDP &amp;amp; PEI Management&lt;/strong&gt; — digital drafting and parent countersignature for Personalized Educational Plans for students with learning disabilities and special educational needs.&lt;/li&gt;
&lt;li&gt;✍️ &lt;strong&gt;Digital Signatures (CAD &amp;amp; eIDAS compliant)&lt;/strong&gt; — collegial scrutiny minute signing with biometric verification and OTP (FEA), plus Principal timestamped qualification (FEQ / RFC 3161).&lt;/li&gt;
&lt;li&gt;🏛️ &lt;strong&gt;National Integrations&lt;/strong&gt; — SPID and CIE (Italian Public Digital Identity), plus official MIM (Ministry of Education) &lt;strong&gt;SIDI XML export&lt;/strong&gt; pipelines.&lt;/li&gt;
&lt;li&gt;📡 &lt;strong&gt;Real-time Push&lt;/strong&gt; — instant WebSocket notifications for attendances, grades, and urgent circulars with mandatory read-acknowledgment.&lt;/li&gt;
&lt;li&gt;♿ &lt;strong&gt;Inclusive Accessibility (WCAG 2.2 AA / AgID)&lt;/strong&gt; — built-in Text-to-Speech (TTS), voice dictation (STT), dyslexia tools (OpenDyslexic font, Reading Ruler), ADHD Focus Mode, colorblindness optics, and cloud-synced accessibility profiles.&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;E-Learning Sync&lt;/strong&gt; — automatic two-way synchronization of assignments and marks with Google Classroom and Microsoft Teams.&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Native Mobile Ecosystem&lt;/strong&gt; — 8 native apps (Android in Kotlin Compose, iOS in Swift SwiftUI) isolated for students, parents, teachers, and secretariat staff.&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;11 Languages&lt;/strong&gt; — full multi-language localization across web and mobile (including native RTL for Arabic).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live demo is available at &lt;a href="https://registro-scuola.netlify.app" rel="noopener noreferrer"&gt;registro-scuola.netlify.app&lt;/a&gt; with sample accounts for all school roles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;E-mail&lt;/th&gt;
&lt;th&gt;Password&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;secretary&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:segreteria.prova@scuola.it"&gt;segreteria.prova@scuola.it&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;teacher&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:docente1@scuola.it"&gt;docente1@scuola.it&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parent&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:genitore2a_1@scuola.it"&gt;genitore2a_1@scuola.it&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;student&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:studente2a_1@scuola.it"&gt;studente2a_1@scuola.it&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;password&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Architecture Overview: A Decoupled Monorepo
&lt;/h2&gt;

&lt;p&gt;The codebase is organized as a modular monorepo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;il_registro/
├── registro-backend/    # Go REST API (Gin + PostgreSQL + Redis + WebSockets)
├── registro-frontend/   # Vue 3 + Quasar SPA/PWA (Composition API, Pinia)
├── android/             # Android Multi-Module (Kotlin &amp;amp; Jetpack Compose) [Alpha]
│   ├── student/         # Student native app (:student)
│   ├── parent/          # Parent native app (:parent)
│   ├── teacher/         # Teacher native app (:teacher)
│   └── secretary/       # Secretary native app (:secretary)
├── ios/                 # iOS Native (Swift &amp;amp; SwiftUI) [Alpha]
│   ├── RegistroStudente/ # Integrated Xcode project (4 executable schemes + UI tests)
│   ├── Package.swift    # Swift Package Manager manifest
│   ├── student/         # Student source module
│   ├── parent/          # Parent source module
│   ├── teacher/         # Teacher source module
│   └── secretary/       # Secretary source module
└── docs/                # Comprehensive technical documentation &amp;amp; API specs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Tech Stack — and Why
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Backend: Go + Gin + PostgreSQL + Redis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;registro-backend/
├── cmd/           # Entry points (api-server, seeders, migration runners)
├── internal/      # 60+ domain packages (grades, attendance, auth, scrutiny, sidi…)
├── pkg/           # Cross-cutting primitives (jwt, crypto, websocket, cache)
└── tests/         # Unit, integration, and security RBAC matrix test suites
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Go?&lt;/strong&gt; Several pragmatic reasons dictate Go for school infrastructure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single static binary deployment&lt;/strong&gt;: A Go server compiles into a single executable binary with zero external runtime dependencies. No JVM tuning, no Python virtualenvs, no broken &lt;code&gt;node_modules&lt;/code&gt; in production. A school IT technician on modest hardware can run it with a minimal systemd service or a single Docker container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goroutine-driven real-time concurrency&lt;/strong&gt;: WebSockets for hundreds of simultaneous connected classrooms, background PDF report card generation, and asynchronous ministerial XML packaging run concurrently with minimal memory footprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-term backward compatibility&lt;/strong&gt;: Go's strict backward compatibility promise ensures code written today will compile cleanly a decade from now without breaking API deprecation cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean domain separation without ORM overhead&lt;/strong&gt;: Each domain follows the &lt;strong&gt;Handler → Service → Repository&lt;/strong&gt; pattern. We deliberately avoid bulky ORMs: plain SQL queries with typed parameters ensure total control over query execution plans and database indexes:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Clean architecture: Context propagation, typed SQL, and partial indexes&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Repository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;GetGradeMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subjectID&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="n"&gt;GradeRow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;`
        SELECT g.id, g.student_id, g.grade_value, g.weight, g.date, g.notes,
               COALESCE(g.compensative_measures, '{}'::text[])
        FROM grades g
        WHERE g.class_id = $1 
          AND g.subject_id = $2 
          AND g.deleted_at IS NULL
        ORDER BY g.date ASC;
    `&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subjectID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"get grade matrix: %w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;GradeRow&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="n"&gt;GradeRow&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompensativeMeasures&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security &amp;amp; Observability&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: Dual-token JWT (15-minute access token + automatic rotation on refresh), dedicated IP-bounded rate limiting (5 req/min on auth routes), TOTP MFA for all roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context propagation&lt;/strong&gt;: All service methods accept &lt;code&gt;ctx context.Context&lt;/code&gt;, enabling graceful distributed query cancellation if an HTTP connection drops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Optimization&lt;/strong&gt;: PostgreSQL 16+ partial B-tree indexes (&lt;code&gt;WHERE deleted_at IS NULL&lt;/code&gt;) ensure soft-deleted records never degrade table scans.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Frontend: Vue 3 + Quasar Framework
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;registro-frontend/
├── src/
│   ├── components/   # Modular UI (GradeMatrixGrid, A11yPanel, ReadingRuler…)
│   ├── pages/        # Role-gated route views (Teacher, Student, Parent, Admin)
│   ├── stores/       # Pinia stores with in-memory caching &amp;amp; global error bus
│   ├── composables/  # Shared reactivity (useSpeechToText, useUndoToast, useA11y…)
│   └── i18n/         # Multi-language message catalogs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Vue 3 &amp;amp; Quasar?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gentle learning curve&lt;/strong&gt;: Public education software must welcome contributions from educators and school IT staff who may only code occasionally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive Web App (PWA) first&lt;/strong&gt;: Unreliable school Wi-Fi in classrooms is solved through Service Workers, background caching, and touch-target sizes exceeding 48px.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micro-UX for teachers&lt;/strong&gt;: Features like &lt;strong&gt;Undo Toasts (15-second grace period)&lt;/strong&gt; for accidental grade/absence clicks, automatic local draft saving for lesson logs, and a spreadsheet-like grid that accepts &lt;code&gt;Tab&lt;/code&gt; and arrow keys cut teacher daily administrative overhead in half.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Going Native: 8 Mobile Apps in Kotlin and Swift (Alpha Stage)
&lt;/h3&gt;

&lt;p&gt;While the web app works great on desktop and tablet, mobile usage on smartphones demands dedicated ergonomics: push notifications, native biometrics, offline consultation of student timetables, and role isolation.&lt;/p&gt;

&lt;p&gt;Instead of a single bloated multi-role cross-platform app, we engineered &lt;strong&gt;separate, lightweight native apps per role&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Student App&lt;/strong&gt; — Timetable, grade book, target simulator, daily chronological timeline, homework notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parent App&lt;/strong&gt; — Child monitoring, 1-click absence justification, teacher appointment booking, urgent notice acknowledgment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teacher App&lt;/strong&gt; — 1-click current period class sign, fast grade matrix entry, attendance and disciplinary notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secretary App&lt;/strong&gt; — Staff directories, class scheduling, MIM SIDI exports, urgent circular publishing.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    Go REST &amp;amp; WebSocket API                  │
└──────────────┬───────────────────────────────┬──────────────┘
               │                               │
 ┌─────────────▼───────────────┐ ┌─────────────▼──────────────┐
 │    Android Multi-Module     │ │       iOS Native Suite     │
 │    (Kotlin + Compose M3)    │ │       (Swift + SwiftUI)    │
 ├─────────────────────────────┤ ├────────────────────────────┤
 │ • :student   • :parent      │ │ • RegistroStudente         │
 │ • :teacher   • :secretary   │ │ • RegistroDocente          │
 │                             │ │ • RegistroGenitore         │
 │ • BiometricPrompt           │ │ • RegistroSegreteria       │
 │ • OfflineCacheManager       │ │                            │
 │ • 11 Languages (values-*)   │ │ • LocalAuthentication (FID)│
 │ • Zero Mock / Real API      │ │ • URLSession async/await   │
 └─────────────────────────────┘ │ • 11 Languages (*.lproj)   │
                                 │ • Xcode Schemes + SPM      │
                                 └────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Mobile Engineering Decisions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Mock Data&lt;/strong&gt;: No fake tokens or dummy login screens. Both Android and iOS clients authenticate directly against the Go backend (&lt;code&gt;Http*ApiService&lt;/code&gt;), store encrypted JWT tokens, and interact with the live PostgreSQL database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Biometrics&lt;/strong&gt;: Instant fingerprint / Face ID unlock (&lt;code&gt;BiometricPrompt&lt;/code&gt; on Android, &lt;code&gt;LocalAuthentication&lt;/code&gt; on iOS).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;11 Fully Localized Languages&lt;/strong&gt;: Italian, English, German, French, Spanish, Romanian, Albanese, Ukrainian, Russian, Chinese, and Arabic (with complete Right-To-Left layout support).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling &amp;amp; CI&lt;/strong&gt;: Gradle multi-module CLI on Android; unified Xcode project (&lt;code&gt;RegistroStudente.xcodeproj&lt;/code&gt;) with 4 distinct executable targets alongside headless Swift Package Manager (&lt;code&gt;Package.swift&lt;/code&gt;) testing for iOS.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Honest Developer Disclosure&lt;/strong&gt;: The mobile apps are currently in &lt;strong&gt;ALPHA&lt;/strong&gt;. They are under active development, experimental, and not yet feature-complete compared to the web application.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Hard Parts (Real Lessons Learned)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Legal &amp;amp; Cryptographic Compliance: Digital Signatures (CAD &amp;amp; eIDAS)
&lt;/h3&gt;

&lt;p&gt;In Italy, school scrutiny records have legal value in court. Teachers cannot just check a box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We implemented &lt;strong&gt;FEA (Firma Elettronica Avanzata)&lt;/strong&gt; for collegial minutes signing, requiring two-factor authentication (Biometrics / OTP) with cryptographic proof attached to the PDF (&lt;code&gt;internal/feq&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;For the School Principal, we integrated &lt;strong&gt;FEQ (Firma Elettronica Qualificata)&lt;/strong&gt; using RFC 3161 cryptographic timestamps to guarantee legal enforceability and long-term legal preservation (&lt;em&gt;conservazione sostitutiva a norma CAD&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Ministerial Bureaucracy in Code: SIDI XML Integration
&lt;/h3&gt;

&lt;p&gt;The Italian Ministry of Education (MIM) requires periodic XML data dumps formatted against strict XSD schemas. Writing custom XML builders that validate student registries, validate tax codes (&lt;em&gt;codici fiscali&lt;/em&gt;), check academic records against ministerial dictionaries, and package compressed bundles with real-time error reporting was an unglamorous but essential engineering feat.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Digital Inclusion: Full Accessibility Suite (AgID / WCAG 2.2)
&lt;/h3&gt;

&lt;p&gt;Public school tools cannot leave any student or teacher behind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speech-to-Text (STT) &amp;amp; Text-to-Speech (TTS)&lt;/strong&gt;: Teachers can dictate lesson logs via speech recognition (&lt;code&gt;Alt + D&lt;/code&gt;), while students with visual impairments or reading difficulties can listen to announcements narrated aloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading Ruler (&lt;code&gt;ReadingRuler.vue&lt;/code&gt;)&lt;/strong&gt;: An interactive high-contrast horizontal focus band that follows the cursor or keyboard shortcuts (&lt;code&gt;Alt + ↑/↓&lt;/code&gt;) to assist readers with dyslexia and ADHD.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Device A11y Cloud Sync&lt;/strong&gt;: Dyslexia font preferences, contrast modes, and spacing adjustments are synchronized to the user's database profile so their assistive configuration follows them across devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Official AgID Feedback Flow&lt;/strong&gt;: A complete AgID-compliant digital barrier reporting system that auto-generates tracking protocol numbers (&lt;code&gt;A11Y-YYYY-MMDD-XXXX&lt;/code&gt;) and routes reports directly to the digital transition manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. High-Stakes Scrutiny Algorithms &amp;amp; Zero Race Conditions
&lt;/h3&gt;

&lt;p&gt;During term scrutinies, multiple teachers enter proposals simultaneously. We eliminated concurrency issues and race conditions using row-level locking (&lt;code&gt;SELECT ... FOR UPDATE&lt;/code&gt;), atomic slot booking counters, and batch metric calculations (&lt;code&gt;GetStatsBatch&lt;/code&gt;) that avoid N+1 query bottlenecks.&lt;/p&gt;




&lt;h2&gt;
  
  
  License &amp;amp; Philosophy: Why PolyForm Noncommercial?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;il_registro&lt;/strong&gt; is licensed under the &lt;strong&gt;&lt;a href="https://github.com/kimiko88/il_registro/blob/main/LICENSE" rel="noopener noreferrer"&gt;PolyForm Noncommercial License 1.0.0&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This license choice is deliberate and fundamental to the project's civic mission:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;100% Free and Unrestricted for Public Entities&lt;/strong&gt;: Any public school, municipality, state university, or public education ministry can self-host, inspect, modify, and run the software without ever paying a single cent.&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Protection from Commercial Exploitation&lt;/strong&gt;: Private for-profit software vendors cannot repackage the code, rebrand it, and sell it back to schools under expensive proprietary subscriptions.&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Unified License&lt;/strong&gt;: Both the web platform and the entire native mobile suite (Android and iOS) share the exact same open noncommercial license.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Public education deserves public infrastructure."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Project Status &amp;amp; Roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Application (Go Backend + Vue 3 Frontend)&lt;/strong&gt;: &lt;strong&gt;Working Beta&lt;/strong&gt;. Feature-complete, tested with automated test suites (over 950 frontend unit tests, 100% Go package coverage, and full school year lifecycle simulations), and live on the Netlify demo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Mobile Apps (Android &amp;amp; iOS)&lt;/strong&gt;: &lt;strong&gt;Fase Alpha&lt;/strong&gt;. Real API connectivity and 11-language UI are working; currently expanding module parity and refining test automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next Milestones&lt;/strong&gt;:

&lt;ol&gt;
&lt;li&gt;Promote the product to raise awareness of it with the Italian Ministry of Education and Merit.&lt;/li&gt;
&lt;li&gt;Continuous hardening of the native mobile applications towards beta.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It &amp;amp; Get Involved
&lt;/h2&gt;

&lt;p&gt;If you are a Go developer, a Vue/mobile developer, an open-source enthusiast, or an educator frustrated with the status quo of educational technology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://registro-scuola.netlify.app" rel="noopener noreferrer"&gt;registro-scuola.netlify.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub Repo&lt;/strong&gt;: &lt;a href="https://github.com/kimiko88/il_registro" rel="noopener noreferrer"&gt;github.com/kimiko88/il_registro&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Discord Community&lt;/strong&gt;: &lt;a href="https://discord.gg/Qh5XjQxwb" rel="noopener noreferrer"&gt;discord.gg/Qh5XjQxwb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://github.com/kimiko88/il_registro/tree/main/docs" rel="noopener noreferrer"&gt;Full Setup &amp;amp; Architecture Guides&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to star the repo, open an issue, or join our discussions. Let's return educational data to where it belongs: in public hands.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What does the digital infrastructure of schools look like in your country? Let's discuss in the comments below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>vue</category>
      <category>opensource</category>
      <category>education</category>
    </item>
  </channel>
</rss>
