Skip to content

Projects

Projects I’m building and sharing, grouped by what they’re for. Each gets its own write-up as it grows.

BrauzerLab — interactive Playwright trainer

Section titled “BrauzerLab — interactive Playwright trainer”

A free, browser-based Playwright course, available in English and Azerbaijani. You write real Playwright (JavaScript/TypeScript) in an in-browser editor, watch a simulated page react, and get instant pass/fail feedback — no install, no setup. I built the missions and the validation engine from scratch. It’s the hands-on practice companion to the Playwright course.

What’s inside:

  • 100 hands-on missions across 7 progressive modules
  • Locators — roles, text, labels, test-ids, filters, and positional selectors (including Shadow DOM and dynamic IDs)
  • Actions & auto-waiting — clicks, typing, forms, drag-and-drop, plus reliable waits without flaky sleep
  • Assertions & strict mode — auto-waiting expect and clean handling of ambiguous locators
  • Network interception — block, mock, and stub requests with page.route
  • In-browser editor — CodeMirror-based, with a custom validation engine for instant feedback

Available in English and Azerbaijani.

Launch BrauzerLab → · More about it →

TestMarket Lab — the app you test against

Section titled “TestMarket Lab — the app you test against”

A small but real e-commerce web app, built as the target your test suites run against throughout the courses. It has a product catalog, cart, checkout and orders, customer and admin authentication, and a REST API — plus deliberate, stable test hooks so tests stay readable and repeatable. You clone it, run it locally, and automate it in both the Playwright course and Python for SDETs.

What’s inside:

  • A real stack — Express, EJS, and SQLite (better-sqlite3), with a five-table schema (users, products, cart, orders, order items) and real foreign keys.
  • Built for testing — stable data-testid selectors, a POST /api/reset endpoint that reseeds deterministic data, and API routes for test-data setup (POST /api/orders).
  • Accessibility & UI states — an accessible mobile nav plus loading, empty, error, and validation states — the situations real automation has to handle.
  • Two courses, one app — the shared practice target for the JavaScript Playwright course and the Python SDET course, so the skills transfer directly.

Built with Node.js (Express + better-sqlite3).

View the code →

Preparing for QA or SDET interviews? This is a practice app I built for exactly that. I wanted a helper I could use anywhere — at my desk or on the go — so I built one and opened it up for anyone in the same spot.

What’s inside:

  • Daily Practice — a focused daily plan mixing coding, SQL, Playwright/Selenium, API/CI/AWS, and strategy questions
  • Coding Gym — QA-focused tasks to build coding confidence in Python, Java, SQL, and TypeScript
  • Mock Interview — type an answer, reveal a model answer, and self-rate against a checklist
  • Study by ear (Commute Mode) — every topic as audio: a two-host podcast that talks through the interview traps out loud, plus a mock-interview round that models strong answers. Queue them and they play back-to-back — screen-free prep for the commute, the gym, or a walk, across all 18 topics
  • Cheat sheets & quizzes — 18 reference pages (Playwright, Selenium, SQL, Docker, Kubernetes, Python, Java, and more), each with its own multiple-choice quiz and instant feedback — including a Claude Certified Architect track with a 40-question mock exam
  • Progress tracking — completion metrics and a “weak topics” view across 525 practice items
  • Installable & offline — add it to your phone or desktop home screen like a native app; a service worker keeps the core screens working without a connection

There’s no login or setup — it runs in the browser and installs like a native app on desktop or mobile. What started as a quick proof of concept has grown into a fairly complete prep kit, and I’m still building on it. If you’re preparing from the ground up, it pairs well with the Playwright course and Python for SDETs.

Open the trainer → · View the code →

Exam Helper — exam prep for students in Azerbaijan

Section titled “Exam Helper — exam prep for students in Azerbaijan”

A free, browser-based study app for students in Azerbaijan. Pick a subject, read short lessons, then practise with tiered quizzes that grade instantly and explain every mistake — no install, runs in the browser. One bank-aware app serves 41 subject banks (grades 5–11, abituriyent, and a Russian-language section) from the same code, and every math answer is verified by an automatic answer-checker.

What’s inside:

  • 41 subject banks — grades 5–11, abituriyent, and a Russian section, across maths, sciences, languages and literature
  • Grade 5 Mathematics — 57 topics / 8 chapters, 1,710 questions, in Russian
  • Grade 9 buraxılış maths — 38 topics / 11 chapters, 1,140 questions, plus a full DİM-format practice exam
  • Tiered quizzes — easy / medium / hard / mixed, with per-mistake feedback
  • Verified answers — a deterministic answer-checker validates every math item before it ships

