Releases: adhamhaithameid/Classroom-Quick-Downloader
Classroom Quick Downloader v1.1.0
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
🎉 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
- feat: Production-Ready Analytics Pipeline, Batch Aggregation & Oracle Deployment by @adhamhaithameid in #76
- feat: Implement Detailed Analytics Archiver for Google Sheets by @adhamhaithameid in #79
- feat: Comprehensive Documentation Overhaul, Custom Policies & UI Polish by @adhamhaithameid in #80
- feat: Add system-wide health monitoring, Uptime Kuma integration, and docs update by @adhamhaithameid in #82
- equalizing the branches by @adhamhaithameid in #83
- Multi-Browser Support & Documentation Update by @adhamhaithameid in #84
Classroom Quick Downloader v0.11.1
🚀 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
withCorshelper to attach standard Access-Control headers to all public endpoints (/track,/config,/stats, etc.). - Preflight Handling: Added a dedicated handler for
OPTIONSrequests to satisfy browser preflight checks. - Result: The extension can now successfully
POSTto 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:
byCountrycounters 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 thehost_permissionslist inwxt.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.tsto 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
🚀 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
DownloadsDurableDurable 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:
byErrorTypetable)
-
-
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).reqCountDateto 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
hardRemoteOffflag and Danger Zone admin endpoints to manually:- “Cut power” to remote analytics (
remoteEnabled = false) - Restore power back when safe.
- “Cut power” to remote analytics (
New: Oracle flush pipeline with retry/backoff
-
Buffered events are periodically flushed to an Oracle backend:
- Size-based flush driven by
MAX_BATCH_EVENTSenv var. - Force flushes via admin API.
- Size-based flush driven by
-
Implemented robust error handling and backoff:
-
Maintains a
RetryStatewith:consecutiveFailureslastErrorlastFlushAttemptAtnextRetryAt
-
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.
- Records a clear error in
New: Public + admin API surface
Public endpoints:
-
POST /track– ingest batched events from the extension. -
GET /config– return dynamic client config:batchSizetimeFlushMinutes(low/mid/high usage thresholds)remoteEnabledquotadescriptor.
-
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 (sethardRemoteOff = true).POST /admin/restore-power– re-enable remote analytics.POST /admin/full-sync– loop flush until buffer is empty (or error).POST /debug/reset– hard 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 againstDO_SHARED_SECRET, then:- Fetch
/statsfrom the DO. - Render a rich analytics dashboard.
- Fetch
-
-
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).
- Visual indication of
-
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.
- Buttons that call
-
🧩 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
AnalyticsEventmodel with enriched metadata:-
status,file_type,duration_ms,bypass_used,error_type,source -
Automatically populated:
browserosext_versionlanguagetimestamp
-
-
Added poison-pill protection:
- Each event tracks
retryCount. - Events exceeding
MAX_RETRYare dropped with logging to avoid blocking the queue.
- Each event tracks
New: Dynamic config fetched from /config
-
Defined
AnalyticsConfig(batch size, three time-flush windows,remoteEnabled) and stored undercqd_analytics_config_v1. -
Added
refreshRemoteAnalyticsConfig():GET /configfrom Worker.- Derives safe defaults from
quotaif 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).
- Refreshes config every 3 hours (
-
New: Time- & size-aware flushing with backoff
-
Implemented queue flushing with combined triggers:
-
Size-based:
- Flush when
queue.length >= batchSize(dynamic from /config).
- Flush when
-
Time-based:
-
Flush after:
lowUsageFlushMinuteswhen queue is very small.midUsageFlushMinutesandhighUsageFlushMinutesfor higher queue sizes.
-
-
-
Respect remoteEnabled:
- If
remoteEnabledisfalse, queue is kept local (no network).
- If
-
Backoff logic mirrors Worker/DO ideas:
nextRetryAtandbackoffIndexstored incqd_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.
- Respects
-
New: Local stats for richer analysis
-
LocalStatsnow tracks more than just total successes:total,success,fail,attemptsbyType(grouped buckets: docs, sheets, slides, images, archive, video, audio, etc.)bySpeed(fast/medium/slow duration buckets)bypassCountfailByErrorType(normalized error codes likeBROWSER_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.downloadsinterruptions.
New: Background integration
-
background.tsnow:-
Imports
refreshRemoteAnalyticsConfigandAnalytics. -
Sets up:
- Flush alarm → calls
Analytics.flush()every 5 minutes. - Config alarm → refreshes remote config every 3 hours.
- Flush alarm → calls
-
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
packageManagermetadata to a newerpnpmversion (for local tooling alignment).
What's Changed
- Not stable yet by @adhamhaithameid in #58
- Per-tab runtime state, icons, badges, and download UX refactor (closes #59, #61, #63) by @adhamhaithameid in #62
- Implement Robust Analytics System & MV3 Background Flushing by @adhamhaithameid in #65
- Analytics Backend Infrastructure & Monorepo Restructuring by @adhamhaithameid in #66
- add Cloudflare DO backend, dynamic batching & admin dashboard by @adhamhaithameid in #71
Full Changelog: v0.7.0...v0.11.0
Classroom Quick Downloader v0.7.0
What's Changed
- Add 'Download all' button for group downloads by @adhamhaithameid in #57
Full Changelog: v0.6.7...v0.7.0
Classroom Quick Downloader v0.6.7
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
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
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
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
What's Changed
- Add comment frame overlay and badge to Classroom posts by @adhamhaithameid in #46
Full Changelog: v0.3.3...v0.4.0