A browser extension that automates exam slot searching and registration in the Moodle system at ČZU (Czech University of Life Sciences).
Testovak helps students find and register for exams at a convenient time. The extension automatically:
- Monitors available slots — periodically refreshes the page and checks for new time slots
- Filters by your criteria — searches only within the specified date and time range
- Auto-registers — as soon as it finds a suitable slot, it immediately navigates to the registration page
Install Testovak from official stores:
- Chrome Web Store - Install for Chrome/Edge/Brave
- Firefox Add-ons - Install for Firefox
- Download or clone the repository
- Build the extension:
pnpm install pnpm build:chrome
- Open
chrome://extensions/ - Enable "Developer mode"
- Click "Load unpacked"
- Select the
dist-chromefolder
- Download or clone the repository
- Build the extension:
pnpm install pnpm build:firefox
- Open
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on"
- Select the
manifest.jsonfile from thedist-firefoxfolder
Navigate to the Moodle ČZU page where available tests/exams are displayed.
A bright gradient button will appear next to each available test. Click on it.
In the modal window, specify:
- Test — select an exam from the list
- Date range — the range of days when you want to take the exam
- Time range — the hours that work for you (e.g., 09:00 - 17:00)
Click "Начать!" and the extension will start working:
- The page will automatically refresh every 10 seconds
- You'll see a progress bar and search duration
- As soon as a suitable slot appears — the extension will automatically navigate to registration
When the extension finds a slot, you'll be on the confirmation page. Just click the register button!
src/
├── moodle.tsx # Entry point, injection into Moodle page
├── SetupModal.tsx # Search configuration modal
├── ProgressModal.tsx # Search progress modal
├── hooks/
│ └── useExamSearch.ts # React hook with search logic
├── types.ts # TypeScript types
├── utils.ts # Moodle page parsing utilities
└── components/ui/ # UI components (Radix UI + Tailwind)
When a Moodle page loads, the extension:
- Parses the DOM and finds all available tests
- Adds "Хочу найти термин!" buttons to each test
- Checks if a search is already running (via Chrome Storage)
The modal window allows you to:
- Select a test from the list of available ones
- Specify a date range via calendar
- Specify a time range via dropdowns
- See already available slots (if any)
The useExamSearch hook manages all the logic:
const {
status, // Current search status
elapsedTime, // Time since search started
availableDates, // Found dates
parsedTimes, // Time slots by date
actions: {
cancelSearch, // Cancel the search
selectTimeSlot, // Manually select a slot
},
} = useExamSearch();Search algorithm:
- Loads configuration from Chrome Storage
- Parses available dates from the page DOM
- Filters dates within ±2 days of the selected range
- Loads time slots for each date
- Searches for an exact match with criteria
- If found — navigates to the registration page
- If not — refreshes the page after 10 seconds
Utilities for extracting data from Moodle DOM:
parseAvailableTests()— parses the list of tests with dates and linksparseAvailableTimes()— parses time slots on a day's pageparseTimesPage()— fetches and parses a page with time slots
# Install dependencies
pnpm install
# Development mode (Chrome)
pnpm dev:chrome
# Development mode (Firefox)
pnpm dev:firefox
# Build for all browsers
pnpm build- React 18 — UI components
- TypeScript — type safety
- Tailwind CSS — styling
- Radix UI — accessible UI primitives
- Vite — bundling
- Chrome Extension Manifest V3 — extension API
- Works only on
moodle.czu.cz - Requires Moodle authentication
- Does not guarantee registration (slot may be taken at the moment of navigation)
- The page must remain open during the search
MIT