<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arya Bhagat</title>
    <description>The latest articles on DEV Community by Arya Bhagat (@aryaaa21).</description>
    <link>https://dev.to/aryaaa21</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4190635%2F7661388e-8fce-4af2-8bc3-b933d8e55840.jpg</url>
      <title>DEV Community: Arya Bhagat</title>
      <link>https://dev.to/aryaaa21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryaaa21"/>
    <language>en</language>
    <item>
      <title>VedaX — Turning Vedic Mathematics Practice into a Smarter Learning Experience</title>
      <dc:creator>Arya Bhagat</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:21:40 +0000</pubDate>
      <link>https://dev.to/aryaaa21/vedax-turning-vedic-mathematics-practice-into-a-smarter-learning-experience-3jfa</link>
      <guid>https://dev.to/aryaaa21/vedax-turning-vedic-mathematics-practice-into-a-smarter-learning-experience-3jfa</guid>
      <description>&lt;h1&gt;
  
  
  VedaX
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;VedaX turns Vedic Mathematics into a structured learning journey — helping learners learn techniques, practice with purpose, understand their mistakes, and build mastery.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Learn the technique. Practice with purpose. Master the skill.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;VedaX is a web application for learners who want to improve mental calculation speed using Vedic Mathematics. It combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a 16-technique Vedic Mathematics curriculum;&lt;/li&gt;
&lt;li&gt;technique explanations, examples, and guided practice;&lt;/li&gt;
&lt;li&gt;a practice arena and timed challenge modes;&lt;/li&gt;
&lt;li&gt;daily challenges and streak tracking;&lt;/li&gt;
&lt;li&gt;progress, XP, level, mastery, mistakes, and recommendations;&lt;/li&gt;
&lt;li&gt;prerequisite-aware adaptive learning;&lt;/li&gt;
&lt;li&gt;a deterministic mathematical engine that cross-validates every generated question;&lt;/li&gt;
&lt;li&gt;a responsive React frontend and an authenticated Express/MongoDB backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important design decision is that the browser is not trusted with learning outcomes. The server owns question generation, answer verification, attempts, scoring, XP, mastery, streaks, and reward idempotency.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Many mental-math learning apps are either static content libraries or client-only games. That creates two problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learners do not get a clear path from a sutra explanation to measurable mastery.&lt;/li&gt;
&lt;li&gt;A modified browser can change its own score, XP, streak, or answer state.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;VedaX addresses both by pairing educational content with a verified mathematical engine and a server-authoritative learning model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution in one screen
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Choose a technique
       ↓
Learn the sutra and examples
       ↓
Receive a deterministic server-owned question
       ↓
Submit an answer
       ↓
Server verifies it against the stored question
       ↓
