TCF Canada Preparation Platform

Client: Pack Réussir TCF Canada
Period: Apr 2026 - Jul 2026

An online training platform for candidates preparing the TCF Canada French language test, which is required for Canadian immigration applications. It replaces scattered PDFs and video lessons with timed practice sessions that mirror the format of the real test, and gives learners an immediate, measurable read on their level.

An online training platform for candidates preparing the TCF Canada French language test, which is required for Canadian immigration applications. It replaces scattered PDFs and video lessons with timed practice sessions that mirror the format of the real test, and gives learners an immediate, measurable read on their level.

  • Delivered a complete subscription-based learning platform covering the four test sections: listening, reading, speaking and writing.
  • Built a practice library of 80 timed series and 3,120 questions with their audio recordings and document images, plus 2,835 speaking prompts and 340 writing topic sets.
  • Added an automated writing evaluation tool that scores a candidate's text, points out strengths and weaknesses, and returns a corrected version.
  • Set up a subscription model where each plan controls exactly what a learner can reach — number of series, retakes, access to answer explanations, and use of the writing tool.
  • Provided a back office where the team manages all learning content, learner accounts and subscriptions without developer involvement, along with a manager role for partner resellers who follow their own group of learners.

Key Features

  • Timed practice sessions — 39 questions per series, 45 minutes for listening and 60 for reading, with a countdown, a question grid for navigation, and an inline audio player that stops when the learner moves on.
  • Resume and auto-submit — every answer is saved as soon as it is picked, so a learner who closes the browser comes back to the same session with the clock still running; the session submits itself when time runs out.
  • Detailed results — score, success rate, and a question-by-question review showing the learner's answer against the correct one, with written explanations unlocked for the plans that include them.
  • Writing simulator — a 60-minute session covering three tasks, with live word counting against each task's target range, progress indicators per task, an accent shortcut bar, and automatic submission when the timer ends.
  • Automated writing feedback — each task is scored on the 5/7/8-point scale, then consolidated into a score out of 20, an estimated CEFR level (A1–C2) and its matching NCLC band, with positive points, areas to improve, and a rewritten version of the text.
  • Speaking and writing topic library — prompts organised by month and by task type, browsable across years, with a personal favourites list for the speaking prompts.
  • Content and learner administration — the back office creates and edits series, questions (including audio and image attachments), speaking prompts, writing topic sets, subscription plans, FAQ entries, learner accounts and subscriptions, with drag-and-drop reordering of questions and a searchable media library.
  • Account and device control — each plan sets a maximum number of simultaneous sessions; learners see their active devices and can disconnect them all at once.

Technical Focus

  • Symfony 8 on PHP 8.4 with Doctrine ORM 3 and MySQL, structured around a Series → Question → Attempt → Answer model that keeps every answer individually persisted rather than buffered in the browser.
  • All plan-based access rules concentrated in a single Symfony voter — series access, retake quota, explanations, monthly topic window, simulator use — so the same decision applies to the page, the API endpoint and the back office.
  • Scores recomputed server-side from the database at submission time using aggregate queries, never trusted from the client; questions carry level-weighted points, and the estimated CEFR level is derived deterministically from the score rather than taken from the evaluation model's output.
  • Separate authentication firewalls for learners and staff, a three-tier role hierarchy (learner / manager / administrator), invitation-based password setup for managers, and back-office queries scoped so a manager only ever sees their own learners.
  • Media handled through a dedicated library layer over Flysystem: audio files and document images are uploaded once, stored outside the entity tables, and served in generated size variations; console importers ingest the whole content catalogue idempotently, downloading remote assets as they go.
  • Front end built without a SPA — Stimulus controllers for the timers, quiz navigation, word counting and session heartbeat, Turbo for navigation, Tailwind for styling, and AssetMapper with an import map instead of a JavaScript bundler.
  • Resilience around the third-party evaluation API: strict JSON contract, recovery of partially returned responses, field-name normalisation, and a per-task fallback so one failed correction does not lose the rest of the session.

Technologies

PHP 8.4 Symfony 8 MySQL 8 Stimulus Tailwind CSS AssetMapper AI correction API