Built with TypeScript and Next.js (static export).

Open Exam Helper → · More about it →

Study Quiz — exam prep from course materials

Section titled “Study Quiz — exam prep from course materials”

A local exam-prep helper I built for my nephew, a software-engineering master’s student in Italy. He’d tried NotebookLM to turn his lecture slides and lab handouts into useful practice quizzes and couldn’t get there — so I parsed the study materials and built a tool that does. It runs entirely on his machine and works as a blueprint he can adapt to any course.

What’s inside:

  • Document parsing — pulls structured content from PowerPoint (.pptx), Word (.docx), and PDF lecture/lab files in a course folder
  • Revision summaries — short topic recaps with cross-references between related lectures and labs
  • Quiz generation — deterministic, topic-focused multiple-choice questions, fully offline by default
  • Optional LLM mode — plug in an OpenAI-compatible endpoint for richer questions, with automatic fallback to local generation
  • Local web UI — take quizzes in the browser; optionally save results to CSV

Built with Python.

View the code →

Quiz Formatter — PDF-to-quiz study helper

Section titled “Quiz Formatter — PDF-to-quiz study helper”

A study helper I built for my niece, a student at UNEC (Azerbaijan) who studies in Russian — so the app is in Russian. Her course materials arrive as PDFs of questions with an answer key; this tool turns them into practice quizzes.

It’s tuned to the specific layout of those UNEC course PDFs — a study tool for that format rather than a general-purpose PDF parser, so other document layouts may need adjusting.

What’s inside:

  • PDF parsing — pulls questions and answer choices straight out of the course PDF
  • Configurable quizzes — randomized quizzes with a chosen number of questions (--count)
  • Instant grading — checks your answers and explains mistakes using the answer key embedded in the PDF
  • Saved results — keeps your attempt history between sessions
  • Runs anywhere — a terminal, a local web UI, or a standalone Windows .exe

Built with Python.

Watch the how-to video → · View the code →

Grade 5 Math — interactive lessons & quizzes

Section titled “Grade 5 Math — interactive lessons & quizzes”

A self-contained math app I built for my sister, a (non-technical) math and Russian-language tutor. She — or her students — can download it, unzip, and start it with a double-click; no command line. It covers the Grade 5 mathematics curriculum, in Russian.

It’s the standalone, downloadable predecessor to Exam Helper’s Grade 5 maths bank — the same content, packaged to run offline on a tutor’s own machine rather than in the browser.

What’s inside:

  • 57 lessons across 8 chapters — explanations with visual examples
  • Tiered quizzes — easy / medium / hard / mixed, with per-mistake feedback
  • 1,710 questions — 10 per tier per lesson, randomised each session
  • Made for non-technical use — double-click to launch; the script installs what it needs on first run, then opens in the browser
  • Tested — unit tests for the quiz logic plus end-to-end browser tests

Built with TypeScript and Next.js (Docker-ready).

View the code →

Universal Appliances Repair — client website

Section titled “Universal Appliances Repair — client website”

A static marketing website I built for Universal Appliances Repair, an appliance repair service in Orange County, CA. It’s live in production and shows the testing-and-automation workflow I enjoy: every change ships through a PR gated by automated checks.

What’s inside:

  • Multi-page marketing site — home, services, about, contact, FAQ, testimonials, and a blog (hand-built HTML + Tailwind CSS, no framework, no build step)
  • Automated tests — an internal link checker and Puppeteer visual screenshot tests that must pass before any merge
  • PR-gated workflow — Husky pre-push hooks; no direct commits to master
  • Automated SEO content — a Claude Code agent runs the full lifecycle (research → write with JSON-LD schema → automated link + visual tests → PR → review → merge → deploy), so new local-SEO articles can be published automatically on a schedule whenever I switch it on; 40+ articles live so far, plus a periodic SEO audit that opens its own fix-up PR

Built with HTML + Tailwind CSS.

Visit the site → · View the code →

A small static marketing site I built and handed off for RMC Tow LLC, a towing and roadside-assistance business serving Corona and the Inland Empire, CA.

What’s inside:

  • Four pages — home, services, about, contact — hand-built in static HTML
  • Conversion-focused — prominent click-to-call CTA and a clear services breakdown (emergency towing, flatbed transport, roadside assistance)
  • Mobile-friendly + SEO basicstel: links, sitemap, and robots.txt, ready to rank locally

Visit the site →

Want to collaborate? [email protected]