Attempt → score → XP → mastery → streak → recommendation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source repository:&lt;/strong&gt; &lt;a href="https://github.com/Aryaaa-21/VedaX" rel="noopener noreferrer"&gt;github.com/Aryaaa-21/VedaX&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://veda-x-dev.vercel.app/" rel="noopener noreferrer"&gt;https://veda-x-dev.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API health check:&lt;/strong&gt; &lt;a href="https://vedax-a0dp.onrender.com/health" rel="noopener noreferrer"&gt;https://vedax-a0dp.onrender.com/health&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walkthrough video:&lt;/strong&gt; &lt;a href="https://drive.google.com/drive/folders/1w_8N1ri_-ytaWQoaBD-SkUtojqSNu_Gu" rel="noopener noreferrer"&gt;Drive Link&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository includes the frontend and backend deployment configuration, but a live URL is intentionally not invented here. The application can be run locally using the instructions below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;p&gt;1 Landing Page Interface&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feyil38v48qs853425xhp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feyil38v48qs853425xhp.jpg" alt="The landing page introduces VedaX as a Vedic Mathematics learning platform. It presents the platform’s purpose, key learning features, and a clear call-to-action for users to begin their learning journey." width="733" height="361"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;2 User Login Page&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvglb22vycldmqxrydve7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvglb22vycldmqxrydve7.jpg" alt="The login page provides a simple authentication interface where registered users can securely enter their email address and password to access their VedaX account." width="733" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 User Signup Page&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk0l55h6qnx39w8jmhpuw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk0l55h6qnx39w8jmhpuw.jpg" alt="The signup page allows new users to create a VedaX account by providing their basic details and authentication credentials. The interface is designed to make account registration simple and straightforward." width="675" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4 Dashboard Interface&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qv0xu5zsx0jumqgan3w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qv0xu5zsx0jumqgan3w.jpg" alt="The dashboard provides an overview of the learner’s current progress. It displays information such as XP, level, streak, mastery, recent activity, learning recommendations, and overall practice performance" width="688" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5 Learning Modules Section&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi7l3i63klnb1v6wiptow.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi7l3i63klnb1v6wiptow.jpg" alt="The Learning Modules section organizes Vedic Mathematics techniques into structured learning units. Users can explore individual techniques, understand their concepts and examples, and prepare themselves for practice." width="692" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6 Timed Challenge Interface&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvbzur7if1xabngvjvcpi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvbzur7if1xabngvjvcpi.jpg" alt="The Timed Challenge interface provides a focused environment where users solve mathematical problems within a limited amount of time. It combines speed and accuracy to make practice more engaging and challenging." width="702" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7 Leaderboard System&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj6ptt8s8z2o0wvk5h5gv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj6ptt8s8z2o0wvk5h5gv.jpg" alt="The Leaderboard system displays learner rankings based on their performance and progress. It adds a competitive element to the platform and encourages users to consistently improve their practice." width="708" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8 Achievement and Badge System &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8zxich4grm1aelrpbd3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8zxich4grm1aelrpbd3.jpg" alt="The Achievement and Badge system recognizes important milestones reached by learners. Badges are awarded for accomplishments such as completing learning activities, maintaining progress, and achieving specific performance goals." width="707" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9 Buffering Effect&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4fv108nin7gqauv6cdk2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4fv108nin7gqauv6cdk2.jpg" alt="The Buffering Effect provides visual feedback while the application is processing or loading information. It helps communicate that the system is working and prevents the interface from appearing unresponsive during loading operations." width="733" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Repository structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VedaX/
├── backend/
│   ├── config/                 Environment and MongoDB configuration
│   ├── controllers/            Thin HTTP handlers
│   ├── middleware/             Auth, validation, rate limiting, errors
│   ├── models/                 Mongoose schemas and indexes
│   ├── routes/                 REST route definitions
│   ├── services/
│   │   └── math/               Generators, solvers, explanations, verification
│   ├── tests/                  API, security, learning, and math tests
│   └── validators/             Zod request schemas
├── frontend/
│   ├── src/app/                Landing and dashboard pages
│   ├── src/components/         Navbar, sidebar, navigation, visual components
│   ├── src/contexts/           Authentication context
│   ├── src/store/              Zustand UI/gameplay state
│   └── src/utils/              API and feedback utilities
├── docs/                       Architecture, API, math, security, release docs
├── .github/                    CI, issue forms, and PR template
├── Dockerfile                  Reproducible backend + frontend image build
├── Makefile                    Standard project checks
├── render.yaml                 Render backend configuration
├── railway.json                Railway backend configuration
├── vercel.json                 Vercel frontend configuration
└── netlify.toml                Netlify frontend configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stable mathematical engine API
&lt;/h3&gt;

