Skip to content

Releases: adhamhaithameid/Classroom-Quick-Downloader

Classroom Quick Downloader v1.1.0

21 Dec 06:03
ca12fc3

Choose a tag to compare

Summary

Welcome to the CQD era! Version 1.1.0 brings a fresh identity to the extension, alongside major stability improvements for Firefox users and a more refined user interface.

🚀 What’s New?

  • New Identity: GCD is now CQD (Classroom Quick Downloader). We’ve updated our logo and branding across the entire extension for a cleaner, more modern look.
  • Enhanced Firefox Stability: We’ve overhauled the download engine for Firefox. No more stuck downloads or authentication loops when using university or work accounts.
  • Smarter Account Handling: The extension now intelligently detects and preserves your authuser (the specific Google account you're using), making multi-account switching seamless.
  • Drive ID Matching: Downloads are now tracked by unique File IDs instead of URLs, ensuring that even if a filename changes, your download status remains accurate.

🎨 UI & Experience Improvements

  • Visual Clarity: Replaced the error icons with a high-contrast minimalist design for better visibility.
  • Dynamic Buttons: Download buttons now adjust their width automatically based on the text content, preventing awkward clipping.
  • Cleaner Badges: Refined the "Edits" flag by removing redundant prefixes, keeping your Classroom stream clutter-free.

🛠️ Technical Fixes

  • Fixed an issue where "Virus Warning" pages in Google Drive would occasionally interrupt the download flow.
  • Improved background script performance by optimizing storage calls.
  • Resolved CSS bugs related to legacy browser prefixes and flexbox layouts.
  • Added "Fail-Fast" logic to detect restricted files (403 errors) immediately, saving you time.

Platform-Specific Snippets

For Chrome Web Store & Edge Add-ons

"The fastest way to save your Classroom materials just got a makeover. Meet CQD. This update focuses on branding consistency and UI refinements to make your workflow even smoother."

For Firefox Add-ons (AMO)

"Major stability update for Firefox! We’ve implemented a robust bypass system to handle Google Drive authentication natively within Firefox, ensuring a reliable 'one-click' experience for all academic accounts."

What's Changed

  • flushing both branches for new features / bug fixes to continue by @adhamhaithameid in #88
  • release: v1.1.0 – Firefox Stability, UI Refinements, and CQD Branding by @adhamhaithameid in #90

Full Changelog: v1.0.0...v1.1.0

v1.0.0

17 Dec 18:04

Choose a tag to compare

🎉 Release v1.0.0 — Multi-Browser Support & Production-Ready Analytics

Classroom Quick Downloader is now officially ready for production! This major release introduces multi-browser support, comprehensive monitoring, and complete documentation coverage.

🌟 Highlights

• 🌐 Multi-Browser Support
• Chrome Extension — Ready for Chrome Web Store (Pending Review)
• Firefox Add-on — Ready for Mozilla Add-ons (Pending Review)
• Edge Extension — Compatible with Microsoft Edge

📡 Production Monitoring

• Uptime Kuma Integration — Self-hosted monitoring on Oracle Cloud
• Live Status Badges — Real-time health indicators in README
• Database Health Checks — New /health/db endpoint for SQLite integrity
• Cron Job Monitoring — Push notifications for daily archiver runs

📚 Documentation Overhaul

• Privacy Policy ( PRIVACY.md ) — Chrome Web Store compliant privacy documentation
• Component READMEs — Detailed docs for Extension, Worker, and Backend
• Mozilla Reviewer Instructions — Build instructions for AMO source code review
• System Architecture Diagrams — Mermaid flowcharts for data pipelines

✨ What's New

🧩 Extension

• Refreshed icons (all sizes: 16, 32, 48, 96, 128)
• Multi-browser build scripts (build:firefox, zip:firefox)
• Mozilla reviewer build instructions in README

⚡ Cloudflare Worker

• Geo-country detection via X-Geo-Country header
• Enhanced dashboard UI with aligned login form
• Live status badge integration

🏛️ Oracle Backend

• New: /health/db endpoint for database integrity checks
• New: Uptime Kuma push notification in archiver
• Comprehensive system monitoring documentation
• Cron monitoring flow with Mermaid diagrams

📊 Analytics & Archiver

• Detailed breakdowns in Google Sheets archive
• Geo-country data now tracked
• Daily automated exports with cron verification

🔧 Infrastructure

Component Status
Oracle Backend ✅ Monitored
SQLite Database ✅ Health Checked
Cloudflare Worker ✅ Monitored
Daily Archiver ✅ Push Monitored

📦 Downloads

Browser Package
Chrome Extension Versions/Chrome Extension.zip
Firefox Extension Versions/Firefox Extension.zip
Edge Extension Versions/Edge Extension.zip

Full Changelog: v0.11.1...v1.0.0

What's Changed

Classroom Quick Downloader v0.11.1

10 Dec 07:49

Choose a tag to compare

🚀 Release v0.11.1 – Analytics Connectivity & Geo-Location Fixes

This patch release resolves critical networking issues preventing the extension from communicating with the new analytics backend. It also improves data accuracy by hydrating location data on the server side.

If you noticed analytics events not showing up in v0.11.0, this update fixes the "blocked by CORS" and missing permission errors.


🌐 Cloudflare Analytics Backend

Fixed: Cross-Origin Resource Sharing (CORS)

  • Global CORS Headers: Implemented a withCors helper to attach standard Access-Control headers to all public endpoints (/track, /config, /stats, etc.).
  • Preflight Handling: Added a dedicated handler for OPTIONS requests to satisfy browser preflight checks.
  • Result: The extension can now successfully POST to the backend without being blocked by browser security policies.

Improved: Country Derivation (Geo-Location)

  • Server-Side Hydration: The Durable Object now inspects the incoming Cloudflare request context (request.cf.country).
  • Fallback Logic: If the extension sends an event with a missing country, the backend automatically fills it using the request's origin.
  • Stats Accuracy: byCountry counters now use this effective country instead of defaulting to "unknown", ensuring better geographic breakdowns on the dashboard.

Fixed: Durable Object Binding

  • Corrected the Durable Object ID derivation logic (idFromName("DownloadsStats")). This ensures the Worker connects to the correct persistent storage instance.

🧩 Extension Telemetry Client

Fixed: Host Permissions

  • Manifest Update: Added https://cqd-analytics.adhamhaithameid.workers.dev/* to the host_permissions list in wxt.config.ts.
  • Why: Without this, the browser strictly blocked the extension from initiating network requests to your specific Cloudflare worker domain.

🧱 Infra & Tooling

  • Refactor: Minor cleanup in cloudflare-worker/src/index.ts to separate CORS logic from core routing.

What's Changed

  • Fix CORS and Host Permissions for Analytics
  • Improve Country Detection in Durable Object

Full Changelog: v0.11.0...v0.11.1

Classroom Quick Downloader v0.11.0

10 Dec 05:41
fe92ee4

Choose a tag to compare

Pre-release

🚀 Release v0.11.0 – Analytics Backend & Telemetry Overhaul

This release introduces a full end-to-end analytics pipeline for Classroom Quick Downloader, powered by a Cloudflare Worker + Durable Object backend and a new, resilient telemetry client in the extension.

Most of the changes are non-UI, but they dramatically improve observability, quota safety, and reliability of analytics.


🌐 Cloudflare Analytics Backend

New: Durable Object–powered ingestion & aggregation

  • Implemented DownloadsDurable Durable Object to:

    • Buffer raw analytics events received from the extension.

    • Maintain aggregate counters:

      • Total events / downloads

      • Success vs fail counts

      • Breakdowns by:

        • file type
        • browser
        • OS
        • extension version
        • language
        • country
        • error type (new: byErrorType table)
    • Track timestamps (lastEventAt, lastFlushAt) and pending events.

New: Quota-aware traffic control

  • Added daily request accounting:

    • reqCountToday (approximate number of analytics requests for the current UTC day).
    • reqCountDate to automatically reset counts at day boundaries.
  • Introduced computeQuotaDescriptor() to classify load into quota bands:

    • BELOW_LIMITS, QUOTA_VERY_SOFT_LIMIT, QUOTA_SOFT_LIMIT, …, QUOTA_VERY_HARD_LIMIT
  • For each band, the DO computes:

    • modeLabel (e.g. chill, kinda busy, emergency)
    • batchSizeSuggestion (e.g. 50 → 100 → 150 → 200 → 250 → 300 → 500)
    • remoteEnabled (automatically turns off at highest tier to protect quotas)
  • Added hardRemoteOff flag and Danger Zone admin endpoints to manually:

    • “Cut power” to remote analytics (remoteEnabled = false)
    • Restore power back when safe.

New: Oracle flush pipeline with retry/backoff

  • Buffered events are periodically flushed to an Oracle backend:

    • Size-based flush driven by MAX_BATCH_EVENTS env var.
    • Force flushes via admin API.
  • Implemented robust error handling and backoff:

    • Maintains a RetryState with:

      • consecutiveFailures
      • lastError
      • lastFlushAttemptAt
      • nextRetryAt
    • Schedules DO alarms using exponential-style backoff to avoid hammering Oracle.

  • If configuration is missing (e.g., ORACLE_ENDPOINT/DO_SHARED_SECRET), the DO:

    • Records a clear error in retryState
    • Schedules retries instead of tight failure loops.

New: Public + admin API surface

Public endpoints:

  • POST /track – ingest batched events from the extension.

  • GET /config – return dynamic client config:

    • batchSize
    • timeFlushMinutes (low/mid/high usage thresholds)
    • remoteEnabled
    • quota descriptor.
  • GET /stats – return full JSON state, including:

    • totals
    • breakdown counters
    • pending events
    • retry state
    • quota descriptor
    • EnvSnapshot (MAX_BATCH_EVENTS, ORACLE_ENDPOINT).
  • GET /health – lightweight health probe (pending events + timestamps).

Admin / “Danger Zone” endpoints (require X-Admin-Secret):

  • POST /admin/force-flush – send buffered events to Oracle immediately.
  • POST /admin/cut-power – disable remote analytics (set hardRemoteOff = true).
  • POST /admin/restore-power – re-enable remote analytics.
  • POST /admin/full-sync – loop flush until buffer is empty (or error).
  • POST /debug/resethard reset: wipe state (counters, buffer, retry state).
  • POST /debug/flush – dev helper, currently a stub with diagnostic output.

New: Authenticated HTML dashboard

  • Replaced the old static HTML with a login-gated admin dashboard at /:

    • GET / – show password form.

    • POST / – validate password against DO_SHARED_SECRET, then:

      • Fetch /stats from the DO.
      • Render a rich analytics dashboard.
  • Dashboard UI includes:

    • Total events / downloads / success / fail.

    • Pending events and last event / flush timestamps.

    • Quota “chips”/tags:

      • Visual indication of modeLabel (chill / normal / busy / emergency / admin-cut-power).
    • Breakdowns:

      • By status, type, browser, OS, extension version, language, country, error type.
    • Danger Zone controls:

      • Buttons that call /admin/force-flush, /admin/cut-power, /admin/restore-power, /admin/full-sync.

🧩 Extension Telemetry Client

New: Queue-based analytics pipeline (MV3-safe)

  • Rewrote the extension analytics client to use a persistent queue in chrome.storage.local:

    • pending_events – raw event queue (always survives service worker restarts).
    • local_stats – aggregated local stats used by the popup UI and future dashboards.
  • Introduced AnalyticsEvent model with enriched metadata:

    • status, file_type, duration_ms, bypass_used, error_type, source

    • Automatically populated:

      • browser
      • os
      • ext_version
      • language
      • timestamp
  • Added poison-pill protection:

    • Each event tracks retryCount.
    • Events exceeding MAX_RETRY are dropped with logging to avoid blocking the queue.

New: Dynamic config fetched from /config

  • Defined AnalyticsConfig (batch size, three time-flush windows, remoteEnabled) and stored under cqd_analytics_config_v1.

  • Added refreshRemoteAnalyticsConfig():

    • GET /config from Worker.
    • Derives safe defaults from quota if individual fields are missing.
    • Persists config for use by all future flush decisions.
  • Background service worker:

    • On startup: fetches config once.

    • Via chrome.alarms:

      • Refreshes config every 3 hours (ANALYTICS_CONFIG_ALARM).

New: Time- & size-aware flushing with backoff

  • Implemented queue flushing with combined triggers:

    • Size-based:

      • Flush when queue.length >= batchSize (dynamic from /config).
    • Time-based:

      • Flush after:

        • lowUsageFlushMinutes when queue is very small.
        • midUsageFlushMinutes and highUsageFlushMinutes for higher queue sizes.
  • Respect remoteEnabled:

    • If remoteEnabled is false, queue is kept local (no network).
  • Backoff logic mirrors Worker/DO ideas:

    • nextRetryAt and backoffIndex stored in cqd_analytics_meta_v1.
    • Uses a stepped backoff (1 min → 5 → 15 → 30 → 1h → 3h → 6h → 12h → 1d).
  • A background alarm (ANALYTICS_FLUSH_ALARM) runs every 5 minutes:

    • Calls Analytics.flush() which:

      • Respects nextRetryAt
      • Checks if time/size conditions are met before attempting a flush.

New: Local stats for richer analysis

  • LocalStats now tracks more than just total successes:

    • total, success, fail, attempts
    • byType (grouped buckets: docs, sheets, slides, images, archive, video, audio, etc.)
    • bySpeed (fast/medium/slow duration buckets)
    • bypassCount
    • failByErrorType (normalized error codes like BROWSER_START_FAIL, AUTH_ALL_FAILED, etc.)
    • byLanguage
  • recordDownloadEvent() now:

    • Handles both success and fail flows.
    • Tracks whether Drive bypass was used.
    • Captures browser error codes from chrome.downloads interruptions.

New: Background integration

  • background.ts now:

    • Imports refreshRemoteAnalyticsConfig and Analytics.

    • Sets up:

      • Flush alarm → calls Analytics.flush() every 5 minutes.
      • Config alarm → refreshes remote config every 3 hours.
    • Performs an initial config fetch when the background is initialized.


🧱 Infra & Tooling

  • Bumped extension and worker package versions to 1.0.0.
  • Updated Cloudflare Workers types to a newer version for better type coverage.
  • Updated monorepo packageManager metadata to a newer pnpm version (for local tooling alignment).

What's Changed

Full Changelog: v0.7.0...v0.11.0

Classroom Quick Downloader v0.7.0

29 Nov 02:50
e240b2c

Choose a tag to compare

Pre-release

What's Changed

Full Changelog: v0.6.7...v0.7.0

Classroom Quick Downloader v0.6.7

23 Nov 23:15
a1e3c30

Choose a tag to compare

Pre-release

What's Changed

  • Compute edited-day diff from full post text, Add tooltips for Comments, Edited, & Both States, edited the scan interval for the download button, comments frame, & edited frame to never disappear. by @adhamhaithameid in #56

Full Changelog: v0.6.0...v0.6.7

Classroom Quick Downloader v0.6.0

22 Nov 20:55
c06aab6

Choose a tag to compare

Pre-release

What's Changed

  • Add a brand new edited frame, Add a new "both" state frame, Fixed the theme algorithm, Add a debounce flag, Add dark mode style and colors, Add theme algorithm, Add better variables by @adhamhaithameid in #53

Full Changelog: v0.5.3...v0.6.0

Classroom Quick Downloader v0.5.3

22 Nov 11:09
3666f05

Choose a tag to compare

Pre-release

What's Changed

  • Added translations for all 75 Google Classroom supported languages, Improve translation lookup and error handling by @adhamhaithameid in #49

Full Changelog: v0.4.37...v0.5.3

Classroom Quick Downloader - v0.4.37

20 Nov 23:54
f0b60ae

Choose a tag to compare

Pre-release

What's Changed

  • enhance background logic, added a "trying" state, Refactors background.js to improve Drive download bypass robustness, error handling, and tab management. Improve Drive authuser handling and bypass logic, made the downloading process a lot faster by @adhamhaithameid in #48

Full Changelog: v0.4.0...v0.4.37

Classroom.Quick.Downloader.v0.4.0

19 Nov 23:33
8fc93c7

Choose a tag to compare

Pre-release

What's Changed

Full Changelog: v0.3.3...v0.4.0