La plupart des applications de tâches imposent une heure à chaque tâche, puis enterrent discrètement ce qui n'a pas été fait. Plannari rend l'heure facultative — une tâche peut en porter une, une durée, ou ni l'une ni l'autre — et tout ce qui reste non coché après sa journée devient une dette que vous replanifiez, renvoyez ou abandonnez consciemment, au lieu de simplement disparaître. La navigation, c'est la scène de bureau illustrée ci-dessus : touchez le calendrier, la liste de tâches ou l'ordinateur pour ouvrir l'écran correspondant.
L'heure est facultative, jamais imposée — une tâche peut porter une heure, une durée, ou ni l'une ni l'autre — les tâches à heure fixe restent verrouillées dans l'ordre, les autres se glissent où vous voulez entre elles.
Des dettes plutôt que des tâches qui disparaissent — tout ce qui reste non coché après sa journée devient une dette consultable — à replanifier, renvoyer à sa catégorie, ou supprimer, depuis la vue des dettes ou le calendrier.
Des routines qui s'enchaînent et détectent les conflits — ajouter une routine copie ses étapes dans la journée ; avec une heure de départ, les étapes s'enchaînent selon leur durée, en décalant, superposant ou annulant automatiquement en cas de conflit.
a running log of issues found and fixed during development.
| issue | solution | details |
|---|---|---|
| changelog.txt window showed a separate copy of this table that could silently drift out of sync with the actual document | changelog.txt now reads this table live from the Word document itself, instead of a duplicated copy | Parses word/document.xml directly (PHP's built-in ZipArchive + DOM, no extra package) via a view composer; cached by the file's own mtime, so an edit saved in Word appears on next page load with no manual cache-clear step |
| Resume was hidden behind clicks — closed by default, easy to miss entirely | Added a Windows-style toast notification prompting visitors to download it | Slides in ~7s after load, dismissible ("later"/"x"), download button opens the locale-correct CV; dismissal remembered for the session so it doesn’t re-nag on reload |
| No mobile-friendly layout — the desktop window metaphor didn’t work on phones | Built a separate responsive mobile layout | Bottom tab bar (about / projects / resume / contact), single-column panels, auto-switches under 768px width; not a shrunk desktop, a distinct layout |
| Windows shrank awkwardly at narrower browser widths, becoming cramped and hard to read | Windows now keep their full, fixed size always; they overlap instead of shrinking | Widths no longer scale with viewport (%/vw removed); content that doesn’t fit is reached by scrolling within the window or dragging it into view |
| Desktop showed an unexpected vertical scrollbar | Removed the artificial minimum height; each window’s height is now capped relative to its own position | A window starting further down the page gets proportionally less height budget, so its bottom edge is always clear of the taskbar |
| Scrolling the mouse wheel unexpectedly scrolled the page sideways | Removed canvas scrolling entirely; windows are repositioned by dragging instead | Chrome redirects vertical wheel input into horizontal scroll when only horizontal overflow exists — removing the scroll capability removes the glitch, and matches how a real desktop works (drag, don’t scroll) |
| Taskbar buttons for open windows could silently disappear at narrow widths | Made that row scroll horizontally instead of clipping | Buttons are never lost — just reachable by scrolling the taskbar row — with a thin scrollbar so it’s not invisible |
| Windows and popups could be dragged (or positioned by default) off-screen | Added a small safety margin (12px) on the left, right, and top edges | Applies both to a window’s default position and to dragging; a window simply can’t go further in that direction rather than hanging off the edge |
| Low-contrast numbers (white text) on light pastel card backgrounds | Changed numeral color to dark ink | Was ~2:1 contrast (near-invisible on pink/blue cards), now ~12:1, meeting accessibility standards; fixes both the About page cards and the new Projects feature cards |
| Opening a direct project link didn’t bring the projects window to the front | The projects window now auto-focuses whenever a project route is visited | Applies whether navigating from the homepage, the project list, or a direct project link |
| "Take a break?" popup appeared instantly on page load, before any real activity — contradicting its own "you’ve been scrolling" text | Delayed the popup to only appear after 50 seconds of genuine inactivity | Mouse movement, scrolling, clicks, or typing all reset the 50-second timer — it only shows once the page has actually gone still |
| Closing a window briefly looked like it "sank" behind other windows before disappearing | Fixed a timing bug in the closing animation | Window now fades out smoothly in place instead of dropping behind its siblings first |
| Navigating between project pages reset all window positions and open/closed states — closed windows reopened themselves | Window state (open/closed, position, focus) now persists across navigation for the session | Every project page is a full page reload; window state is saved to session storage and restored each time, so it feels like one continuous desktop rather than resetting on every click |
| Language choice was stored in a server session, so the site needed a live PHP server just to remember which language you picked — ruling out free static hosting | Moved the language into the URL itself (/en, /fr, /ar), so each language is its own independent set of pages | The switcher now links to the same page in the other language instead of hitting a session endpoint. Laravel injects the current locale into every generated link automatically, so no internal link had to be rewritten by hand — and each language exports as its own real HTML files that work with no server at all |
| The contact form posted to a PHP backend that saved to a database — neither of which exists on a static host, so the form would silently break once deployed | Switched the form to Netlify's built-in form handling, with validation moved into the browser | A hidden copy of the form in each page is what registers it with Netlify at deploy time; the desktop window and the mobile panel both submit to it. Field-level validation and error messages now run client-side in all three languages, and a honeypot field catches spam bots |
| The first static export baked into every link, asset, and image path — the site would have loaded nothing at all on the real domain | Added a build step that strips the origin, leaving root-relative paths | Laravel always generates absolute URLs from a configured base address. Rewriting them to root-relative means the same build works on the live domain, on the temporary Netlify address, and on the per-commit preview builds — without the export needing to know where it will be hosted |
Je suis ingénieure logicielle, titulaire d'un Master en Génie Logiciel, et avant d'écrire la moindre ligne de code j'aime vraiment comprendre le problème — ce dont on a besoin, comment les pièces s'articulent — puis avancer par cycles Agile courts plutôt qu'une grosse livraison unique à la fin. Au quotidien ça veut dire Laravel et React côté web, Flutter côté mobile, et des outils d'IA comme Claude Code partout où ils accélèrent vraiment le développement.
Analyse des besoins et conception système — traduire les besoins des parties prenantes en une architecture structurée avant d'écrire la moindre ligne de code.
Expérience du cycle de développement Agile — planification de sprints, itérations et démonstrations, pas seulement la livraison de fonctionnalités.
Rigueur de niveau académique — un Master en Génie Logiciel, complété par une expérience d'enseignement en algorithmique et tests logiciels.
Prise en charge de bout en bout — du recueil des besoins jusqu'au déploiement, sur le web comme sur mobile.
Je suis ingénieure logicielle, titulaire d'un Master en Génie Logiciel, et avant d'écrire la moindre ligne de code j'aime vraiment comprendre le problème — ce dont on a besoin, comment les pièces s'articulent — puis avancer par cycles Agile courts plutôt qu'une grosse livraison unique à la fin. Au quotidien ça veut dire Laravel et React côté web, Flutter côté mobile, et des outils d'IA comme Claude Code partout où ils accélèrent vraiment le développement.
Analyse des besoins et conception système — traduire les besoins des parties prenantes en une architecture structurée avant d'écrire la moindre ligne de code.
Expérience du cycle de développement Agile — planification de sprints, itérations et démonstrations, pas seulement la livraison de fonctionnalités.
Rigueur de niveau académique — un Master en Génie Logiciel, complété par une expérience d'enseignement en algorithmique et tests logiciels.
Prise en charge de bout en bout — du recueil des besoins jusqu'au déploiement, sur le web comme sur mobile.
La plupart des applications de tâches imposent une heure à chaque tâche, puis enterrent discrètement ce qui n'a pas été fait. Plannari rend l'heure facultative — une tâche peut en porter une, une durée, ou ni l'une ni l'autre — et tout ce qui reste non coché après sa journée devient une dette que vous replanifiez, renvoyez ou abandonnez consciemment, au lieu de simplement disparaître. La navigation, c'est la scène de bureau illustrée ci-dessus : touchez le calendrier, la liste de tâches ou l'ordinateur pour ouvrir l'écran correspondant.
L'heure est facultative, jamais imposée — une tâche peut porter une heure, une durée, ou ni l'une ni l'autre — les tâches à heure fixe restent verrouillées dans l'ordre, les autres se glissent où vous voulez entre elles.
Des dettes plutôt que des tâches qui disparaissent — tout ce qui reste non coché après sa journée devient une dette consultable — à replanifier, renvoyer à sa catégorie, ou supprimer, depuis la vue des dettes ou le calendrier.
Des routines qui s'enchaînent et détectent les conflits — ajouter une routine copie ses étapes dans la journée ; avec une heure de départ, les étapes s'enchaînent selon leur durée, en décalant, superposant ou annulant automatiquement en cas de conflit.