Product updates
Mubarak is under active development. Here's what we've shipped to the platform, newest first.
Editing a teacher or student now correctly reports a temporary problem instead of wrongly saying the person doesn't exist
Creating a student never mints a sign-in address without first confirming it isn't already taken
A temporary error while loading the student list no longer empties the table and loses the admin's place
Teachers, parents, content, activity and settings in the school console
Stop the roster search leaking a masked personal email
Mask a self-signup student's personal email server-side in the roster and edit responses, showing school-minted addresses in full and labelling masked ones as the student's own
See the details the platform holds for your school
See everything that has been done in your school
See your school's document library and who can read each one
See the parents of your school's students
Issue a teacher a new temporary password
Edit, deactivate and reactivate a teacher
Enrol a teacher and hand over their credentials
A teacher no longer lands on a student screen
Accepting parental consent now lifts only a suspension the consent flow itself caused — a parent's earlier refusal. An account an administrator suspended stays suspended, the consent is still recorded, and the parent is told the account needs an administrator to reinstate it.
A sign-up cannot grant itself staff access or place itself in someone else's school
Declining consent suspends the child's account, as the page has always said it would
The public pages stay readable while a first password change is still outstanding
A multi-word account status now reads as words on the roster instead of showing the underscored database value
A suspension or an unverified account can no longer be cleared from the roster by deactivating and reactivating
Reactivate a student you deactivated by mistake
A deactivated student's password cannot be reset until they are reactivated, instead of issuing one that will not work
Invite a school admin by email from the school's Users tab, or promote a member who already has an account
A school admin locked out by their school's deactivation is told what happened instead of meeting a blank sign-in form
A school admin gets their own app, opening on the student roster, showing only the sections that exist
Enrol a student and receive their sign-in address and temporary password once, plain enough to write down and hand over
Search the roster by name or address and filter by grade and status
Terms and Privacy stay readable while a first password change is still outstanding
Setting a new password is reported honestly even when the follow-up bookkeeping fails
Setting your password again to the one you already have is refused, and a password change must come from the app itself
A student who was given a temporary password cannot use the rest of the app until they have replaced it
A failed roster load reports the failure instead of showing an empty roster
A student must actually set a new password before the prompt stops appearing, and cannot reuse the one they were handed
A student with a temporary password is taken to set a new one before anything else
Enrolment fails loudly rather than issuing an address that does not belong to the school
A student given a new password can no longer skip changing it at next login
A student can no longer skip the password change they are required to make at first login
A deactivated school's users get a clear "access denied" response instead of a generic bad-request error
A database failure can no longer let a deactivated school's users back in
Deactivating a school now denies its students, teachers and school admins on school-scoped API access
Keep the content library's school filter working
Recent activity no longer reads empty while loading
The overview of a school now shows its latest changes straight away instead of an empty panel; you no longer have to open the history tab to see anything
Each school now has a page with overview, people, documents, history and settings tabs. Each tab has its own link you can share, and returning to a tab you have already opened is instant
Adding a person from a school's page opens the existing invite form already filled in with that school
/admin/schools is now a searchable, sortable table of every school with its student, staff and document counts — including schools that have no content yet, which the old screen hid entirely
An overview of a school's students, teachers, documents and how many people were active in the last 7 days — real figures only, with no invented trends
A people tab filtering a school's students, teachers, parents and admins, with a way to hand school-admin access to someone already there
A documents tab showing each document's grade, subject, sharing scope and processing status
A history tab listing every change made to the school and who made it, filterable by the kind of change
A settings tab for editing a school's details, and deactivating or reactivating it from a confirmation that says plainly what that does
The active-in-the-last-7-days figure on a school's page was counted from a capped page of activity, so a busy school could show a number lower than the truth. It is now counted in full
The parents shown for a school are now ordered and stable, so the same school shows the same list every time; when there are too many to show at once the response says so instead of quietly leaving people out
Saving a school with no changes is now rejected rather than recording a change that never happened
A New school button opens a validated form for name, code, country, contact details, type and grades; a code already in use is reported on the field rather than as a failed save
A school's page lists its students, teachers and admins with search and a role filter; parents appear through their verified links to that school's children, since a parent belongs to a family rather than a school
A school's page shows a dated timeline of every change made to it and who made it, filterable by the kind of change
Master admins can make an existing teacher or staff member at a school its school admin, and the change is recorded in the school's history. Someone who is not at that school cannot be promoted into it
A school's page lists the documents attached to it with their grade, subject, sharing scope and processing status
A school's page now shows its student, teacher, staff and document counts plus how many people were active in the last 7 days, and a failed lookup says so instead of quietly showing nothing
Master admins can edit a school's details and deactivate or reactivate it, with each change recorded in the school's history
The admin school list now searches by name, code and city, filters by country and status, sorts, and pages — and shows every school, including ones with no students or documents yet
Master admins can create a school; a duplicate school code is reported on the field instead of failing the request
Creating a teacher/school-admin account now checks the school ID is valid and matches a real school before anything is sent, so invitees are never left with an invitation to an account that gets rolled back
The admin create-user dialog offers the School Admin role, visible to master admins only, so a pilot school can be provisioned without touching the database directly; picking School Admin or Teacher now requires a school before submit, mirroring the API's existing check
Master admins can now create a school-admin account and link it to a school, so a pilot school can be set up end to end; school staff accounts are rejected with a clear message when no school is chosen
Teachers and school admins must always belong to a school, so school-scoped access can never silently widen through an unassigned account
A per-school activity log records every school-scoped change, readable by the platform owner and each school's own admin
Teachers and school admins now see only the students at their own school; platform staff keep full visibility, and students and parents are unaffected
AI tutoring transcripts are never visible to school staff
A school admin can see the parents linked to their own school's students, and always their own school's record
New school-admin account type, the first piece of school-level oversight for the Sep 2026 pilot; no user-facing surface yet
Quick actions now loads its lessons-awaiting-review count in one lightweight query instead of the full lessons queue
New Errors tab on the main chart shows daily app errors and the crash-free session rate from the last 30 days
Remove the recent activity feed from the dashboard and let quick actions fill the freed space
Signing in with Google, or by accepting an invitation, now updates the account's last-active time like a password sign-in already did — so admin activity figures count everyone
A failure to record a sign-in is logged instead of passing silently
Restore the missing weekly-report progress function
A checkpoint correctly answered on the LAST question of a lesson could still show as unfinished if a background reply was mid-flight at the same moment
A practice question answered correctly could occasionally need re-answering if a background reply landed at the same moment
No duplicate question cards after a checkpoint answer advances the lesson past it
"Try again" is withdrawn once the lesson has moved on, so a retry can no longer be graded against a question the student already left behind
A slow background reply can no longer undo a checkpoint's already-recorded progress
After a re-teach, a third wrong answer on the same checkpoint moves the lesson forward and marks the concept to revisit instead of looping back into another detour
If a student chats without answering the on-screen check or practice question, the tutor warmly but firmly steers them back to it
Lesson recaps now explicitly name any concept marked shaky as something to revisit next time
Middleware now logs these expected errors at debug (console-only, never forwarded) and keeps error level for genuine auth faults.
Weekly report runs no longer crash mid-run
The voice waveform now shows on the still-streaming reply bubble too, not only after the tutor's message is fully committed — TTS starts well before that commit, so the waveform previously stayed hidden for most (or all, on short replies) of playback
Pressing Stop mid-reply now silences the tutor's voice immediately instead of only aborting the text stream and letting the tutor keep talking
The tutor now starts speaking its reply the moment the text is ready, instead of waiting on the assessment pass and page-turn logic behind the scenes — the words on screen and the voice reading them now start together
Turns begin composing a reply sooner by running the safety check, session lookup, and language lookup at the same time instead of one after another, and by no longer waiting on a background page-position save before fetching what the tutor needs to answer
The tutor's spoken reply now animates a live waveform on the message bubble being read aloud, matching the Study Terminal viewer
The session settings menu (read aloud, clear chat, restart, end lesson) now sits inside the message box instead of floating beside it
A thinking indicator with pulsing dots shows while the tutor is composing its reply, before any text has streamed in
One error out of a handful of requests reads as a double-digit error rate.
The three background jobs declared concurrency of 40, 20 and 10 against an account plan that allows 5. Inngest validates this at sync time and a sync is all-or-nothing, so the whole app was rejected and no function registered — weekly reports, parent alerts and misconception scans could never run. All three are now 5.
Guided lessons now show their check and practice questions at the right step of the lesson, so students are never left stuck waiting for a question that cannot appear
Reopening a lesson that was parked on a question brings that question straight back up and shows your true place in the lesson
Fixes a rare case where the lesson wouldn't turn the page after certain tutor replies
The session rail now shows a beat-by-beat map (hook, explain, check, practice, recap) for lessons generated from a structured plan, with the current step highlighted and a re-teach badge when the tutor loops back to explain something again; legacy lessons keep today's page track
Page turns and checkpoint questions for these lessons now follow the lesson's plan instead of a page-position guess, so the right question appears at the right moment
The tutor now teaches to a structured lesson plan, checking understanding before moving on and closing the lesson itself once the recap wraps up, instead of leaving that call to the model
The tutor recalls what a student struggled with in earlier sessions and adapts, for every lesson (plan-backed or not)
When a wrong practice answer happens to be the last one in the set, the tutor now moves on with the student instead of stopping to re-explain a question they've already left behind
A checkpoint's first wrong answer (before the re-teach kicks in on a second miss) now correctly signals the student isn't done, instead of looking identical to a correct answer
A checkpoint question failed twice now re-teaches the concept a different way before the student retries, instead of only nudging them on the same question; concept mastery updates from the result
Tutoring conversations now report how much they cost to run, so usage stays visible
Stop Inngest webhook redirecting to the login page
Finishing a quiz now records the topics the student struggled with, so recommendations and study plans can use them. Every submit had been failing to save any of this silently — the score was stored, the topic analysis was not.
The Previous / Submit / Next bar now stays pinned to the bottom of the question panel on phones and tablets instead of scrolling away under a long question. The header shows how many questions are answered, and Submit becomes the main button on the last question.
Signing in as an admin now goes to the admin dashboard instead of the student home; previously only master admins were redirected
Regenerating a lesson now targets the exact book and chapter, never a same-named chapter from another book
Generated checkpoint questions must cite pages inside the chapter, and archived lessons can no longer be published
Token cost tracking covers the new Gemini 3.7/3.5 Flash models
Each ungenerated chapter in the coverage list now has its own Generate button, alongside the bulk generate-all action
Failed lesson-plan edits now show the server's reason instead of failing silently; the editor stays open to retry
New Admin Lessons page shows every textbook chapter, generates a draft lesson per chapter with one click, and previews the lesson plan and its checkpoint questions before publishing
Drafts can be published, unpublished, regenerated, edited, or archived; students only ever see published lessons
Lesson loading now checks published state everywhere, so draft lessons stay invisible until an admin publishes them
Pressing Listen now starts speaking in ~2 seconds instead of 10-15 — audio streams from the voice service as it is generated rather than waiting for whole sections to finish
Medium-length answers no longer wait silently for the full recording before playing
Upgrade the reading voice to Gemini 3.1 with official Serbian support
Saving an agent whose active prompt variant is missing or empty no longer wipes its live prompt. It previously wrote an empty prompt, which would have run AI Hub, the parent coach, misconception clustering and tutoring chat with no persona and no safety rules, silently
An admin save that changes only the model no longer leaves the live prompt disagreeing with the prompt library shown in the Command Center
Token counts for Anthropic answers were recording zero input tokens and undercounting cost about fourfold; the provider splits usage across two updates and only the last was kept
Response timing now starts before the request, so timings are comparable with every other AI surface
Response timing now measures the model call rather than the whole pipeline, matching the other surfaces
Both background jobs accepted any provider from the registry and then called Gemini with it regardless, so a non-Gemini model would have failed at run time. They now check what they can actually run
The AI Hub now reports the true token usage and response cost of each answer, and how long the first word took to arrive. It previously counted network chunks and called them tokens
Populate token usage and cost for study terminal chat
A registry row naming a provider a surface cannot run is now logged as an error and reported, instead of being silently replaced by a hardcoded model with no signal to anyone
Saving an agent now always re-materialises the active prompt variant into the runtime prompt server-side, so the prompt an admin sees marked LIVE is guaranteed to be the one the tutor actually uses
Answers written in Serbian Cyrillic now play as speech — the voice service silently produced no audio for Cyrillic Serbian, so read-aloud appeared completely dead whenever the AI answered in Cyrillic
Listening to long answers back-to-back no longer stops partway with errors — the voice service now waits and retries when it is briefly rate-limited instead of giving up
Opening a book you or a classmate opened recently is much faster - the file now comes from a nearby cache instead of central storage
Reading answers aloud in Serbian now uses the platform's natural voice instead of a robotic or silent browser voice
Books open again on their own after an app update, instead of sitting on a load error until someone refreshes the page
Reprocessing a large textbook no longer hangs and leaves the book missing from search; it now reports progress and fails visibly if the database stalls
Full-screen opening view with the animated Mubarak logo over a twinkling star field that drifts on its own and reacts to your mouse across the whole page
New scroll sections showing tutoring use cases, views for students, parents, and schools, textbook-grounded answers, and a Study Terminal preview
Sign-in and registration screens now share the same starry night-sky background as the landing page
Pages with long unbroken text are split properly instead of being dropped, so no part of a book goes missing from search
Textbook questions, decimal numbers and figure references now survive ingestion intact, so answers can quote the book accurately
The three-dots menu (response language, read replies aloud, clear chat) now sits inside the left edge of the chat message box instead of floating beside it
When a student asks an end-of-lesson exercise question, the tutor now also reads the surrounding lesson pages of the same textbook, so answers come from the official curriculum content instead of general knowledge
Questions that previously matched no textbook content now retry a wider search before answering, instead of silently answering ungrounded
Internal maintenance and diagnostic database functions can no longer be called from user accounts; server-side access is unaffected
Turned off the unused GraphQL API endpoint, closing schema discovery for signed-in users
Charts that plot more than one thing now use a fixed eight-colour palette, checked to stay tellable apart in both light and dark and for colour-blind readers, so your weekly study comparison and session breakdown read as separate colours instead of shades of one
Single-metric visuals keep your chosen accent colour, so progress rings, subject sparklines and the streak trend still feel personalised
Axis labels, gridlines and tooltips follow light and dark mode instead of a fixed white, so chart text no longer disappears in light mode
Give warning its own token instead of reusing gold
New cover — the Mubarak monogram floating over a twinkling night sky that follows your mouse, with sharper marketing copy
New "Answer Machines Give Answers. Mubarak Teaches." section — two AIs get the same question side by side, and only one teaches
The whole public site now matches the app's look — same colors and typography, glass panels, rolling technology logos, and the reactive top navigation
The What's New page now opens for visitors without an account, and outdated standalone pricing/features/contact pages fold into the main page
Sign-in and registration pages restyled to match the new look
Pick your accent colour straight from the sidebar on any page, instead of navigating to Profile or Settings first
The eight accent swatches in the picker were rendering as blank circles and now show their real colours again
A failed load now offers a retry instead of pretending nobody is connected to your account
Cancelling, accepting, or declining now confirms what happened instead of appearing to do nothing
Pending invitations show the right email and dates, and the weekly invite count is hidden when it cannot be loaded
Creating a parent invite now hands you a copyable link to send them yourself — the app previously said an email was on its way and never sent one
An invitation link opened while signed out now loads the invitation instead of reporting it as invalid or expired
Sending a parent invite works again — every attempt used to fail before the invitation was saved
Declining one parent's request no longer declines every other pending request at the same time
Cancelling or declining an invitation now frees you to invite that person again
Name and preference changes now actually save
Profile changes now save
The learning stats panel now shows your real study streak, weekly study time, questions asked, and achievements instead of a fixed fake number for every student; a stat with no real data behind it (rank, average score) is hidden instead of made up
Uploading a new avatar now genuinely saves it; removed a picker option that looked like it saved a choice but never actually did
Fixed the profile page briefly flashing "not found" while it was still loading, or getting stuck loading forever if something went wrong; added a retry action
The "set your grade" prompt now sends you to your profile page instead of a broken settings link
Session-timing data used only for background progress saving no longer forces the whole reading view to redraw every few seconds, keeping scrolling and the AI panel responsive during long study sessions
Chat responses stream in without stutter by updating the display in small batches instead of on every single character
Code blocks in chat load faster by preparing only the languages actually used instead of the full syntax-highlighting library
Failures on the quiz list, a single quiz and quiz generation now return a plain "we couldn't do that" message instead of raw internal error text
The same for AI chat failures
Ending a reading session keeps the pages you actually read instead of resetting the count to zero
Submitting a quiz twice (double click, retried request) scores it once, and the second attempt says it was already submitted
Finishing an already-finished lesson returns the same summary instead of writing a second one
The written recap of a finished lesson is now reliably saved
Progress views refresh right after a session or quiz rather than sometimes showing stale figures
Profile edits are validated, and avatars accept ordinary image files only
Read-aloud uses the platform voice by default
Background study-session saves are checked before they count, so a bad or impossible session can't inflate streaks, study time or what parents see
A session saved when the tab closes is now really stored instead of reporting success and being dropped
Chat messages have a length limit and an image-per-message limit, and the language check is limited to signed-in users
A parent opens the child's learning map only if the child shared their study activity, and quiz-based mastery is hidden unless scores are shared too
Turning a sharing choice on for one parent no longer resets the choices set from the other settings screen, and AI-conversation sharing can finally be granted
Books restricted to a school or country now open only for readers they were shared with, and the wrong-permission message is shown instead of a generic error
Book covers can only be replaced by staff, and only with a real image file
Retrying a failed "start a new chat" send no longer leaves two copies of your message once the retry succeeds
Connection problems now show a retry option instead of leaving your quiz list empty
Quiz generation failures now show the real reason instead of a garbled error message
A quiz that fails to load now offers a retry and a way back to Assessments instead of a dead end
Study Materials now shows a retry option and a proper loading state instead of a misleading "no materials" message
AI Hub now tells you when it couldn't start a new chat, with a way to retry
Lesson session errors now offer a retry and a way back to your lessons instead of a dead end; a failed "end session" now tells you instead of failing silently
Adding, removing, or checking exams now reports failures instead of silently doing nothing
Fixed a rare crash from corrupted saved reading history
The "invite a parent" button no longer shows a wrong invite count when it can't load
Dialogs and toasts now render correctly in light mode instead of an unreadable dark glass panel; extends to sheets, dropdown/select checkmarks, and several hardcoded amber/blue accents across settings, exams, and prerequisite nudges
Assessments page heading now matches the shared page-header style used across the rest of the app
Light mode now has a real elevation ladder — cards and panels sit above a soft grey page instead of dissolving into it
The accent wash and tinted surfaces read clearly in light mode again, where they had faded to almost nothing
Axis lines, gridlines, tick labels, series lines and legend dots are visible again on the admin, student and audit dashboards
Panel and card borders stay hairline-thin instead of hardening into solid bars, and the sidebar focus ring and hover highlight render properly
Restore --sidebar-border, dropped by the CSS-token splice
Study material covers are now illustrated in the subject's colour instead of scanned textbook fronts, and no two books in a subject look alike
Subjects with two words now show proper initials on the cover and in the card footer, so Computer Science reads CS rather than CO
Study material cards now show the book's own cover photo (or a generated subject cover when there isn't one), a short description, and how much of the book is left to read, so a shelf of books is easier to tell apart and more inviting to open
The study terminal's AI panel is reframed as margin notes anchored to the page they reference, with a quote card for selected text and an always-available "Ask about this page" button
On tablets, switching between the document and the AI companion no longer reloads the PDF — both stay ready in the background
Chapter progress now draws as a topic ribbon (gold for done topics, filled for the current one) instead of dropdown selectors; drops the WebGL particle background behind the reading view
Page, zoom, and bookmark controls in the PDF viewer are now always visible at a fixed size instead of expanding on tap
See your average and best quiz scores, quizzes taken this month, and due chapter tests at a glance in one summary strip
A recent-results panel draws your last eight scores as a trend and lists your latest quizzes, right next to the ones still waiting
Generating a quiz is now one row (subject, chapter, topic, generate) instead of a stacked form
A calmer, more focused quiz-taking screen — one context line plus a side progress trail instead of a numbered question grid
Study Materials is now a subject rail + cover-led book grid instead of a flat card/table dump — pick a subject on the left, browse only its books on the right, with search across titles/chapters and a one-tap "Resume reading" strip for the last book studied
Per-book reading progress (percent, pages left) now shows on each book and feeds the subject rail's progress bars, reusing the existing progress endpoint — no new backend
The viewer checks its own image decoders when a book opens and shows a quiet, dismissible line if images may not display, instead of leaving a blank space with no explanation; the text is never affected
Control exactly what each parent can see, right from the relationships page; five per-parent switches (study time, assessment scores, content access, achievements, AI interactions) replace the old detour to a separate privacy screen, with instant feedback per toggle
An incoming parent request now gets the page's one moment of weight at the top, with a clear accept/decline in place, instead of competing with the connected-parent list below it
Month calendar cells now show just the date, an at-a-glance "N due" count, and one status mark (test, quiz completed, or reading) so the grid reads at a glance instead of stacking colored badges
A slim highlighted bar between the summary and the calendar surfaces today's due reviews with a one-tap Start button that jumps straight into the first due topic; quietly shows when the next review is due once today is clear
The day panel is now one prioritized list (due reviews, scheduled tests, exams, results, reading, recaps) instead of six separate sections, and reading/results rows now link straight to the book or the results page
Dashboard, children, and settings pages share one cached children list and no longer double-fetch on load
The alert settings section now shows your linked children (it previously always said none were linked)
The progress page loads its three panels in parallel from the shared cache
Revisiting your map is instant within five minutes
Transcribing your speech begins processing the recording while usage checks run, and read-aloud reuses its connection instead of reconnecting every time
Lessons, invitations, thumbnails, encouragements and more skip a redundant identity round trip on every request
Per-parent privacy pages fetch everything in one step
Children recaps and alert settings respond faster
Opening a book and its details got quicker
Profile, assessments, ai-hub: saves and deletes skip redundant lookups
Recommended chapters are computed from a handful of shared lookups instead of six per book
The map gathers its data in parallel and no longer re-reads what it already fetched
Ending a study session responds immediately — quiz scheduling and progress bookkeeping now happen right after, in the background; reading-progress updates no longer slow page turns
The safety check on your message now runs at the same time as gathering context, so replies begin faster — every message is still fully checked before anything is shown
Tutor turns skip repeated session lookups and start sooner; a first-question race that could briefly show stale session state is fixed
The nightly check gathers parent and child details in batches instead of one lookup at a time per family
The weekly email digest gathers a child's week in two steps instead of eight, only prepares the child it will actually email, and question counts are now exact
Fixed a case where the topic guide or an assessment's chapter list could silently show empty after moving between the viewer and assessments within a few minutes
Every chapter of every book is one cell: gold with your score once a quiz passes 70%, blue rising as you read, a ring on your next stop; click a cell to open the page or start a quiz
"Quiz these next" and "Under 70%" lists pick the chapters worth a quiz
Lessons show as tracks with your position and checkpoints, plus your checkpoint accuracy per session and the tutor's notes
The live session gets a step rail, checkpoint questions inline in the conversation, and the tutor now follows the page you are on
Leaving a lesson no longer ends it — resume where you left off
The two rows of panels stretch to use the whole page on tall screens, and the charts grow with them
The header now shows your next exam and how many days are left, and the first-week checklist ticks off once you add one
Study-time chart scales to heavy days; subject sparklines show your last 12 quizzes
A panel whose data fails to load now shows a retry instead of zeros
The page lays out properly on an iPad in landscape — subjects span the width, streak and due reviews sit side by side
The page now answers how you are doing — quiz scores and study time over the last 30 days, one card per subject, your streak, and the reviews due today — with one-click starts
Fewer numbers on the page, and the ones left are ones you can act on
A line of every quiz you finished against the 70% pass mark, with your best and lowest called out
One bar per day of study time with a hover readout of minutes and sessions
The header says how many reviews are due and how far away your next exam is
A new student sees where to start, a short setup checklist and what the page will show
Each subject shows its quiz-score trend, latest score and chapters done, with one button — review a slipping chapter, quiz a chapter you have read, or continue where you left off
Your streak with the last 30 days at a glance
Reviews due today, each with a button that starts a short quiz on that topic
Answers can be scoped to one of your books, or all of them
Every cited answer shows the book and page it came from, with one-click "Open page", "Quiz me on this" and "Study with a tutor" next steps
A clearer start screen with four starters and your recent conversations; conversation history is searchable and grouped by day
Stop an answer mid-stream, and see a clear message with Retry if something goes wrong
Lesson chat settings (read aloud, restart, end session, clear) moved into a menu beside the message box
Sidebar sits bare on the page halo with a quiet active state, slimmed to 240px
The metro map fills the whole content area and refits when the window resizes
The page stays viewport-height and long chat history scrolls inside its rail
Flat identity card replaces the holographic tilt card
Privacy info boxes, relationships list, schedule calendar and Study Materials covers now match the rest of the app
The child's learning map fills the page instead of a fixed 600px box
The "please rotate" screen on portrait tablets has a solid backdrop again
The whole app now uses the friendlier Nunito typeface instead of Geist
Match the study viewer to the app's shell chrome
Reloading no longer reverts a pre-reskin user's newly chosen accent color back to the old palette; the stale legacy theme id used to re-seed the picker every load and silently overwrite the real choice
Your saved theme preference now actually loads from your account on other devices/browsers again (the API response envelope was never being unwrapped, so the cross-device sync silently did nothing)
The PDF viewer's loading screen and the prerequisite reminder popup now match the rest of the app's calm, flat look
Parent's dashboard, children list, add-child, settings, and per-child progress/map/memories pages now use the flat panel look (no glass blur, no drop shadows, no hover-lift) instead of the old glass cards; loading states show skeleton panels instead of a full-screen spinner
A child's detailed progress view collapses its four separate stat cards (study time, streak, average score, grade) into one bordered strip, and its recent-assessments/recently-unlocked lists into one bordered list with row dividers, instead of stacking individual cards
Learning-progress page's stat, subject, achievement, and goal cards switch from the glass treatment to the flat panel look
The map frame and chapter detail popup use the flat panel chrome; the accent-flow progress lines and station rings are unchanged
Avatar picker, personal-info fields, and profile card drop glass blur/shadow/gradient treatments for flat, theme-reactive surfaces
Removed the unused legacy Theme dropdown from app preferences (it never persisted anywhere real; the appearance picker right below it is the actual theme control)
Parent-connection card switches to the flat panel look
Weekly sessions chart now recolors with the active accent instead of assuming the panel behind it is always white-on-color
Chat, lesson cards, question checks, and the session-complete summary now use the flat panel style, with calmer loading and typing cues
Quiz creation, the assessment list, test-taking, and results now use the flat panel style, with calmer loading placeholders
The calendar and day-detail panel now use the flat panel style, with calmer loading placeholders
The book library and study terminal switch to clean flat panels matching the new look — book cards, document pickers, chapter/topic navigation, and the AI chat panel drop their glass blur, drop shadows, and gradient fills for the flat panel system; the study-terminal "stuck on this page?" nudge loses its heavy shadow too
The student dashboard adopts the new flat look — clean panels, one colored highlight card, no glass or heavy shadows
Every page's content now sits on a clean rounded surface with a subtle color wash behind it, in your chosen accent; sidebar goes flat (no glass, no blur) with an alpha-tinted active nav state
Choose from 8 accent colors and light/dark mode in your profile; the sidebar keeps a quick light/dark switch
Legacy saved themes (e.g. Ocean Breeze) preselect their mapped accent so nobody's saved preference resets
The app switches to a calmer flat design with a light/dark mode and 8 accent colors; saved themes map to the closest accent
Pages and actions no longer re-verify your sign-in with an extra server round trip when it was already verified moments earlier
Your study schedule gathers everything it needs at once instead of one piece at a time
The notification bell fetches your list and unread count together
Achievements, study-terminal, parent-settings: the same load-in-parallel treatment across five more surfaces
Your language choice appears instantly when the page opens instead of waiting for the server
Naming a new conversation no longer reloads the whole conversation list
Parent pages now share the app-wide data cache instead of keeping a separate one
The app no longer re-checks your family connections every 30 seconds in the background — pages share one cached list that refreshes when something actually changes
The Parents list in privacy settings now shows your connected parents (it previously always showed empty)
Accepting or declining an invitation updates both the connection list and your children's activity cards right away
Sending a message kicks off the AI reply faster — the setup work before the reply now runs in parallel instead of one step at a time, and bookkeeping happens after your reply finishes streaming
Mastery and coverage for all your subjects are computed from two lookups total instead of two per subject
The parent-sharing settings page now loads all parents' details at once instead of one parent at a time
Checking pending invitations is now instant when the answer was fetched moments ago, and first-time checks are faster
The children list responds instantly on repeat visits within two minutes
The family connections page and its notifications get their data in a single database query instead of four sequential ones
Every request is checked against usage limits in a single step instead of two, so all pages and actions respond sooner
The nightly topic-analytics refresh now completes — it ran without the database permissions it needed and failed on every run
Stop the chat hanging silently when a question is blocked
Never show a saved reply that failed to save
Report structure lookup failures instead of faking success
Bound every interactive provider call with a timeout
Stop returning raw provider error text to the client
Generic client error body, full detail server-side only
Keep chat working when the agent registry is unavailable
Fail loudly when replacing a document structure
Add viewer error page and a site-wide 404
Dense subjects on the map no longer render unreadable stacked text — once consecutive stops on the same line crowd closer than 30px on screen, every other label is dropped, and they reappear as soon as the student zooms back in; also fixes the map's fit-to-screen zoom occasionally computing a nonsensical negative scale on first paint
A two-finger pinch now zooms the map in and out, wired into the same pan/zoom state as the wheel and +/-/fit buttons, so gestures and the on-screen controls stay in sync; the on-screen zoom buttons remain keyboard-reachable for students who can't use touch gestures
The map canvas is now announced as a group of controls (not one opaque picture), with a hidden usage hint and a full text list of every subject, book, and stop with its coverage and progress — so a screen reader user can survey the whole curriculum without the SVG
Each stop on the learning map is now a real control — reachable by Tab, opens with Enter or Space, and announces its name, coverage, and progress state to screen readers, with a visible focus ring for keyboard users; station cores use a theme color so they stay visible on light themes
The lesson list and study session follow your chosen theme
Opening a lesson shows the lesson and tutor panes shimmering in place instead of blanking the screen
The decorative particle backdrop is switched off on phones so the lesson and tutor get the whole device
Browse lessons by subject and start any lesson in one click, with the chapter, page range, length and grade shown on the card
The lessons list now follows your chosen theme instead of a fixed colour scheme
Switch between the lesson and the tutor with a labelled Lesson / Tutor control on phones and tablets
Keep your place in the lesson and the chat when the session screen updates
The read-aloud toggle, language picker and chat box now take their colours from the theme you picked, instead of being hardcoded white-on-glass that washed out in light themes; the language menu is readable in all 27 themes
A new chat now opens with four plain-language starting prompts ("Explain a topic I'm stuck on", "Quiz me on what I studied this week", and two more) — tapping one starts the conversation, instead of an empty screen with nothing to press
The read-aloud toggle's "playing" glow now actually renders; it pointed at a colour variable that never existed
Holding the microphone no longer cuts out when your finger or cursor slides off the button mid-sentence; recording ends when you let go anywhere, or press Escape
A "Conversations" button in the hub header opens your full chat history in a slide-over panel on phones and tablets, where the list used to be completely hidden below 1024px; picking a chat opens it and closes the panel
The hub now has a proper page heading, and the read-aloud and language controls sit in that header row instead of floating over your messages
The drifting background dots take their colour from the active theme instead of always being white, so they no longer vanish on light themes; on phones the decorative layer is skipped entirely
The page no longer fights the app layout with negative margins, so it sits in the same content frame as every other student page
The reader and the tutor now fade in behind the same calm glass placeholders used everywhere else, instead of spinning rings and blinking "Loading..." text
When a document fails to open you get a clear message and a link back to your study materials
Study suggestions now arrive one at a time instead of two cards appearing on top of each other; the second waits its turn
The study terminal now uses the same sidebar, spacing and scrolling as the rest of the student area, so moving into it no longer feels like a different app
A wide document can no longer stretch the page sideways
The chapter and topic navigation, the page controls and the background all follow your chosen theme instead of staying fixed white
The decorative background is no longer drawn on phones, so the reader gets the full screen and the battery gets a break
Opening the study terminal without a document now shows a clear "No document selected" message with a link to your study materials, instead of silently opening an unrelated document
A document that can't be loaded now says so, instead of claiming nothing was selected
On a phone the reader and the AI tutor each fill the screen, with a Document / Ask AI switcher instead of two squeezed columns
Switching back to Document returns you to the page you were reading
The four summary tiles (Overall Progress, Study Time, Study Streak, Achievements) had invisible icon backgrounds and colourless "Keep it up!" text; they now use your theme's accent colour like the rest of the app
The password box that never actually changed your password is replaced by a "Change password" link to the real email reset flow, and the parent-sharing switches now link to the Privacy page where your choices are really saved
Parent requests, connected parents and pending invitations are now three clear panels that follow your chosen theme
The page's blue/purple gradient headline and background blobs are gone; it now uses the same panels and colours as the rest of the app, so it respects whichever theme you picked
A line of helper text points at the sidebar Theme button instead of a disabled "See Theme Selector in Sidebar" button
Pages and images in scanned textbooks now display instead of appearing blank
Weekly parent reports, parent alert emails and misconception scans now actually run on their schedule — none of them had ever run in production, so no parent had ever received one
A scheduled job that quietly did nothing is no longer recorded as having succeeded
Two endpoints that run scheduled work let unauthorized callers through whenever their security key was missing from the server — one skipped the check entirely, the other could be satisfied by guessing. The key is in fact missing in production, so both were open. They now refuse every request when it is not configured.
The endpoint reporting how many invitations are pending or expired had no authentication at all and answered anyone who asked. It now requires the same authorization as the task it reports on.
Signed-in users can get back to the app from the changelog
Link the child learning map from the child detail page
Admin sidebar drops its two coming-soon dead ends
Student sidebar only links to pages that exist
Remove unused write permissions from the public API role
Quiz answers and their explanations were readable by any student for any published lesson, which let a student see the correct option before answering. Students now receive only the question and its options; answers stay on the server.
Require an account to search textbook content
Stop signed-in users editing school and achievement data
The endpoint that runs scheduled work (parent emails, weekly reports, misconception scans) only checked request signatures when it detected a production environment. It now always checks them, so the protection cannot be silently switched off by how a deployment happens to be configured.
Restore six missing database security patches to the repo
Navigating between pages now shows glass skeleton panels in the content area while the sidebar stays put, instead of a full-screen loader
The frosted segmented-control tab styling duplicated between the dashboard and assessments now lives in a single shared component
The dashboard's KPI summary strip (glass panel, divided 2-up/4-up grid, tabular numerals) is now a reusable component pair
Every page heading now comes from one component — same size, same spacing, actions that wrap on small screens
Panel wraps the glass panel look used across the student app in one reusable component, with a solid variant for dense surfaces
Retire the duplicate dashboard — /parent now redirects to /parent/dashboard
Drop the second body block that fought the halo gradient
Sidebar colors follow the same token convention as all other theme colors, so future edits cannot half-break sidebar styling
Tab active state, touch focus outlines, and chart theme colors work again across all 27 themes
Topic progress and insights can no longer be read for another student, whether through the app or direct data-API calls
The topic detail view no longer lists other students' study sessions for the same topic
Both the standard and streaming chat paths now load prior conversation turns only for the signed-in student
A conversation's saved history can only be read back by the student who owns it, even if someone else guesses the conversation id
The goals card showed a fixed 75% "Complete Mathematics Module" goal for every student; the remaining goals are computed from real activity
The /insights-designs page rendered 1,500 lines of fabricated charts; it had no navigation link but was reachable by URL
Self-registered accounts no longer claim parental consent was given when it never was — the record now reflects the truth, and accounts a parent creates for their child still record real consent
A parent-child link can only become verified through the real invitation flow — it can no longer be forged through the API to gain access to a student's data
Notes the AI tutor keeps about a student (recaps, misconceptions, memories) are now hidden from parents unless the student's AI-activity sharing setting is on
Parents keep read access to their linked children's study history but can no longer create, edit, or delete those records
Encouragement messages and alert subscriptions can now only be created for a child the parent is actually linked to and verified with — not for arbitrary students
The weekly email now honors the student's AI-activity sharing choice — question counts and the AI coach note only appear when the student shares them, with the privacy notice shown instead
The "questions asked" number on a child's card now only appears when the student shares their AI activity; otherwise parents see the same "not shared" treatment as other private metrics
The session-recap feed now only includes children who are actually linked to the requesting parent and who share their AI activity — requesting another student's id returns nothing
Unsubscribe links in weekly emails are now signed, expire, and ask for confirmation before opting out — nobody can unsubscribe someone else, and email scanners can no longer trigger it by accident
Every AI chat surface now screens student messages and AI replies for harmful content, and responds with a friendly bilingual notice when a message can't be helped with
Student messages are treated strictly as questions, so chats can no longer be tricked into ignoring their safety rules
When textbook search is unavailable, answers now arrive without citations instead of citing unrelated pages
Spoken messages are screened the same way as typed ones
Realtime voice conversations are paused during the pilot
The database itself now rejects any attempt by a signed-in user to change their own role or account status
Stop spurious "failed to delete embeddings" error on delete
A "Studied" marker on the calendar and a day-panel section now show the books you read each day, with time spent, so reading shows up alongside reviews, assessments, recaps, and exams; brief open-and-close sessions are filtered out so only real study appears
Register an exam (subject + date) from the Schedule page; it shows on the calendar and in the day panel, and you can remove it
Within two weeks of an exam, your daily plan adds exam-prep chapters for that subject, scaling up as the date nears
The plan card is now "Study plan" with an amber countdown to your next exam
Exam days are marked on the calendar with a graduation-cap icon
Professional White now has a real dark mode — elegant dark surfaces with readable text, instead of light-mode colours showing through under a dark background
Days you studied get a marker, and selecting a day shows a "What you learned" recap beside that day's reviews and assessment scores
A Study Notebook in the sidebar showing a recap of what you covered in each tutoring session
A "recent learning" card on the parent dashboard showing what your children studied recently
Show a daily study plan on the student dashboard
New public /updates page lists shipped features newest-first, generated from git history (no manual curation) and refreshed in the pre-commit hook; linked from the landing nav, footer, and hero beta note. Milestone/internal commit scopes are filtered so public tags stay clean.
Hero notes the invited-beta phase
Clear stuck loading spinner when playback is stopped
Always-on 45° chapter labels on every station (truncated, full title stays in the detail card); on-ramp/lane spacing retuned to fit
Subject pill strip above the map, "42% read · 2/23 mastered" per subject, derived client-side (no API change); ghost-chip styling that tracks the active theme and stays readable across all 27 themes
Tap a pill to focus its subject line; others dim; background tap or a second tap clears
Spread each subject's trunk junction along the trunk by subject order so on-ramps fan out instead of knotting at the far left
Real reading coverage + content-scoped prerequisite graph
Tap a station for a detail card (coverage, mastery, unmet prerequisites) with a deep link into the viewer.
Theme-reactive throughout — lines use the foreground colour (frosted in dark, near-black in light) differentiated by opacity; coverage, mastery and next-stop use theme tokens.
Replace default favicon with Mubarak blue M icons
Derives real subject mastery from the model, replacing the string-parsing attribution.
Show Privacy, Terms & About to logged-out visitors
One-tap parent->child message to an in-app inbox (API + UI)
Redirect non-master admins out of the student UI instead of serving them the student shell; on a failed password login, hint Google-only users to use the Google button.
Guard student/topic-graph and admin/settings routes that returned a 500 with a stack trace on unexpected data / malformed body.
Let admins upload content, not just master admins
Parent-added children seed active so the beta gate doesn't silently lock them out (parent is the trusted actor, matching admin-created users)
Gate OAuth signups + waitlist surfaces for beta approval
Beta-gate read side — flag helper, status endpoint, signup notice
Runtime beta-approval flag + flag-aware email-confirm trigger
Fail loudly if the prod site URL for email links is missing
Block sign-in until the email is confirmed
Provision profiles atomically via a signup trigger
Make profile creation idempotent ahead of provisioning trigger
Drop the content-page gate's upper bound — it starved 50-70% of later-chapter content on partly-curated (Kuwait) books
Stop auto-scheduler creating duplicate chapter tests
Each chunk is labeled by layout role (Claude Sonnet 4.6) and exercise chunks are down-ranked x0.5 at retrieval, so the Socratic tutor and AI Hub prefer explanation over the textbook's own questions/answers. Over-fetch lets a demoted exercise be replaced by the next-best chunk.
Nudge students who get stuck on a page
Clicking a date now lists that day's chapter tests / new assessments in the day panel, each linking to /assessments/{id} to take it
Chapter coverage now credits a page only after the student spends >= 15s of foreground (active) time on it. The per-page timer pauses while the tab is hidden or blurred and resumes on focus, so click-through and background idling no longer inflate coverage -- the proactive chapter-test "studied" trigger can no longer be gamed.
Recommender widget: responsive 2-up grid (ultrawide/iPad-portrait), compact fully-tappable cards, glass scrollbar, tactile hover lift
Simplify pill face to "Page N"; full doc title + page moved to tooltip/aria
Cap displayed sources to the 3 most relevant (after de-dup)
Wider spacing + distinct chips fix mis-clicks where crowded near-identical adjacent pills read as one and navigated to different pages
Persistent dark-halo backdrop on auth layout + landing/morph/error surfaces
Chapter-progress foundation (hybrid coverage + quiz mastery)
Admin UI: agent cards now show per-modality chips + a TTS model line
AI prerequisite analysis (Sonnet 4.6) with review-then-apply
Topic prerequisites, struggle rescue, chunk classifier + realtime/rate-limit hardening
Replace center-band gradients with top-anchored halo backgrounds
Rebuild results and taking pages in the dashboard glass language: real page headers, full-width layout, KPI/score strips, fit-to-viewport with only the main content scrolling, restrained color (neutral + success/destructive) and icons.
Quiet transient SSE drop noise in Sentry
FSRS-lite spaced-repetition scheduling
Cutout-card redesign + dashboard polish
Harden answer scoring (fixes true/false always scoring wrong) and reuse the same comparison in the feedback route so results match the saved score
Language-aware global retrieval floor for Arabic
RAG retrieval audit — chunk-id-grounded probes scored vs baseline
AI Hub renders source citations + click navigates to viewer
Study Materials chat renders source citations + suppresses current-page pills
Include sources in ai-chat JSON response
Emit sources SSE event between fulltext and complete
RAG grounding, streaming dedupe, FK + auth perf on chat path
Header carries Active toggle (+ aria-label) + Save button + slug/kind/ version meta strip, always visible during edit.