Index: backend/.gitignore
===================================================================
--- backend/.gitignore	(revision 280e995a180ab83674cb114a6e5d0ba9c753ede8)
+++ backend/.gitignore	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
@@ -4,4 +4,2 @@
 
 /generated/prisma
-
-/scripts
Index: backend/scripts/challengesScraper.js
===================================================================
--- backend/scripts/challengesScraper.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
+++ backend/scripts/challengesScraper.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
@@ -0,0 +1,58 @@
+const axios = require('axios');
+const cheerio = require('cheerio');
+const fs = require('fs').promises;
+
+const ROOT_URL =
+  'https://github.com/theoludwig/programming-challenges/tree/master/challenges';
+const BASE_RAW =
+  'https://raw.githubusercontent.com/theoludwig/programming-challenges/master/challenges/';
+const OUTPUT_FILE = 'challenges-output.txt';
+
+async function getChallengeFolders() {
+  const res = await axios.get(
+    'https://api.github.com/repos/theoludwig/programming-challenges/contents/challenges'
+  );
+
+  return res.data
+    .filter((item) => item.type === 'dir')
+    .map((item) => item.name);
+}
+
+async function fetchMarkdown(folder, outputStram) {
+  const url = `${BASE_RAW}${folder}/README.md`;
+  try {
+    const res = await axios.get(url);
+    const output = `\n=== ${folder} ===\n${res.data}\n`;
+
+    console.log(output);
+
+    return output;
+  } catch (err) {
+    console.error(`No README found for ${folder}: ${err.response?.status}`);
+  }
+}
+
+(async () => {
+  try {
+    // Clear/create the output file
+    await fs.writeFile(
+      OUTPUT_FILE,
+      'PROGRAMMING CHALLENGES\n' +
+        '=====================\n\n' +
+        `Generated on: ${new Date().toISOString()}\n\n`
+    );
+
+    const folders = await getChallengeFolders();
+    console.log(`Found ${folders.length} challenge folders`);
+
+    for (const folder of folders) {
+      const output = await fetchMarkdown(folder);
+      // Append each result to the file
+      await fs.appendFile(OUTPUT_FILE, output);
+    }
+
+    console.log(`\nAll results saved to ${OUTPUT_FILE}`);
+  } catch (error) {
+    console.error('Error during execution:', error);
+  }
+})();
Index: backend/scripts/dailyResets.js
===================================================================
--- backend/scripts/dailyResets.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
+++ backend/scripts/dailyResets.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
@@ -0,0 +1,101 @@
+const prisma = require('../lib/prisma');
+const schedule = require('node-schedule');
+
+async function dailyResets() {
+  const scriptExecutionTime = new Date(); // Time when the script actually runs
+  console.log(
+    `[${scriptExecutionTime.toISOString()}] Starting daily reset process (executed at local server time).`
+  );
+  console.log(`Intended to correspond to 7 AM Macedonian Time.`);
+
+  try {
+    const userUpdateResult = await prisma.users.updateMany({
+      data: {
+        attempts: 0,
+        solvedDailyChallenge: false,
+      },
+    });
+    console.log(
+      `[${scriptExecutionTime.toISOString()}] Reset status for ${
+        userUpdateResult.count
+      } users.`
+    );
+
+    const dateToProcess = new Date(scriptExecutionTime);
+    dateToProcess.setUTCDate(scriptExecutionTime.getUTCDate() - 1);
+
+    const targetDateForQuery = new Date(
+      Date.UTC(
+        dateToProcess.getUTCFullYear(),
+        dateToProcess.getUTCMonth(),
+        dateToProcess.getUTCDate()
+      )
+    );
+
+    console.log(
+      `[${scriptExecutionTime.toISOString()}] Current script execution UTC date: ${
+        scriptExecutionTime.toISOString().split('T')[0]
+      }`
+    );
+    console.log(
+      `[${scriptExecutionTime.toISOString()}] Target date for challenge expiry (YYYY-MM-DD UTC): ${
+        targetDateForQuery.toISOString().split('T')[0]
+      }`
+    );
+
+    const challengeUpdateResult = await prisma.challenges.updateMany({
+      where: {
+        solving_date: targetDateForQuery,
+        expired: false,
+      },
+      data: {
+        expired: true,
+      },
+    });
+
+    const usersOutput = await prisma.users.updateMany({
+      data: {
+        solvedDailyChallenge: false,
+      },
+    });
+    console.log(
+      `[${scriptExecutionTime.toISOString()}] Marked ${
+        challengeUpdateResult.count
+      } challenges from ${
+        targetDateForQuery.toISOString().split('T')[0]
+      } as expired.`
+    );
+
+    console.log(
+      `[${scriptExecutionTime.toISOString()}] Daily reset process completed successfully.`
+    );
+    console.log(
+      `[${scriptExecutionTime.toISOString()}] Updated ${
+        usersOutput.count
+      } users to reset their daily challenge status.`
+    );
+  } catch (error) {
+    console.error(
+      `[${scriptExecutionTime.toISOString()}] Error during daily reset process:`,
+      error
+    );
+  } finally {
+    await prisma.$disconnect();
+    console.log(
+      `[${scriptExecutionTime.toISOString()}] Prisma client disconnected.`
+    );
+  }
+}
+
+const job = schedule.scheduleJob('0 7 * * *', function () {
+  console.log(`Running scheduled daily reset at ${new Date().toISOString()}`);
+  dailyResets();
+});
+
+process.on('SIGINT', function () {
+  job.cancel();
+  console.log('Daily reset scheduler stopped.');
+  process.exit(0);
+});
+
+dailyResets();
Index: backend/scripts/deleteAllChallenges.js
===================================================================
--- backend/scripts/deleteAllChallenges.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
+++ backend/scripts/deleteAllChallenges.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
@@ -0,0 +1,16 @@
+const prisma = require('../lib/prisma');
+
+async function deleteAllChallenges() {
+  try {
+    const result = await prisma.challenges.deleteMany({});
+    console.log(`✅ Successfully deleted ${result.count} challenges`);
+  } catch (error) {
+    console.error('❌ Error deleting challenges:', error);
+    throw error;
+  } finally {
+    console.log('Disconnecting from database...');
+    await prisma.$disconnect();
+  }
+}
+
+deleteAllChallenges();
Index: backend/scripts/deleteAllTestCases.js
===================================================================
--- backend/scripts/deleteAllTestCases.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
+++ backend/scripts/deleteAllTestCases.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
@@ -0,0 +1,29 @@
+const prisma = require('../lib/prisma');
+
+async function deleteAllTestCases() {
+  try {
+    console.log('Deleting all test cases...');
+
+    const result = await prisma.test_cases.deleteMany({});
+
+    console.log(`✅ Successfully deleted ${result.count} test cases`);
+    return result.count;
+  } catch (error) {
+    console.error('❌ Error deleting test cases:', error);
+    throw error;
+  } finally {
+    console.log('Disconnecting from database...');
+    await prisma.$disconnect();
+  }
+}
+
+// Run the function
+deleteAllTestCases()
+  .then((count) => {
+    console.log(`Operation complete. Total records deleted: ${count}`);
+    process.exit(0);
+  })
+  .catch((error) => {
+    console.error('Script failed:', error);
+    process.exit(1);
+  });
Index: backend/scripts/deleteAllUsers.js
===================================================================
--- backend/scripts/deleteAllUsers.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
+++ backend/scripts/deleteAllUsers.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
@@ -0,0 +1,43 @@
+const supabase = require('../supabaseClient');
+
+async function deleteAllUsers() {
+  // 1. Get all user IDs from the users table
+  const { data: users, error: fetchError } = await supabase
+    .from('users')
+    .select('id');
+  if (fetchError) {
+    console.error('Error fetching users:', fetchError);
+    return;
+  }
+
+  if (!users || users.length === 0) {
+    console.log('No users found.');
+    return;
+  }
+
+  // 2. Delete users from Supabase Auth
+  for (const user of users) {
+    const { error: authError } = await supabase.auth.admin.deleteUser(user.id);
+    if (authError) {
+      if (authError.status === 404 && authError.code === 'user_not_found') {
+        console.warn(`Auth user ${user.id} not found (already deleted).`);
+      } else {
+        console.error(`Error deleting auth user ${user.id}:`, authError);
+      }
+    } else {
+      console.log(`Deleted auth user ${user.id}`);
+    }
+  }
+  // 3. Delete all users from the users table
+  const { error: tableError } = await supabase
+    .from('users')
+    .delete()
+    .not('id', 'is', null);
+  if (tableError) {
+    console.error('Error deleting users from table:', tableError);
+  } else {
+    console.log('Deleted all users from users table.');
+  }
+}
+
+deleteAllUsers();
Index: backend/scripts/populateChallengesDb.js
===================================================================
--- backend/scripts/populateChallengesDb.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
+++ backend/scripts/populateChallengesDb.js	(revision 57e9a6fe58b1d52a7a19666966be3db403ba936a)
@@ -0,0 +1,83 @@
+const prisma = require('../lib/prisma');
+const fs = require('fs').promises;
+const path = require('path');
+const Challenge = require('../models/Challenge');
+
+async function populateChallenges() {
+  try {
+    const jsonPath = path.join(
+      __dirname,
+      '../challenges/initialChallenges.json'
+    );
+    const data = await fs.readFile(jsonPath, 'utf8');
+    const challengesData = JSON.parse(data);
+
+    console.log(`Found ${challengesData.length} challenges to import`);
+
+    let currentDate = new Date();
+
+    for (const challengeData of challengesData) {
+      const challenge = new Challenge({
+        title: challengeData.title,
+        content: challengeData.description,
+        solving_date: currentDate,
+        attempted_by: 0,
+        solved_by: 0,
+        expired: false,
+        examples: challengeData.examples,
+        test_cases: challengeData.testcases.map((testCase) => ({
+          input: testCase.input,
+          output: testCase.output,
+        })),
+        output_type: challengeData.output_type,
+        difficulty: challengeData.difficulty,
+      });
+
+      console.log(
+        `Processing challenge: ${challenge.title} with date ${
+          challenge.solving_date.toISOString().split('T')[0]
+        }`
+      );
+
+      const createdChallenge = await prisma.challenges.create({
+        data: {
+          solving_date: challenge.solving_date,
+          title: challenge.title,
+          content: challenge.content,
+          attempted_by: challenge.attempted_by,
+          solved_by: challenge.solved_by,
+          expired: challenge.expired,
+          examples: challenge.examples,
+          output_type: challenge.output_type,
+
+          test_cases: {
+            create: challenge.test_cases.map((example) => ({
+              input: example.input,
+              output: example.output,
+            })),
+          },
+          output_type: challengeData.output_type,
+          difficulty: challengeData.difficulty,
+        },
+      });
+
+      console.log(`Created challenge with ID: ${createdChallenge.id}`);
+
+      currentDate = new Date(currentDate);
+      currentDate.setDate(currentDate.getDate() + 1);
+    }
+
+    console.log('Challenge import completed successfully!');
+  } catch (error) {
+    console.error('Error importing challenges:', error);
+  } finally {
+    await prisma.$disconnect();
+  }
+}
+
+populateChallenges()
+  .then(() => console.log('Done'))
+  .catch((e) => {
+    console.error('Script failed:', e);
+    process.exit(1);
+  });
