Changelog
Every feature, improvement, and fix in one place.
Tool catalog alignment, memory updates stop consuming credits, audio explain TTS fixed, locked tool contrast improved, audio file upload support added, resizable dashboard sidebar, support page, and certificates page hidden for relaunch.
Audio Explain TTS now works correctly
The text-to-speech engine now recognizes Audio Explain as a valid tool, so spoken explanations play reliably and credit usage is tracked. TTS fallback behavior is also more debuggable.
Memory updates no longer consume monthly credits
Background user memory refreshes (which run automatically after conversations) were incorrectly counting against monthly credit limits. They are now excluded from credit consumption while still recording for internal metrics.
Credits Over Time chart no longer glitches on double-click
Removed a fragile mouse-event handler that could corrupt the interactive chart state when clicking quickly. The chart containers remain non-selectable via CSS only.
Locked tool cards are now readable
Cards for tools you haven't unlocked no longer apply a broad opacity dim that made text unreadable. The lock overlay is clearer, the upgrade button is more visible, and the locked state is communicated through structure, not just color.
Plan feature counts now match the actual tool catalog
Pricing page feature lists and AI chat context now show accurate tool counts: 6 tools for Basic, 8 for Normal, and 10 for Pro. The marketing tool list excludes internal-only surfaces.
Upload audio files (MP3, M4A, WAV, OGG) for transcription
You can now drop or browse audio-only files into any tool chat or AI Chat. They are transcribed via Whisper and added to the message context, just like video uploads, without requiring a video frame.
Resizable dashboard sidebar
The left navigation sidebar now supports drag-to-resize and keyboard arrow-key resizing (with Shift for larger steps). Your preferred width is saved per-device in localStorage. Collapsed mode still available via the toggle button.
Support page
A new Support page is available from the dashboard sidebar. It includes direct email contact, a bug report link, and links to self-help resources like AI Chat, Pricing, and the Changelog.
Certificates page hidden during relaunch
The Certificates nav item and dashboard page have been temporarily removed while we redesign the certification experience. Previously earned certificates remain safe in the database. Public certificate verification URLs are unaffected.
Repository paths shortened for reliable hosting clones by dropping dev-only folders from Git history.
Longest paths in Git are now well under platform limits
Agent skill trees, internal docs, brainstorm exports, and related folders—which included the longest file paths—were removed from the entire commit history. Only paths required for the app (src, supabase, etc.) remain tracked. Re-clone or pull after this push; keep those materials locally if you need them.
Hosting can clone the repo again after removing stale branches that still carried old node_modules objects.
Git clone no longer pulls dependency trees from abandoned branches
main had already been scrubbed, but other remote branches still pointed at commits with checked-in node_modules. A full clone fetched those objects and could fail with a filename or unpack error. Stale branches were deleted so only main remains; open new branches from main for future work.
Deploys clone reliably again after trimming historical paths from Git.
Hosting can clone the repository without unpack errors
Large dependency folders and unused nested-repo paths were removed from the entire Git history, not only the latest snapshot. That keeps filenames and trees within platform limits so Vercel and other services can check out main normally.
AI Chat scrolls correctly on phones, video vision supports MP4 and WebM uploads, the owl tour is retired, and deploys clone faster without vendored dependencies.
Dashboard and AI Chat respect the viewport on mobile
The dashboard shell now uses the dynamic viewport height at every breakpoint with overflow contained, so the conversation column gets a real scroll area and the composer stays reachable instead of clipping the last messages.
Upload MP4 or WebM for vision alongside video links
Choosing or dropping a short video file captures a representative frame in the browser and sends it with your message so OpenRouter vision can run. A 60 MB cap applies to keep decoding reliable; transcripts are still driven by YouTube links in chat.
Video vision routing recognizes more message shapes
OpenRouter is used when thumbnails or frames are present with transcripts, vision-only copy, uploaded video labels, frame-only fallbacks, or YouTube URLs in the text. Stream responses include optional headers so you can confirm which provider answered.
Corner owl spotlight tour removed
The bottom-right mascot and multi-step driver tour are gone for a quieter dashboard; first-run setup and tool flows are unchanged.
Smaller Git footprint for hosting
Root and remotion dependency folders are no longer tracked in the repository, which avoids huge clones and unpack errors on platforms like Vercel. Run npm install in remotion locally when editing motion projects.
Video questions can use OpenRouter vision on thumbnails; AI Chat gets a resizable history column; analytics and maintenance flows are clearer.
YouTube and video URLs can run through OpenRouter vision with the transcript
When you paste a supported video link, we attach the fetched thumbnail with your transcript for that turn and call OpenRouter using the configured vision model (default qwen/qwen3-vl-8b-instruct). Add OPENROUTER_API_KEY to your deployment; OPENROUTER_VIDEO_VISION_MODEL is optional and documented in .env.example.
AI Chat sidebar width is draggable and remembered
Drag the handle between the chat list and the conversation to resize the history column. The width is stored locally, clamped on narrow viewports, and driven by a CSS variable so layout stays stable.
Analytics credit charts focus on real study activity
Background memory refresh usage is excluded from tool usage totals. Credit events load from a single year-long query to power a daily activity view and a ninety-day per-day series for the main chart.
Maintenance overlays steer you to AI tools and add an explicit back control
Certificates and Team maintenance screens now point their primary action at Explore AI tools. Practice Exercises passes a back target to the overlay, and the overlay header includes a configurable back link for leaving locked areas.
Browser read-aloud handles voices and overlapping playback more reliably
Speech synthesis cancels stale playback before starting a new utterance and picks an English voice after the browser finishes loading its voice list.
Dashboard sidebar shortens the primary link list
The Projects shortcut is removed from the main dashboard navigation to reduce noise; other paths to projects are unchanged.
Internal maintainer notes
Agent skill documentation for the repo was expanded for contributors.
Chat composer now sticks firmly to the bottom of the conversation panel and is never cut off.
Chat composer no longer overlaps or cuts off message content
Removed the intermediate wrapper div for full-bleed routes in the dashboard shell so the chat shell is a direct flex child and receives a definite height from the flex chain. The composer's absolute bottom-0 positioning now resolves correctly every time.
Chat scroll area reaches the composer on all screen sizes
Replaced height: 100% with align-self: stretch on ai-chat-main so it stretches to the shell's cross-axis without depending on percentage height propagation, which could silently fail in some browsers.
AI Chat and tool chats fill the dashboard main panel edge-to-edge without black gutters from a mismatched viewport height.
Chat shell height follows the dashboard instead of forcing 100dvh
The chat layout now uses flex fill and min-height zero inside the dashboard so it does not overflow the shell, scroll the wrong layer, or leave empty bands on the right or bottom.
Full-bleed dashboard routes use a dedicated overflow mode
AI Chat and individual tool pages keep scrolling inside the conversation column while the surrounding dashboard stays fixed, which improves consistency on large monitors.
Uploaded images and other attachments appear above your message in AI Chat and tool chats, with chips for files, videos, links, and saved plans.
See images and attachment chips above your sent message
When you attach a picture and ask about it, the preview shows above the bubble; PDFs and similar files show a labeled chip, as do video links, web pages, and saved roadmaps when they are part of the same send.
AI Chat sends and saves attachment metadata with each turn
Context chip labels persist in saved chats (not full image bytes, to keep storage small); regenerate from a prior turn still forwards vision images when present.
Marketing and legal pages keep a fixed top bar while scrolling; the dashboard uses an in-flow navbar, and Privacy and Terms add top spacing so titles clear the bar.
Navbar is fixed on marketing routes only
On Home, pricing, and similar pages the bar stays visible while you scroll; inside the dashboard it sits in normal layout flow so it aligns with the app shell.
Privacy and Terms clear the fixed marketing header
Both legal pages add top padding so the heading is not hidden under the navbar when you open them from marketing.
Loading labels during AI replies use a smoother gold-highlight shimmer and the same dots-plus-text pattern across AI Chat, every tool, and roadmap streaming.
Richer text shimmer for Thinking and Generating states
The gradient sweep now uses theme colors with a brighter peak and smoother timing; reduced-motion users still get a gentle opacity pulse instead of a moving gradient.
Consistent thinking affordance on all assistant surfaces
A shared status block pairs the bouncing dots with the shimmer label in AI Chat, tool chats (including flashcards and exam streaming), video handoffs, and roadmap generation.
The dashboard no longer shows the Next best action banner; the overview status line is simplified accordingly.
Removed the Next best action card from the dashboard
The accent banner that suggested onboarding, first tools, upgrades, or generic next steps is gone so the overview stays calmer. First-run setup and quick tools are unchanged.
First-run setup is now a lightweight card on the dashboard instead of a fullscreen wizard, so you can explore while you personalize.
Inline setup replaces the five-step onboarding overlay
New accounts see an optional card at the top of the dashboard for display name, learning goal, and experience, with one primary action into a recommended tool or Skip to dismiss without blocking the page.
Next best action matches the new flow
The dashboard hint now points to the setup card and clarifies that the mascot tour stays optional.
Dashboard polish: billing layout, centered chat composer, tool headers, Project Ideas grid, and a leaner AI Tools hub.
AI tool pages keep the back control and title in the main column
The floating header and bottom composer are anchored inside the chat main region so they no longer sit over the global sidebar.
Chat composer aligns with the message column
The input strip uses the same horizontal gutter as the scroll area and flex centering so the pill and credits line line up with content above.
Billing uses a compact, centered pricing layout
The dashboard billing view uses tighter spacing and vertical centering on large screens so plans and actions fit without excessive scrolling.
Project Ideas shows three columns on large screens
Language cards use a wider content area and a three-column grid on desktop while staying responsive on smaller devices.
AI Tools hub and Practice Exams empty state simplified
Removed the redundant tools grid heading and the preset topic chip grid on Practice Exams so the hub stays cleaner.
Marketing and dashboard layouts tuned for phones, tablets, common laptop sizes, and ultrawide monitors, with safer horizontal overflow handling.
Breakpoints and spacing from small phones to ultrawide
Tailwind now includes extra-small and very large screens so typography, gutters, and the dashboard shell scale smoothly from narrow portrait widths through 21:9 displays.
Hero, navbar, and pricing sections reflow more predictably
Landing sections use fluid headings, tighter padding on the smallest widths, and card grids that stack on mobile and breathe on wide screens.
Horizontal overflow clipped on the main document
The root layout and several marketing blocks use min-width and overflow clipping so stray wide content does not cause sideways scrolling.
Responsive layout for AI Chat and all AI tool pages: no overlap with the composer, stable scroll, and better behavior on small screens.
Chat and tool pages reflow across screen sizes
Introduced a shared flex-based shell with clamp-based padding so the bottom composer stays centered up to 960px wide without covering recent conversations or message content.
Empty states and subject shortcuts adapt to mobile
Empty views use gentler vertical centering, and practice exam subject shortcuts use a two-column grid on larger screens and one column on phones.
UI/UX enhancements: Navbar floating design, pricing card hover fixes, and scrolling polish in chat tools.
Floating modern Navbar
Updated the navigation bar to use a modern floating, pill-shaped design with improved background blur opacity.
Bounce scrolling prevented in AI Chat and Tools
Added layout constraints to prevent accidental bounce scrolling and pull-to-refresh on the hero header in conversational tools.
Pricing hover effects
Corrected the popular pricing tier to properly scale on hover instead of applying a static magnification.
Hero floating animations
Optimized the floating animations on the hero section cards to improve performance and battery life.
Security and UX audit: admin auth hardening, Mermaid SVG sanitization, and dashboard polish.
Admin usage API now requires authorization
The admin-only usage stats endpoint now verifies authentication and admin permissions before returning data.
Admin UI layout guard
Added a server-side gate to the admin section that redirects non-admin users before any page content is rendered.
Mermaid diagram output is now sanitized
Applied SVG sanitization to Mermaid-generated diagrams to ensure safety against potential XSS vectors in assistant output.
Metric cards no longer show misleading hover
Removed interactive hover transforms from dashboard overview metrics that aren't clickable, aligning the UI with expected behavior.
Footer copyright symbol corrected
Updated the site footer to use the proper © symbol instead of plain text characters.
Fixed floating chat composer overlap on AI chat and tool pages.
Chat composer no longer covers recent conversations
AI Chat and tool pages now keep bottom scroll space reserved for the floating composer, so empty-state history and generated content stay visible above the input bar.
Enhanced chat streaming UX with visible loading indicators, shimmer animations, and a blinking typing cursor.
Chat loading state now shows 'Thinking...' label
The thinking indicator during AI response generation now includes a visible 'Thinking...' text label alongside the animated dots, so users can clearly tell the AI is working.
Streaming bubble gets shimmer animation and 'Generating...' indicator
Assistant message bubbles now have a soft shimmer gradient background while streaming, plus a 'Generating...' label with a pulsing dot that appears once content starts arriving.
Gold blinking typing cursor replaces static placeholder
The inline animated block during streaming is replaced with a proper gold blinking | cursor (via CSS) that appears at the end of the generated text for a more polished typing effect.
TextShimmer component now actually animates
The text shimmer component used for tool-specific loading messages now applies a real opacity pulse animation instead of rendering static text.
Hero polish, per-message copy/regenerate buttons, typing animation, rubber-ducking removal, exercises lock, and admin usage dashboard.
Hero section refined for readability and fit
Headline now says 'Master anything at the speed of thought.' Subheadline shortened to fit on screen. Container height reduced so the hero cards display without scrolling on most screens.
Chat typing animation and loading states
AI responses now type out character-by-character with a smooth reveal. During generation each tool shows a descriptive status like 'Creating flashcards...' or 'Building practice exam...' instead of generic dots.
Per-message copy and regenerate buttons
Every assistant response now has Copy and Regenerate buttons at the bottom-left inside the message card. Regenerate works on any message, not just the last one. Card heights remain stable during streaming to prevent layout jumping.
PNG uploads no longer fail magic bytes check
Client-side image compression now renames PNG outputs to .jpg so the server's file-type verification matches the actual JPEG content.
Rubber Ducking tool removed
The AI Rubber Ducking tool has been removed from the tools list, pricing plans, and AI context to simplify the tool lineup.
Practice Exercises placed under maintenance
The exercises page now shows a maintenance overlay while the exercise engine and grading logic are being upgraded.
Admin API usage dashboard
The admin page now shows real-time API usage stats: credits used today, this month, estimated monthly cost, and a breakdown by tool. Data comes from the credit_events table.
New developer-focused homepage hero, landing page motion polish, dashboard design alignment, and AI backend migration to DeepSeek.
New developer-focused homepage hero
The top of the homepage now uses a cinematic Socratica-branded workspace with knowledge mapping, practice exam, code refactor, smart notes, and AI tutor cards. The Socratica owl mascot logo anchors the section. Cards use the same panel surface design language as the dashboard.
Scroll-triggered reveal animations across the landing page
How It Works, Solutions, Pricing Teaser, and Feature Matrix sections now animate in with staggered reveals when they enter the viewport. Cards have refined hover lift effects. All animations respect reduced-motion preferences via prefers-reduced-motion and useReducedMotion.
Dashboard and landing page share one visual system
Dashboard shell surfaces, sidebar cards, tools grid, and overview widget now use the same socratica-surface and socratica-card-hover design tokens as the landing page. The shared glow, glassmorphism, shadows, and subtle hover layers make the experience feel like one continuous product.
AI backend migrated from Ollama to DeepSeek
All AI routes now use DeepSeek via OpenAI-compatible chat completions API. Set DEEPSEEK_API_KEY and DEEPSEEK_MODEL in your environment. Remove OLLAMA_BASE_URL, OLLAMA_API_KEY, and OLLAMA_MODEL_GENERAL.
Product copy and AI output sanitization no longer use em dashes; punctuation uses commas, colons, and semicolons instead.
Consistent punctuation across marketing, dashboard, and changelog text
Em dashes were removed from user-visible strings in favor of simpler punctuation. The assistant output sanitizer now maps em dashes to commas so chat matches the same style.
New public FAQ page with common questions, structured answers for search, and FAQ navigation in the header and footer.
FAQ page for product and comparison questions
A dedicated FAQ at /faq answers how Socratica differs from general chatbots, what tools are included, pricing and credits, privacy, certificates, and more. The page includes FAQ structured data to help search engines surface answers.
FAQ linked from the marketing header and footer
FAQ appears next to other public links so visitors can find answers without hunting through the site map.
Safer file uploads, PayPal webhook idempotency, clearer chat errors, and small UX hints for diagrams and AI memory.
Uploads verify real file types
PDFs and images must match known magic bytes; plain-text uploads reject obvious binary content. Storage uses normalized content types so MIME spoofing is less useful.
PayPal webhooks deduplicate by event id
Processed webhook events are stored in the database so legitimate retries do not apply subscription role changes more than once. Failed handling releases the claim so PayPal can retry.
Chat errors say what failed
AI Chat and tool chat surfaces prefix messages (for example Upload, Video, Web page) so you know which step broke.
Diagram and memory editor guidance
SVG diagram blocks explain that the preview comes from the assistant; Settings memory editing clarifies sections versus bullets before you save.
Home pricing teaser no longer shows the annual savings and "see all plans" footnote.
Simpler pricing section on the homepage
The line about paying annually and the extra link under the plan cards were removed so the teaser stays focused on the three plan cards and their CTAs.
Marketing pages no longer show the animated stats strip (tools, courses, learners).
Leaner home, Solutions, and About layouts
The three-column counter block with AI tools count, course subjects, and learners has been removed so those pages focus on the main content without placeholder-style numbers.
Assistant messages no longer show long typographic dashes; they are normalized automatically.
Consistent punctuation in AI replies
Model output is cleaned server-side so em dashes and similar characters become plain hyphens or spaced hyphens, matching the style we ask for in instructions. This applies to chat, grading, exercises, Think Aloud analysis, memory updates, and course prompt challenges.
Chat composer is a single clean shell: no double border or nested field frame.
Floating message bar looks like one control again
Removed the extra outer focus ring and the second outline on the composer so you only see one rounded bar. The text area no longer picks up a separate bordered box; focus styling matches the rest of the pill, aligned with other glass panels that use a single light border.
Performance pass: lighter fonts, scoped onboarding CSS, deferred hero particles, leaner analytics bundle.
Faster first paint on marketing pages
Google font weights are trimmed to what the UI actually uses, and Source Serif 4 now uses Next.js default fallback tuning for less layout shift. Driver.js styles load only with the dashboard mascot tour, not on every public page.
Hero particles do less work until you scroll to them
Floating background particles are created only after the hero block enters the viewport (once), and stay off when reduced motion is requested; animations are unchanged when motion is allowed.
Analytics charts load in a separate chunk
Recharts is dynamically imported on the analytics page so the initial JavaScript for that screen is smaller; charts and motion behave the same once loaded.
Single Motion dependency tree
The duplicate direct framer-motion package entry was removed; the app continues to use motion/react as before.
Removed the automatic quick-reply suggestion bar above the chat composer.
Cleaner composer area in AI Chat and tool chats
The bar that offered AI-generated reply chips after assistant messages is gone. You still type or use context as before; only the auto suggestion strip was removed.
Devil's Advocate reframed as a topic-first oral-exam LARP: intense pressure on ideas, not fluff.
Devil's Advocate matches the pressure-test fantasy
The tool is now explicitly a study role-play: you name a topic or claim and the model acts as a skeptical examiner who refuses vague answers and drills edge cases and mechanisms, while staying respectful and safe on high-stakes subjects. The tool card description and placeholder explain that intent.
Unified chat composer and consistent input styling across AI Chat, tools, exams, and exercises.
Floating chat composer matches everywhere
AI Chat and every tool chat now share the same composer shell: a soft glass pill with a gold focus ring, clearer depth, and a textarea that uses brand caret and selection colors. Popover URL fields in tool chat use the same padding and corners as AI Chat.
Practice exams, Think Aloud notes, and exercises use the standard input style
Short answers, code boxes, line explanations, the Think Aloud notebook, and Practice Exercise text/code fields now use the shared ui-input treatment (border, background, and focus ring) so they feel consistent with the rest of the dashboard.
Deployment fix: Syntax Blinder prompt file parses correctly again.
Production build no longer fails on Syntax Blinder prompt
A line in the Syntax Blinder system prompt used unescaped backticks inside a template string, which broke the JavaScript parser during the build. The backticks around the blank placeholder are now escaped so Vercel and local builds succeed.
Stop button for AI Chat, accessible deck/exam strips, and always-visible code copy on touch.
Stop generation in AI Chat
While the AI is responding in the main chat, a Stop button now appears in place of the Send button. Clicking it cancels the request and keeps any partial response that was already received, matching the behaviour in tool chats.
Flashcard and exam deck strips no longer use nested buttons
Each deck and exam card in the horizontal strips was rendered as a button containing another button (the delete control), which is invalid HTML and breaks keyboard and screen reader navigation. The outer wrapper is now a div, with separate open and delete buttons as siblings.
Code block copy button is always reachable on touch and keyboard
The Copy button on code blocks was only visible on mouse hover, making it inaccessible on touch screens and hard to reach via keyboard. It now appears on touch devices and on keyboard focus as well.
Bug fixes and quality improvements across tools, diagrams, and AI output display.
Practice exam progress bar now shows visibly
The in-progress exam question counter bar was rendering with a transparent fill, making it impossible to see how far through the exam you were. It now uses the correct accent color.
Exam viewer no longer shows garbled separator text
A corrupted character (�) appeared between question count and date in the saved exam viewer. It now correctly shows a middle dot separator.
Line-by-line exam questions labeled correctly
Questions of type "line-explain" were being labeled "Coding Challenge". They are now labeled "Line by Line" to match what the question actually asks.
Mermaid diagram errors are now visible instead of silently disappearing
When a diagram could not be rendered, the component previously returned nothing, leaving a blank space with no explanation. It now shows an error notice and the raw diagram source so you can inspect or copy it.
Learning Roadmap embed wiring repaired
The roadmap prompt used "Reference Path Slug" but the parser searched for "Roadmap.sh Slug", so roadmap.sh embeds never loaded. The prompt and parser are now aligned.
AI Roadmap tool: broader placeholder and accurate description
The tool card and input placeholder now reflect that the roadmap works for any subject or goal (not only career paths), and the description no longer implies the plan evolves automatically across sessions.
AI Diagrams tool: clarified description
The tool description now mentions that it produces SVG concept maps and flow diagrams, plus ER diagrams for database schema requests.
Devil's Advocate always ends with a structured score block
Responses now consistently close with a formatted Score / You defended well / Sharpen next block, making each exchange easier to scan and track.
Syntax Blinder sends one challenge per turn and uses correct language tags
The tool now explicitly sends exactly one challenge before waiting for your answer, and uses the proper language tag on every code fence regardless of programming language.
AI Chat error notice matches tool chat style
The error callout in AI Chat now includes an icon and uses the same flex layout as the tool chat error banner for visual consistency.
Back button on tool chat pages is accessible
The back arrow link now includes an aria-label so screen readers announce "Back to tools" instead of an unlabeled button.
Images in AI responses are constrained and lazy-loaded
Inline images in AI output now have a max-width constraint and a rounded border to prevent layout breakage, and load lazily to avoid blocking page rendering.
Manage saved roadmap library, and richer Mermaid diagrams with quick access to Mermaid Live.
Delete saved roadmaps and attach from a clearer library UI
Saved plans picker (AI Chat and tool chat) now lists each plan with attach on tap and a delete control that removes it from your library and from attached context. Learning Roadmap adds a horizontal Plans strip to attach or delete saved plans quickly, similar to flashcard decks.
Mermaid diagrams match the product and feel closer to Mermaid Live
Roadmaps and chat diagrams use a shared Socratica-themed Mermaid config (colors, Outfit, spacing). Diagram cards include a subtle canvas treatment, copy for the source, and a link to open mermaid.live for editing.
Saved roadmaps in AI Chat, collapsed sidebar alignment, and maintainer changelog guidance.
Attach saved roadmaps from AI Chat
The main AI Chat composer now includes the same Saved plans control as tool chat. Pick saved Learning Roadmap plans to add them as context chips and send with your message (including send-with-context-only when appropriate).
Collapsed dashboard sidebar icons stay centered
When the sidebar is minimized, nav abbreviations and the logo row use centered layout and tighter horizontal padding so two-letter labels sit in the middle of each pill instead of drifting to one side.
Changelog expectations documented for releases
Project guidance now states that pushes to main should include an update to the public changelog when changes are user-visible, to keep release notes consistent.
Saved Learning Roadmap plans you can attach in tool chat, plus smoother roadmap streaming and markdown in the planner.
Save and reuse Learning Roadmap outputs in tool chat
Generated roadmaps can be saved to your library (manual Save plan). On any tool chat page, use Saved plans in the composer to attach one or more roadmaps as context chips; they are sent with your message with sensible size limits. Duplicate saves are detected and shown as Saved.
Learning Roadmap streaming feels steadier
The planner now updates live while the model streams instead of swapping from a placeholder card, which reduces layout jump and keeps structure visible as it arrives.
Roadmap planner renders inline markdown in structured sections
Goals, tasks, and related fields use lightweight markdown so emphasis and links from the model read correctly instead of raw syntax.
Flashcard tool deck list only shows real flashcard saves
Saved content from other types (for example chat transcripts) no longer appears as empty decks when browsing flashcards.
Content API supports filtering by content type
GET /api/content accepts an optional contentType query parameter alongside toolSlug so clients can fetch only roadmap saves (or other types) without loading everything.
Accessibility heading-order fix and AI chat typography hierarchy polish.
AI Tools page heading order corrected
Added a section-level H2 landmark for the tools grid so heading structure no longer skips from H1 to H3.
AI chat type scale normalized
Replaced ad-hoc 11px/13px/15px text sizes in chat surfaces with consistent semantic sizes (xs/sm/base) to improve hierarchy clarity.
Assistant markdown typography strengthened
Updated ChatContent heading and body scales for better visual rhythm and clearer emphasis across long assistant responses.
Overview action-path fixes and billing/status copy polish.
Pro plan messaging no longer shows upgrade prompt
Overview Current Plan card now shows 'Highest plan active' for Pro users instead of 'Upgrade any time from billing.'
Dashboard sidebar no longer links to maintenance-locked Courses
Removed the dead-end Courses nav item from the dashboard sidebar to prevent users from being routed into a maintenance-only page.
Overview quick-launch cards now adapt by plan tier
Quick Launch suggestions are now tier-aware so users see higher-value tools for their current access level instead of one static set for everyone.
Overview usage panel copy de-duplicated
Removed repeated reset-date messaging in the usage block to reduce noise and keep status information cleaner.
What's New link now stays in same tab
Dashboard sidebar changelog link no longer forces a new browser tab for a more consistent in-app navigation flow.
Accessibility contrast fix for active dashboard sidebar icon badges.
Active sidebar icon badge contrast corrected
Adjusted active nav badge colors so icon text no longer renders on a same-color background, improving readability and WCAG contrast compliance.
Dashboard overview and sidebar UI consistency polish pass.
Overview status and action hierarchy tightened
Refined top-bar copy and supporting labels so the overview reads in a clearer order: current status, next action, then quick launch.
Overview status line shortened for cleaner scan
Reduced the top-bar status sentence length so the message stays concise and easier to parse at a glance.
Sidebar nav keyboard focus visibility strengthened
Added consistent focus-visible rings on dashboard sidebar navigation links for clearer keyboard navigation and accessibility.
Brand typography consistency in expanded sidebar
Adjusted expanded sidebar brand text styling for cleaner, more stable visual rhythm with the rest of dashboard typography.
Sidebar branding reliability fix on dashboard.
Socratica text in sidebar brand no longer disappears intermittently
Replaced animated brand-text render path with a deterministic static render so the sidebar header label is consistently visible whenever the sidebar is expanded.
Dashboard overview visual tweak for cleaner header presentation.
Removed heavy shadow from overview top status bar
The overview header panel now renders without the strong elevation shadow for a cleaner, flatter look while keeping the same content and spacing.
Dashboard overview polish pass: better next-action routing, stronger readability, and accessibility upgrades.
Next best action no longer points to maintenance-locked Courses
Overview fallback routing now sends continuation actions to AI Tools flow instead of dead-ending in maintenance-only sections.
Overview hierarchy and copy now prioritize status first
Hero and supporting copy now present current usage status first, then next action, then quick launch for faster scan and clearer decision flow.
Overview accessibility and focus visibility pass
Added clearer section semantics, stronger muted-text contrast, and consistent keyboard focus states on primary overview actions.
Memory pipeline reliability and performance update for personalized AI responses.
User memory indexing now focuses on recent user-authored context
The memory updater now indexes only recent user messages (not assistant turns), reducing prompt noise and improving memory extraction quality and speed.
Memory storage now fails loudly on DB write issues
User memory save/clear operations now surface storage failures instead of silently succeeding, improving reliability and debugging when database issues occur.
Memory injection path now has dedicated regression coverage
Added tests to verify memory and display-name context are injected into AI chat prompts and that memory update flows skip unnecessary model calls.
Resilience and desktop UX update: Gemini high-demand fallback chain plus responsive dashboard scaling.
Automatic fallback when Gemini is under high demand
AI chat now attempts Gemini first, then falls back to GLM-4.7-FlashX (Z.AI), and finally to Ollama when providers return 429/503/5xx or temporary unavailability.
Provider raw errors are now normalized for users
Users now see clear friendly errors such as high-demand retry messaging instead of raw upstream JSON payloads.
Desktop dashboard and chat layouts scale cleanly across common resolutions
Updated dashboard shell widths, sidebar breakpoints, and chat content/composer containers so UI fit is improved from 1366x768 through 2560x1440.
Practice exam question rendering now supports markdown code fences.
Multiple-choice questions now render fenced code blocks correctly
Exam question text now uses the markdown renderer, so snippets like ```python display as formatted code blocks instead of raw backticks.
CI stability fix for exercise evaluation validation order.
Exercise evaluate API now validates request payload before provider config checks
Invalid exercise requests once again return correct 400/404 responses instead of surfacing 502 config errors, restoring expected test behavior and CI pass conditions.
Legal baseline added: Terms/Privacy pages, signup consent notice, and stronger rights language.
Terms of Service and Privacy Policy pages are now live
Added dedicated /terms and /privacy pages covering account use, intellectual property, acceptable use, AI processing, and data handling expectations.
Signup now includes explicit policy agreement notice
Free signup now routes through /signup with a required agreement checkbox before continuing to account creation, with direct links to Terms and Privacy.
Legal links and discovery improved across site
Footer now includes Terms and Privacy links, marketing signup CTAs now route through /signup, and sitemap includes both legal pages.
Tier-based AI provider routing expanded across exercise and analysis APIs.
Paid users now use Gemini on grading and evaluation APIs
Grade Answer and Exercises Evaluate now follow the same provider split as chat: Free uses Ollama, paid plans use Gemini 2.5 Flash.
Prompt Challenge and Think Aloud analysis now follow tier-based routing
Prompt-course challenge responses and think-aloud gap analysis now route paid plans to Gemini 2.5 Flash while keeping free-tier behavior on Ollama.
User memory updater intentionally stays on Ollama
Memory extraction remains on the existing Ollama-only path by design, regardless of plan tier, to keep that background flow stable.
LLM routing split by plan tier: free stays on Ollama, paid plans now run on Gemini 2.5 Flash.
Paid plans now use Gemini 2.5 Flash in AI chat
Users on Basic, Normal, and Pro are now routed to Gemini 2.5 Flash for stronger price-performance and production-grade multimodal handling.
Free tier remains on local/cloud Ollama path
Free users continue using the existing Ollama routing and model configuration, preserving current behavior and cost controls.
Gemini search grounding enabled for paid AI-chat search prompts
When paid users ask to search, AI chat now enables Gemini Google Search grounding instead of the previous Tavily injection path.
Onboarding UX polish: smoother transitions, less visual noise, and reliable post-completion behavior.
Onboarding flow no longer jumps between steps
Background scrolling is now locked while the wizard is open, autofocus-induced viewport jumps were removed, and step layout height is stabilized for smoother transitions.
Onboarding UI made more responsive and less visually busy
Overlay spacing and mobile anchoring were refined, and the tools step now shows concise previews instead of a long, noisy list.
Onboarding CTA no longer persists after completion
Dashboard next-action now respects local onboarding completion immediately, preventing stale cache states from repeatedly showing the onboarding CTA after finishing the wizard.
Onboarding CTA reopen fix and analytics schema stabilization.
Dashboard onboarding button now reliably reopens the wizard
Open onboarding now resets both local onboarding flags and server onboarding completion state, then replays the wizard immediately on the dashboard.
Product events tracking schema mismatch resolved
Added a migration to create public.product_events with indexes and service-role-only RLS so /api/events inserts no longer fail when analytics is enabled.
Courses route restored to maintenance lock
The /dashboard/courses route now renders a hard maintenance screen again to prevent users from entering the relaunch catalog while rollout is paused.
Activation and retention sprint: events API, courses relaunch v1, onboarding simplification, and pricing consistency.
Product events API for activation tracking
Added /api/events with validated event names for page views, CTA clicks, onboarding steps, tool starts, and upgrade intent.
Usage API now includes activation fields
Usage responses now include onboarding completion status and first tool usage timestamp for dashboard next-action logic.
Courses relaunch v1 is now live
The courses catalog has been reopened with staged rollout messaging while Team and Certification remain temporarily gated.
Pricing and marketing copy now share a single source of truth
Tool counts and plan messaging were unified across Hero, Solutions, Pricing, and dashboard surfaces to remove inconsistencies.
Next.js 16 middleware deprecation warning resolved
Auth guarding moved from middleware.ts to proxy.ts for compatibility with current Next.js conventions.
Security hardening pass for URL fetch safety, search abuse controls, cron auth, and certificate integrity.
SSRF protections strengthened for web URL tools
Web Link and Link Extract now validate and resolve target hosts against private/internal IP ranges and re-check redirect hops before fetching content.
Web search endpoint now enforces abuse and credit controls
Tools web search now applies authenticated IP abuse checks, monthly credit enforcement, and usage debit recording to prevent quota abuse.
Cleanup cron route switched to fail-closed auth
The uploads cleanup route now returns a server misconfiguration error when CRON_SECRET is missing, instead of allowing unauthenticated access.
Certificate PDF name override locked to owner-only
Public certificate downloads always use the canonical saved name unless the authenticated certificate owner requests a valid override.
Quality foundation sprint: lint debt cleanup and CI guardrails.
App lint debt removed
Cleared remaining active-product lint issues by resolving onboarding JSX entity escapes, converting immutable heatmap state to const, and cleaning up an unused tools-chat helper argument.
Tools chat thumbnail rendering compliance
Replaced the raw inline thumbnail image element in tools chat context chips with a compliant Next.js image pattern while preserving the same visual output.
CI quality checks on main
Added a GitHub Actions workflow that runs npm ci, lint, and test from src/ on pull requests to main and pushes to main using Node 20 with npm dependency caching.
Maintenance screen design refresh across blocked dashboard sections.
Maintenance UI polish
Refined the in-construction screen with a stronger visual hierarchy, clear status row, and improved spacing for better readability.
Section-specific upgrade messaging
Team, Certification, and Courses now show tailored highlight bullets so users understand exactly what is being improved.
Reusable maintenance component controls
MaintenanceOverlay now supports configurable status labels, action text/links, and highlight lists while keeping one clear primary action.
Hard maintenance lock enabled for Team, Certification, and Courses.
Team page refresh loop removed
The Team route now renders a static maintenance screen only, so no background fetch/redirect logic runs while maintenance mode is active.
True route blocking for maintenance sections
Team, Certification, and Courses routes are now fully blocked behind a coming-soon page instead of rendering live page logic underneath.
Original page implementations preserved
Existing page code was kept in dedicated content files so each route can be restored quickly without rebuilding from scratch.
Maintenance overlay applied to Team, Certification, and Courses pages.
Maintenance mode for key dashboard sections
Team, Certification, and Courses now show an in-construction panel so users see a clear status while we ship the next update.
Non-destructive maintenance layer
A reusable MaintenanceOverlay now sits above each page. Existing page logic and UI remain in code underneath, so sections can be restored quickly without rebuilds.
Transcript engine rebuilt, drag-and-drop everywhere, security hardening.
Rebuilt YouTube transcript engine
Replaced the third-party library with a direct YouTube page parser. Browser-like headers and consent cookies bypass bot detection, so virtually any video with captions (manual or auto-generated) now works reliably.
Vision fallback for captionless videos
When a video has no captions at all, the AI now receives the high-res thumbnail plus the video title and channel name from oEmbed. It can still answer questions from visual context. A small 'AI' badge appears on the chip so you know the mode.
Drag-and-drop images in AI Chat
Drop any PNG, JPG, WEBP, PDF, TXT or CSV directly onto the AI Chat window. Images over 3.5 MB show a size-limit modal instead of silently failing. Clipboard paste (Ctrl+V) also works for screenshots.
Transcript, thumbnail and metadata fetched in parallel
All three network calls now run concurrently via Promise.allSettled, cutting load time roughly in half compared to the previous sequential approach.
"Out of credits" false positive for paid users
Tool routes (video download, web link, link extract) were calling getUserId() then a separate dynamic getAuthSession() import. When the second call didn't resolve the tier, it defaulted to 'free' (20 credits). All routes now use a single static getAuthSession() call - the same pattern the AI chat route uses.
File uploads failing with Bucket not found
The Supabase 'uploads' bucket was missing, causing a hard 500. Since the storage URL is never used client-side (only extractedText matters), the upload step is now best-effort - a missing bucket logs a warning and processing continues normally.
XSS: block javascript: / vbscript: / data: URLs in chat
AI-generated markdown links with javascript: or data: schemes now render as plain text instead of clickable anchors. The regex is compiled once at module level instead of per-render.
SSRF: block private IPs in web fetch routes
Web link and link-extract routes now reject URLs that resolve to localhost, loopback, link-local (169.254.x.x), and private RFC-1918 ranges.
SVG sanitizer: normalize unicode escapes before filtering
Attackers could previously encode 'javascript:' as unicode escape sequences to bypass the sanitizer. All unicode escapes are now decoded before the deny-list is applied.
IP abuse check: allow up to 3 accounts per IP
The previous limit of 1 account per IP was blocking legitimate users on shared networks (households, university networks, VPNs). Raised to 3; abuse is still caught at 4+.
Activity heatmap empty state
New users now see a friendly placeholder instead of an invisible SVG.
Vision model for video & web links, stop streaming, QuickPick redesign.
Vision model context for YouTube videos
High-resolution thumbnails are now fetched alongside transcripts and passed to the AI as image context. The model can reference the visual style of a video, not just its text.
Web link context (Jina Reader)
Paste any URL - articles, docs, blog posts - using the Globe button. Content is extracted via Jina Reader and added to the AI context before your message is sent.
Stop streaming button
A square stop icon appears in place of the send button while the AI is responding. Clicking it immediately halts the stream and keeps whatever was already generated.
QuickPick popup redesigned
Replaced the tall vertical list with compact horizontal chips so the AI output stays visible. Added a 'type your own answer' input with Enter key support.
Drag-and-drop for tools
Drop images or documents directly onto any tool chat. Shows a size-limit modal for files over 3.5 MB.
Activity heatmap, loading skeletons, testimonials, SEO.
GitHub-style activity heatmap
Analytics page now shows a 52-week heatmap of your credit usage - built as pure SVG with no D3 dependency.
Loading skeletons
Courses, tools, and analytics pages now show shimmer skeletons while data loads instead of a blank screen.
Testimonials section
Added a masonry testimonials grid to the solutions page.
SEO: static sitemap dates
Sitemap lastModified dates are now static per page instead of regenerating on every Vercel deploy, preventing unnecessary re-crawls.
Tool chat history, XP system, exercises, external link fixes.
Tool chat history
The last 3 conversations in each tool are auto-saved and shown in a compact strip below the header. One click restores a previous session.
XP awarded on exercise pass
Completing an exercise now awards XP to your course progress record.
External links opening in same tab
AI-generated markdown links to external sites now open in a new tab with rel=noopener.
You've reached the beginning of the changelog.