SQL Editor & Execution
Syntax-highlighted editor — CodeMirror-based SQL editor with MySQL-aware highlighting and bracket matching.
Autocomplete — table/column suggestions as you type, or trigger manually.Ctrl+Space
Run All — executes every semicolon-separated statement in the editor, one after another, stopping at the first failure.
Run statement under cursor — runs only the statement your cursor is inside, without touching the rest of the script.Ctrl+Enter
Live execution highlighting — the statement currently running is highlighted in the editor; on failure it's underlined with a gutter warning icon on the exact error line when MySQL reports one.
Multi-tab editor — open, rename, close, and cycle between multiple query tabs, persisted across reloads.Ctrl+Alt+T / W / ←/→
Query tabs sync across devices — once you're identified, your open tabs and their content follow you to any other browser/device under the same student name, not just this one. If two devices save at nearly the same time, you're asked which copy to keep.
Tab version history — a rolling snapshot of your query tabs is kept automatically (at most one per minute, last 15 kept), or checkpoint one on demand with the save icon next to your tabs. The clock icon opens Version History to preview and restore an earlier point — your current tabs are snapshotted first, so restoring is itself undoable.
SQL formatter — auto-indents and reformats the current query.Ctrl+Shift+F
Typing timer — tracks how long you spent composing a query before running it (visible to instructors in the shared history).
Quality Report — live 0–100 score with rule-based checks (unscoped UPDATE/DELETE, SELECT *, missing LIMIT, common typos).
Auto-correction hints — flags common typos (SELETC, FROMM, WHER, etc.) and suggests the corrected query.
Keyboard shortcuts reference — full shortcut list in one modal.Shift+?
Results Grid
One tab per statement — running multiple statements shows a separate result tab for each, with its own row count and timing.
Pin a result tab — keep a tab's data visible across your next query run, for side-by-side comparison.
Pagination — large result sets are paged client-side so the browser doesn't choke on huge tables.
Drag-to-reorder / resize columns — rearrange and resize columns in the results grid directly.
Click-to-sort columns — click a column's sort icon to cycle ascending → descending → unsorted; numeric columns sort numerically, everything else alphabetically.
Quick filter — filter box in the results toolbar matches text across every cell in the active result tab.
Conditional formatting — heatmap-style color scale over numeric columns.
Outlier highlighting — flags values outside 1.5× the interquartile range for a column.
Colorblind-safe palette — swaps the red/green heat scale for a blue/orange scale.
Export to CSV / Excel / JSON — download the active result tab as a .csv, .xlsx, or .json file.
Copy / download as image — screenshot the visible page of the active result tab straight to your clipboard, or download it as a .png.
Save as New Table — turns the active result tab's query into a real table (CREATE TABLE ... AS SELECT ..., run server-side so it gets MySQL's own inferred column types), landing in your private sandbox with the same isolation as any table you create by hand. Undoable via Undo Last Write.
Database Modes & Sandboxing
Read-Only / Read-Write modes — the main database is protected as Read-Only; a separate Read-Write sandbox is where you practice INSERT/UPDATE/DELETE/DDL safely.
Private per-student sandbox tables — every table you create in the Read-Write Sandbox is yours alone (mapped internally to stu_<you>_<table>, the same isolation convention CSV import already used) — two students can both use a table named students without colliding, and the Tables panel/schema diagram/DDL export only ever show your own tables.
Custom database workspaces — link your own external MySQL database and query it from the same editor.
CSV import — upload a CSV to create your own table in the sandbox, with automatic column-type inference and chunked uploads for large files.
Reset my imports — one click to drop every table you've created via CSV import or the SQL editor in your sandbox, and start clean.
Schema explorer — browse every table with optional auto-refresh so new/dropped tables show up automatically.
Hover for table info — hover any table in the explorer to see a quick size estimate and whether another active connection is currently running a query against it, right before you'd otherwise find out the hard way via a lock-wait error. Looked up on hover only, not on a timer, so it stays light on the shared database.
Data preview — click the eye icon next to any table in the explorer to peek at its first 100 rows instantly, no query needed.
ER diagram — visual entity-relationship diagram of the active database, inferring relationships from foreign keys/naming.
DESCRIBE & DDL export — inspect a table's structure or export/copy its full CREATE TABLE statement.
Execution plan (EXPLAIN) viewer — visualizes a SELECT's query plan with a relative scan-cost chart per table.
Query Stepper — walks a SELECT through its logical clauses (FROM → WHERE → GROUP BY → ...) one stage at a time, showing intermediate results.
Safety & Reliability
Undo Last Write — one-click reversal of your most recent INSERT, UPDATE, DELETE, DROP TABLE, TRUNCATE, ALTER TABLE, or CREATE TABLE in any non-read-only mode. Works on simple, single-table statements; snapshots are capped at 1,000 rows.
Query timeout — every statement is capped (30s) so a runaway or accidental cartesian-join query can't hang the session.
Live wait timer — the status banner counts up in real time while a query is running, so a blocked or slow write doesn't look frozen.
Cancel a running query — a Stop button next to Run aborts the currently executing statement server-side (KILL QUERY) instead of waiting out the full timeout.
Friendly concurrent-write messaging — if your write is blocked because another student is touching the same table, you get a plain-English "Another user is currently working on this table" message instead of a raw MySQL lock-timeout error.
Destructive-statement confirmation — running a DELETE/UPDATE with no WHERE clause, or a DROP TABLE/TRUNCATE, pops a confirmation modal listing exactly what's about to happen before it executes.
Protected system tables — internal bookkeeping tables (history, notes, shares, favorites, undo snapshots, watch sessions) are blocked from being queried or targeted directly.
Unscoped write detection — the Quality Report flags an UPDATE/DELETE with no WHERE clause before you run it.
Analytics & BI
Dashboards — build up to several chart cards from your result set, PowerBI-style.
Slicers & drill-down filters — filter the active dataset by column values, shared across every card.
Calculated measures — define derived columns (e.g. Revenue = Price × Qty) usable in charts, pivots, and insights.
Pivot table — Excel-style Rows/Columns/Value pivot with aggregation.
Quick Insights — automatic per-column statistics (min/max/avg/distinct counts).
Scatter plots with trendline — includes a computed linear trendline and Pearson correlation readout.
Sort & Top-N — sort any chart/table by a metric and cap it to the top N categories.
Export chart as PNG — download any dashboard card as an image.
Load a table directly into Analytics — explore a table's data without writing SQL first.
Python Lab
In-browser Python editor — runs entirely client-side via Pyodide, no server round-trip.
Auto-synced DataFrame — your last SQL result is automatically available as a pandas DataFrame (df) in Python.
Multi-tab Python editor — same tabbed workflow as the SQL editor, persisted across reloads.
Python formatter & run history — autopep8 formatting and a local history of every script you've run.
History & Collaboration
Session Activity (local history) — every query you run this session, one click to reload it into the editor.
Filter & sort session history — filter by text and sort Newest/Oldest/A→Z/Z→A, without disturbing which entries are starred or selected for a diff.
Favorites — star any history entry to save it permanently, synced server-side across your browsers/devices.
History diff — pick two past queries and see a line-by-line diff of what changed between them.
Global/shared history — every student's query runs, searchable and paginated, with per-entry notes. Filter to a single student via the student-selector dropdown, free-text search, or both together.
Share a query link — copy a link that reloads your exact query text for someone else, or a link that also carries a saved snapshot of your results.
Comments on shared snapshots — anyone who opens a shared query+results link can leave comments on it.
Watch Mode — broadcasts your live editor and results so an instructor can watch in real time, or (as the instructor) pick any currently-broadcasting student and mirror their screen. On by default for every student in every DB mode, so instructors never have to ask someone to flip it on first — toggle it off per browser if you'd rather not broadcast.
Admin Console
Password-gated dashboard — a separate admin.php page, protected by a shared admin password re-sent with every request (no accounts system needed).
Student overview — every student who's run a query, with total query count, success rate, total typing time, and first/last-seen timestamps.
Time-spent graph — a bar chart of typing time per student, filterable by day, month, or year, and by an individual student or everyone at once.
Multi-student live Watch Mode — every currently-broadcasting student shows up as its own live tile simultaneously, not one at a time — reuses the same Watch Mode data students already opt into.
Global history deletion — delete everything, one student's history, or a single query entry, with a search box to find a specific query by its text across every student.
Per-student and bulk sandbox reset — drop one student's sandbox/CSV-import tables, or every student's at once to start a fresh class session.
Custom workspace registry — see every registered custom database (without exposing stored credentials) and remove stale or unwanted registrations.
Common errors leaderboard — the most frequent failure messages across every student, with how many hit it and how recently — a quick signal for what to review again in class.
Sortable, searchable student table + CSV export — sort by any column, filter by name, and export the student overview or the time-spent data as a .csv for grading or records.
Per-student detail drill-down — click a student's name to see their recent queries, favorites, and sandbox table names in one place.
Rename a student — fix a typo'd name (e.g. "jhon" vs "john") across history, favorites, notes, and live sessions so their scattered records merge under one name. Doesn't rename their physical sandbox tables, which still use the old name.
Admin action audit log — a record of every destructive/mutating admin action (deletes, resets, renames, announcements) with details and a timestamp. There's no per-admin login, so this logs what happened and when, not who did it.
"Active now" indicator — a green dot next to a student's name in the overview table if they've been active in the last 5 minutes, separate from the full Watch Mode broadcast.
Broadcast announcement banner — post a short message from the admin console that shows up as a dismissible banner at the top of every student's SQL Lab. Dismissing it only hides that specific message — a new announcement reappears even with the same wording.
Configurable settings — query timeout, undo snapshot row cap, and CSV import column cap are editable from the admin console and take effect immediately for every student, no code changes or redeploy needed.
"Raise Hand" help requests — a HELP button flags a student in the admin console's Watch grid (pulsing border) and opens a pre-filled WhatsApp chat to the instructor's number as an instant heads-up. Sending the WhatsApp message still needs one tap on the student's end — a fully silent server push needs a paid WhatsApp Business API this app doesn't have configured.
Save a Watch Mode snapshot — a camera button on any live Watch tile saves what that student is looking at right now as a shareable link, using the same share mechanism students use themselves — no need to catch it live to grade or reference it later.