&lt;p&gt;The engine is independent from Express and MongoDB. It can be tested as a pure module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;generateVerifiedQuestion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;verifyAnswer&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./backend/services/math&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateVerifiedQuestion&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;techniqueId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nikhilam-subtraction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo-session:0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verifyAnswer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;9604&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;correct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;correct&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every generated question is cross-checked by an independent solver before it can enter a practice session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateQuestion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;solved&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;solveQuestion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;solved&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expectedAnswer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MathEngineError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`Cross-validation failed for &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;techniqueId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CROSS_VALIDATION_FAILED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The public question response deliberately excludes &lt;code&gt;expectedAnswer&lt;/code&gt; and &lt;code&gt;solutionData&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicQuestion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;techniqueId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;techniqueId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Server-authoritative practice
&lt;/h3&gt;

&lt;p&gt;The client submits an answer. It does not submit correctness, XP, mastery, streak, or score:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/practice/sessions/:sessionId/attempts

{
  "sequence": 0,
  "answer": "9604",
  "responseTimeMs": 1840,
  "hintUsed": false,
  "idempotencyKey": "attempt-unique-key"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend then performs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stored server question
        ↓
safe answer normalization
        ↓
mathematical verification
        ↓
Attempt document
        ↓
server score
        ↓
UserProgress mastery update
        ↓
session completion
        ↓
idempotent XPTransaction
        ↓
server streak update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  XP reward idempotency
&lt;/h3&gt;

&lt;p&gt;XP rewards use a unique user/idempotency-key constraint and a MongoDB transaction for the ledger plus user aggregate update:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;XPTransaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;safeAmount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sourceType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sourceId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idempotencyKey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findByIdAndUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$inc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;safeAmount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;runValidators&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One qualifying event is intended to produce one reward, even when a request is retried or two completion requests arrive close together.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;VedaX follows a simple architecture: the frontend is responsible for presentation and interaction, while the backend is responsible for facts that affect learning outcomes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interface&lt;/td&gt;
&lt;td&gt;React 19, TypeScript, Vite&lt;/td&gt;
&lt;td&gt;Responsive learning experience and navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS 4, custom CSS variables&lt;/td&gt;
&lt;td&gt;Existing VedaX visual language and responsive layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interaction&lt;/td&gt;
&lt;td&gt;Zustand, Framer Motion, Lucide React&lt;/td&gt;
&lt;td&gt;UI state, transitions, icons, feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Node.js, Express&lt;/td&gt;
&lt;td&gt;Authentication, validation, practice, progress, challenge APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;MongoDB, Mongoose&lt;/td&gt;
&lt;td&gt;Users, sessions, attempts, progress, XP ledger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;Zod&lt;/td&gt;
&lt;td&gt;Request body and query validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;JWT, bcrypt&lt;/td&gt;
&lt;td&gt;Sessions, password hashing, token revocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mathematics&lt;/td&gt;
&lt;td&gt;Deterministic JavaScript services&lt;/td&gt;
&lt;td&gt;Generation, solving, explanations, verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Node test runner, Supertest, TypeScript, ESLint&lt;/td&gt;
&lt;td&gt;Backend/API/math/security and frontend checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Docker, Render, Railway, Vercel, Netlify configs&lt;/td&gt;
&lt;td&gt;Reproducible deployment paths&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The architecture
&lt;/h3&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[Browser&amp;lt;br/&amp;gt;React + TypeScript + Vite] --&amp;gt; B[React Router&amp;lt;br/&amp;gt;Responsive VedaX UI]
    B --&amp;gt; C[Authenticated REST API]

    C --&amp;gt; D[Express Routes]
    D --&amp;gt; E[Zod Validation]
    E --&amp;gt; F[JWT Authentication&amp;lt;br/&amp;gt;Ownership Checks]
    F --&amp;gt; G[Thin Controllers]

    G --&amp;gt; H[Practice Service]
    G --&amp;gt; I[Progress Service]
    G --&amp;gt; J[Challenge Service]
    G --&amp;gt; K[Adaptive Learning Service]

    H --&amp;gt; L[Math Engine]
    L --&amp;gt; L1[Catalog]
    L --&amp;gt; L2[Deterministic Generators]
    L --&amp;gt; L3[Independent Solvers]
    L --&amp;gt; L4[Explanations + Verification]

    H --&amp;gt; M[Attempt Records]
    H --&amp;gt; N[Practice Sessions]
    I --&amp;gt; O[User Progress]
    I --&amp;gt; P[Recommendations + Review]
    J --&amp;gt; Q[Daily Challenge Records]
    H --&amp;gt; R[XP Transaction Ledger]
    K --&amp;gt; O

    M --&amp;gt; S[(MongoDB)]
    N --&amp;gt; S
    O --&amp;gt; S
    P --&amp;gt; S
    Q --&amp;gt; S
    R --&amp;gt; S
    S --&amp;gt; T[Authoritative User State]
    T --&amp;gt; C&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  The mathematical pipeline
&lt;/h3&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[Technique ID + seed + difficulty] --&amp;gt; B[Generator]
    B --&amp;gt; C[Question + expected answer]
    C --&amp;gt; D[Independent solver]
    D --&amp;gt; E{Answers match?}
    E --&amp;gt;|No| F[CROSS_VALIDATION_FAILED]
    E --&amp;gt;|Yes| G[Structured explanation]
    G --&amp;gt; H[Stored server question]
    H --&amp;gt; I[User answer]
    I --&amp;gt; J[Safe normalization]
    J --&amp;gt; K[Verified attempt]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Difficulty and mastery
&lt;/h3&gt;

&lt;p&gt;Adaptive learning is deterministic rather than artificial intelligence. It uses persisted facts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recent correctness;&lt;/li&gt;
&lt;li&gt;recent accuracy;&lt;/li&gt;
&lt;li&gt;response time;&lt;/li&gt;
&lt;li&gt;consecutive mistakes;&lt;/li&gt;
&lt;li&gt;mastery score;&lt;/li&gt;
&lt;li&gt;review date;&lt;/li&gt;
&lt;li&gt;prerequisite gaps;&lt;/li&gt;
&lt;li&gt;technique history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is explainable. A recommendation can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Practice this technique because your recent accuracy is low or your review date is overdue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not claim that a hidden AI model made the decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bugs and design decisions that mattered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A client must not be able to award itself XP
&lt;/h3&gt;

&lt;p&gt;The original UI contains local gameplay state for compatibility with the approved frontend. The production learning API does not trust that state. The backend ignores client-provided learning outcomes in the compatibility sync route and calculates outcomes from verified events.&lt;/p&gt;

&lt;h3&gt;
  
  
  A generated question must fail loudly when mathematics disagrees
&lt;/h3&gt;

&lt;p&gt;The math engine does not silently accept a mismatched solver or explanation. A generator/solver mismatch throws &lt;code&gt;CROSS_VALIDATION_FAILED&lt;/code&gt;, which makes the error visible in tests and logs instead of teaching an incorrect answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  A duplicate request must not duplicate a reward
&lt;/h3&gt;

&lt;p&gt;Attempt uniqueness, session completion claiming, and XP transaction idempotency are separate protections. This matters because users retry network requests, mobile browsers reconnect, and two tabs can submit the same completion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Responsive behavior is part of correctness
&lt;/h3&gt;

&lt;p&gt;The frontend was kept visually consistent while fixing practical issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;desktop sidebar width and content offset now use the same valid spacing;&lt;/li&gt;
&lt;li&gt;mobile drawer width adapts to narrow viewports;&lt;/li&gt;
&lt;li&gt;bottom navigation respects safe-area insets;&lt;/li&gt;
&lt;li&gt;page shells prevent accidental horizontal overflow;&lt;/li&gt;
&lt;li&gt;navigation labels truncate safely on very small screens;&lt;/li&gt;
&lt;li&gt;reduced-motion preferences are respected;&lt;/li&gt;
&lt;li&gt;invalid fractional icon utilities were replaced with reliable sizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;VedaX does not use a hosted AI model and does not pretend to. Its open-source value is in making the educational and mathematical boundaries inspectable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Contributors can audit the exact generator, solver, explanation, and verification code.&lt;/li&gt;
&lt;li&gt;New techniques can be added through a documented process instead of a hidden content pipeline.&lt;/li&gt;
&lt;li&gt;Contributors can add randomized mathematics tests and reproduce failures with deterministic seeds.&lt;/li&gt;
&lt;li&gt;The server-authoritative learning rules are visible and reviewable.&lt;/li&gt;
&lt;li&gt;The frontend can be improved without replacing the backend learning contract.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The project deliberately uses deterministic learning heuristics rather than calling them AI. That keeps recommendations reproducible and makes a wrong result easier to diagnose.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Disclosure
&lt;/h2&gt;

&lt;p&gt;VedaX does not currently use a generative AI model, remote AI API, or AI-generated answer path in its runtime. Mathematical generation, answer checking, mastery, recommendations, and adaptive difficulty are deterministic application code.&lt;/p&gt;

&lt;p&gt;If a future contributor adds an AI-assisted educational feature, it must remain separate from authoritative correctness and reward calculations, be documented in this section, and include tests for unavailable or incorrect model responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;This project was developed through repository-driven implementation and verification. The important reproducibility boundary is the checked-in code and test suite, not an unverified assistant transcript.&lt;/p&gt;

&lt;p&gt;The repository records the implementation through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;focused conventional commits;&lt;/li&gt;
&lt;li&gt;pinned Node.js and lockfiles;&lt;/li&gt;
&lt;li&gt;offline backend tests;&lt;/li&gt;
&lt;li&gt;frontend typecheck, lint, and build commands;&lt;/li&gt;
&lt;li&gt;CI configuration;&lt;/li&gt;
&lt;li&gt;architecture, security, release, and contributor documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No public agent-session transcript is linked because none is required to rebuild or review the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;This repository does not claim a verified paying customer or testimonial. The intended first users are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;students learning mental arithmetic;&lt;/li&gt;
&lt;li&gt;teachers who want structured supplementary practice;&lt;/li&gt;
&lt;li&gt;competitive-exam learners;&lt;/li&gt;
&lt;li&gt;educators contributing new examples or technique tests;&lt;/li&gt;
&lt;li&gt;open-source contributors interested in trustworthy educational software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first useful milestone is not a fabricated growth number. It is a learner completing a technique, understanding the explanation, and returning to practice the next review item.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories / Challenge Fit
&lt;/h2&gt;

&lt;p&gt;The following are the honest project categories VedaX fits. They should be adjusted to the exact event requirements before publishing a challenge submission:&lt;/p&gt;

&lt;h3&gt;
  
  
  Education
&lt;/h3&gt;

&lt;p&gt;VedaX turns a traditional mathematical system into an interactive, measurable learning workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source
&lt;/h3&gt;

&lt;p&gt;The repository includes contributor documentation, a technique guide, issue forms, a pull request template, CI, and reproducible setup instructions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing and Trustworthy Software
&lt;/h3&gt;

&lt;p&gt;The project treats mathematical cross-validation, server authority, idempotency, and security tests as core product functionality rather than optional cleanup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Responsive Web Application
&lt;/h3&gt;

&lt;p&gt;The approved VedaX interface works across desktop, tablet, and mobile layouts without replacing the existing design direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Would Use This?
&lt;/h2&gt;

&lt;p&gt;VedaX is useful for people who want a repeatable way to practice rather than a one-time calculator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Students:&lt;/strong&gt; learn one sutra, see an example, and practice it immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teachers:&lt;/strong&gt; use the technique catalog and mastery data as supplementary practice material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exam learners:&lt;/strong&gt; build speed and accuracy through timed sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Math enthusiasts:&lt;/strong&gt; compare different mental calculation strategies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contributors:&lt;/strong&gt; add a mathematically validated technique or improve the test suite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is not a replacement for a teacher, curriculum, or conventional mathematics education. It is a practice and explanation tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Submissions
&lt;/h2&gt;

&lt;p&gt;VedaX is maintained as a single repository. If this project is submitted as a team entry, add the participating DEV/GitHub usernames here before publishing the submission. No team member names are invented in this README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification and deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backend tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend suite covers authentication, protected routes, profile field protection, leaderboard authority, malformed requests, learning utilities, scoring, streaks, stable technique IDs, deterministic generation, randomized cross-validation, normalization, and explanation structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend checks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make frontend-typecheck
make frontend-lint
make frontend-build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dependency audit
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nt"&gt;--prefix&lt;/span&gt; backend audit &lt;span class="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
npm &lt;span class="nt"&gt;--prefix&lt;/span&gt; frontend audit &lt;span class="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend production audit is clean. The frontend has two deferred moderate React Router advisories whose available fix requires a breaking upgrade. That upgrade is intentionally separate from the approved frontend/responsive maintenance work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; vedax &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 5000:5000 &lt;span class="nt"&gt;--env-file&lt;/span&gt; backend/.env vedax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Dockerfile builds the frontend artifact and runs the backend. Docker verification must be performed in an environment with Docker installed and a transaction-capable MongoDB deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js &lt;code&gt;22.23.3&lt;/code&gt; from &lt;code&gt;.nvmrc&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;npm;&lt;/li&gt;
&lt;li&gt;MongoDB for local backend runtime;&lt;/li&gt;
&lt;li&gt;Docker only if using the container workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci
npm &lt;span class="nt"&gt;--prefix&lt;/span&gt; frontend ci
npm &lt;span class="nt"&gt;--prefix&lt;/span&gt; backend ci
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure environment files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;backend/.env.example backend/.env
&lt;span class="nb"&gt;cp &lt;/span&gt;frontend/.env.example frontend/.env.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set a local MongoDB connection string and a development JWT secret in &lt;code&gt;backend/.env&lt;/code&gt;. Never commit the resulting &lt;code&gt;.env&lt;/code&gt; files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment variables
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MONGODB_URI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;MongoDB connection string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JWT_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;JWT signing secret; production requires at least 32 characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JWT_EXPIRES_IN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;JWT lifetime, defaults to &lt;code&gt;30d&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NODE_ENV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;development&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, or &lt;code&gt;production&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;API port, defaults to &lt;code&gt;5000&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CLIENT_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Primary frontend origin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CORS_ORIGINS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Additional comma-separated origins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ALLOW_PREVIEW_ORIGINS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Non-production preview allowlist switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BODY_LIMIT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;JSON body limit, defaults to &lt;code&gt;64kb&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Development
&lt;/h2&gt;

&lt;p&gt;Run the services in separate terminals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev:backend
npm run dev:frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run both together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default local URLs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend: &lt;code&gt;http://localhost:5173&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;API: &lt;code&gt;http://localhost:5000&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;health: &lt;code&gt;http://localhost:5000/health&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;readiness: &lt;code&gt;http://localhost:5000/ready&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  API overview
&lt;/h2&gt;

&lt;p&gt;All protected routes use &lt;code&gt;Authorization: Bearer &amp;lt;JWT&amp;gt;&lt;/code&gt;. Protected data is scoped to the authenticated user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/auth/signup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Validate and create an account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/auth/login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Authenticate and return a JWT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/auth/me&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Return the safe authenticated user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/auth/verify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verify the current JWT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/auth/logout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Increment token version and revoke the current token&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Practice and progress
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/practice/sessions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start a server-owned question session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/practice/sessions/:id/attempts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verify and record one answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/practice/sessions/:id/complete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Complete a session and award idempotent XP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/practice/sessions/:id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read the authenticated user's session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/practice/history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read completed session history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/progress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read summary, techniques, and recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/progress/summary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read authoritative user progress summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/progress/techniques&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read technique mastery records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/progress/recommendations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read deterministic recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/progress/xp-history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read the XP transaction ledger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/progress/mistakes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read grouped incorrect-attempt analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Challenges and learning intelligence
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/challenges/daily&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read the date/versioned daily challenge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/challenges/daily/start&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start the server-owned daily session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/challenges/daily/:sessionId/complete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Complete the daily session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/challenges/history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read own completed challenges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/learning/learner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read the deterministic learner profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/learning/path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read prerequisite-aware next techniques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/learning/difficulty/:techniqueId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read bounded server-derived difficulty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/techniques&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read the stable technique catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/techniques/:techniqueId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read one technique&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  User, leaderboard, and service status
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/user/profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read own profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/user/profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update editable profile fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/user/sync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compatibility profile sync; learning outcomes are ignored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/leaderboard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read database-backed rankings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Liveness status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/ready&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Readiness status; requires MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Errors use a stable JSON shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VALIDATION_ERROR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Enter a valid email address"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For full request, response, validation, and error details, see &lt;a href="//docs/api.md"&gt;docs/api.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mathematical engine
&lt;/h2&gt;

&lt;p&gt;VedaX currently preserves these 16 stable technique IDs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ekadhikena-purvena
nikhilam-subtraction
sankalana-vyavakalanabhyam
yavadunam
ekanyunena-purvena
vyastisamastih
vertically-crosswise
anurupyena
puranapuranabhyam
sesanyankena-caramena
sopantyadvayamantyam
paravartya-yojayet
sunyam-samyasamuccaye
chalana-kalanabhyam
gunitasamuccayah
gunakasamuccayah
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each technique must have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;catalog metadata;&lt;/li&gt;
&lt;li&gt;a deterministic generator;&lt;/li&gt;
&lt;li&gt;an independent solver;&lt;/li&gt;
&lt;li&gt;structured explanation steps;&lt;/li&gt;
&lt;li&gt;safe answer normalization and verification;&lt;/li&gt;
&lt;li&gt;normal, invalid, boundary, and randomized tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The engine never uses &lt;code&gt;eval()&lt;/code&gt;, &lt;code&gt;new Function()&lt;/code&gt;, or arbitrary expression evaluation.&lt;/p&gt;

&lt;p&gt;Read &lt;a href="//docs/mathematical-engine.md"&gt;docs/mathematical-engine.md&lt;/a&gt; and &lt;a href="//docs/adding-a-technique.md"&gt;docs/adding-a-technique.md&lt;/a&gt; before changing the math engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;The backend includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bcrypt password hashing;&lt;/li&gt;
&lt;li&gt;HS256 JWT verification and token-version revocation;&lt;/li&gt;
&lt;li&gt;authenticated ownership queries;&lt;/li&gt;
&lt;li&gt;Helmet security headers;&lt;/li&gt;
&lt;li&gt;exact CORS allowlisting;&lt;/li&gt;
&lt;li&gt;bounded JSON bodies;&lt;/li&gt;
&lt;li&gt;Zod validation;&lt;/li&gt;
&lt;li&gt;authentication and API rate limits;&lt;/li&gt;
&lt;li&gt;safe error payloads;&lt;/li&gt;
&lt;li&gt;server-owned questions and answer verification;&lt;/li&gt;
&lt;li&gt;idempotent attempt and reward records;&lt;/li&gt;
&lt;li&gt;conditional session completion claims;&lt;/li&gt;
&lt;li&gt;transactional XP ledger and user updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not submit passwords, tokens, keys, or private data in GitHub issues. See &lt;a href="//SECURITY.md"&gt;SECURITY.md&lt;/a&gt; for private vulnerability reporting guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The frontend can be deployed from &lt;code&gt;frontend/&lt;/code&gt; to Vercel or Netlify. Configure &lt;code&gt;VITE_API_URL&lt;/code&gt; with the deployed backend API base URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;Railway and Render configuration files are included. Configure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MONGODB_URI
JWT_SECRET
NODE_ENV=production
PORT
CLIENT_URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a transaction-capable MongoDB deployment for production rewards. &lt;code&gt;/ready&lt;/code&gt; should be used as the deployment readiness check because it verifies database connectivity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;The multi-stage Dockerfile builds the frontend and runs the backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; vedax &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5000:5000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-file&lt;/span&gt; backend/.env &lt;span class="se"&gt;\&lt;/span&gt;
  vedax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;Before opening a pull request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test
&lt;/span&gt;make frontend-typecheck
make frontend-lint
make frontend-build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Focused contribution areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add a Vedic technique with complete cross-validation;&lt;/li&gt;
&lt;li&gt;add mathematical boundary and randomized tests;&lt;/li&gt;
&lt;li&gt;improve API documentation;&lt;/li&gt;
&lt;li&gt;improve accessibility without changing the visual language;&lt;/li&gt;
&lt;li&gt;improve responsive behavior without redesigning approved pages;&lt;/li&gt;
&lt;li&gt;improve performance with measured evidence;&lt;/li&gt;
&lt;li&gt;fix backend validation, security, or data-consistency bugs;&lt;/li&gt;
&lt;li&gt;improve educational explanations and examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend is an approved baseline. Change it only for backend integration, a genuine functional/security bug, production compatibility, or targeted responsive behavior. If frontend files change, the pull request must list each file, the reason, and why the existing UI/UX remains unchanged.&lt;/p&gt;

&lt;p&gt;Read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="//CONTRIBUTING.md"&gt;CONTRIBUTING.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//docs/adding-a-technique.md"&gt;docs/adding-a-technique.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//docs/architecture.md"&gt;docs/architecture.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//docs/release-checklist.md"&gt;docs/release-checklist.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pull requests and issues
&lt;/h2&gt;

&lt;p&gt;The repository includes forms for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bug reports;&lt;/li&gt;
&lt;li&gt;feature requests;&lt;/li&gt;
&lt;li&gt;new Vedic techniques;&lt;/li&gt;
&lt;li&gt;mathematical errors;&lt;/li&gt;
&lt;li&gt;documentation improvements;&lt;/li&gt;
&lt;li&gt;security-report redirection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please include reproduction steps, tests, security impact, and mathematical validation where relevant. Do not create placeholder issues merely to increase issue count; proposed work should be real, scoped, and actionable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;complete the gradual migration from local gameplay state to server-owned practice sessions;&lt;/li&gt;
&lt;li&gt;add live MongoDB replica-set integration tests for transactions and concurrency;&lt;/li&gt;
&lt;li&gt;expand test coverage for cross-user ownership and duplicate requests;&lt;/li&gt;
&lt;li&gt;add more technique examples and contributor-authored educational content;&lt;/li&gt;
&lt;li&gt;measure and improve the frontend bundle without changing the approved experience;&lt;/li&gt;
&lt;li&gt;resolve the deferred frontend dependency audit findings in a controlled maintenance release;&lt;/li&gt;
&lt;li&gt;select and publish an appropriate open-source license.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Release status
&lt;/h2&gt;

&lt;p&gt;The project is production-oriented but should not be called fully release-ready until the project owner selects a license and live MongoDB transaction behavior is verified in the target deployment environment.&lt;/p&gt;

&lt;p&gt;See &lt;a href="//docs/release-checklist.md"&gt;docs/release-checklist.md&lt;/a&gt; for the complete pre-release checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;No &lt;code&gt;LICENSE&lt;/code&gt; file is currently committed. This is intentional pending a project-owner decision. Do not assume that the repository is licensed for redistribution or reuse until a license is selected and added.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acknowledgements
&lt;/h2&gt;

&lt;p&gt;VedaX is inspired by the educational tradition of Vedic Mathematics and by the open-source ecosystem that makes reproducible learning software possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You ❤️
&lt;/h2&gt;

&lt;p&gt;Thank you for reviewing VedaX. The project is intentionally built around a small promise: make mental-math practice more understandable, measurable, and trustworthy without hiding the important rules behind an opaque system.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>react</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
