Variants — differentiated assignments
One assignment, multiple prompt versions, routed by per-student tags like ESL, extended-time, or honors. No duplicate assignments, no follow-up DMs. The student opens the assignment and sees the version routed to them.
- What variants solve
- The tag → variant routing model
- Tagging students on the People tab
- Creating a variant on an assignment
- What a variant overrides (and what it doesn't)
- Routing order and the first-match rule
- The default variant — empty target tags
- How the student-side experience differs
- Privacy: what each student can and can't see
- Submissions stay bound to their variant
- Manually overriding a student's variant
- Tag autocomplete
- Common patterns — ESL, honors, extended-time
What variants solve
One class holds several reading levels at once — students at grade level, some below, some above, an IEP student who needs a simpler prompt, an ESL learner who'd write more if the prompt were shorter. Without variants you build three assignments and track which student got which, or send differentiation in a DM (untracked).
Variants give you one assignment with labelled versions, routed by a tag on each student's enrollment. Your roster drives the routing.
Variants are part of the assignment. Move the due date or change the rubric — every variant inherits.
The tag → variant routing model
Two pieces: tags on enrollments and target tags on variants. Free-form strings — no enforced vocabulary. Use esl, ell, level-2.
Tags live on the enrollment — the row connecting a student to one classroom. Ava tagged honors in AP Lit isn't tagged in Creative Writing.
Tags normalize on save — trimmed, lowercased, de-duplicated. Matching is lowercase.
honors in Period 4 doesn't affect Period 6.
Tagging students on the People tab enrollments.tags
Class → People. Each row has a tag area. Type into + tag, press Enter or comma to commit. Chip saves immediately. × removes.
No cap. A student tagged esl and extended-time matches either variant — see routing order.
Tag hygiene
The biggest cause of broken routing is a typo gap between enrollment tag and variant target. esl vs ELL doesn't match. Tag autocomplete reduces the risk.
Who can see tags
Teachers and co-teachers read and edit. TAs read only. Students never see tags — never on the profile, never in verify UI.
Creating a variant on an assignment assignments.variants
In the New/Edit assignment modal, scroll to Variants. + Add variant. Three fields:
- Label — e.g. ESL, Honors, Extended time. The student sees this as a pill, so keep it plain.
- Routes to students tagged — chip list. Any overlap with the student's tags makes this variant a candidate (OR). Empty list → default variant.
- Overrides — replacement instructions (markdown) and starter body. Blank inherits the base.
↑ / ↓ reorder; × deletes. Variants ship with the assignment on save.
What a variant overrides (and what it doesn't)
A variant replaces prompt text. Everything else comes from the base assignment. Overrides:
- Instructions — the markdown prompt. Most variants live here.
- Starter body — pre-filled editor text. Useful for ESL sentence frames.
- Attachments — variants share base attachments.
Shared:
- Title and due date
- Rubric and targets — same standards. A softer rubric per population is a grading-practice conversation.
- Sub-tasks
- Peer-review config
- Attempts cap, late policy, style preset
Routing order and the first-match rule
Red Stet walks variants top-down and stops at the first overlap with the student's tags. There's no merging; the student gets one prompt.
Order matters when a student has multiple tags. Diego with esl and extended-time sees whichever variant ranks higher.
How to order
Most specific first, most general last. "Severely-modified" at the top, catch-all "ESL" lower, empty-targets default at the bottom.
No tags or no match → base (or default variant — next section).
The default variant — empty target tags
Empty target tags = catch-all. Matches any student no earlier variant matched.
Use for inverted setups — most of the class on the harder version, a few on the easier one. Two patterns:
- Harder in the base, Standard variant targeting
standard. Works, but requires tagging every standard student. - Easier in the base, Honors default with no targets. Untagged students get Honors. No tagging needed.
The second pattern keeps the version most students get out of the base assignment, so the base itself still reads as a plain prompt.
How the student-side experience differs
The assignment looks normal. One signal: a pill near the top of the info panel — Variant: ESL, Variant: Honors.
Hovering the pill shows the matched tags. Accommodation policies usually require that disclosure. The base assignment shows no pill.
Everything downstream — editor, targets, rubric, materials, submit, gradebook — is identical. No chooser; students can't switch versions.
Privacy — what each student can and can't see
- Students don't see other students' variant labels. Diego sees his pill; Ava sees hers. Neither sees the other's content or knows the other is on a different variant.
- Students don't see other students' tags. Teacher/co-teacher/TA only. Even with roster visibility on, tags stay hidden.
Server-side resolution
Resolution is server-side. The Convex query reads tags, picks the variant, ships only that variant's content. Other variants stay on the server.
The resolved label travels to the client as resolvedVariantLabel. The content of other variants doesn't.
Use neutral labels — the resolved label is visible to the student. Don't put accommodation specifics ("IEP version") in the label.
Submissions stay bound to their variant submissions.variantId
On first edit, Red Stet stamps the variant id onto the submission. From there, the submission is anchored regardless of routing changes.
Routing can change after the fact. You can:
- Add or remove an enrollment tag
- Add a new variant mid-flight
- Change a variant's target tags
- Reorder variants
- Edit variant instructions or starter text
None retroactively change what an in-progress student writes against — unless you push an assignment update (see Creating an assignment).
The grade view shows each submission's variant, so you can filter to "ESL variant only" while grading.
Manually overriding a student's variant assignmentVariantOverrides
Use an override for one-offs: a student who needs a different variant on a single assignment without restructuring tags.
Gradebook row's kebab → Override variant opens a picker (every variant plus base). Pick, save. The row shows a pill.
Stored per (assignment, student), takes precedence over tag routing. Student sees it immediately; in-flight submissions keep their existing binding. Clearing the override falls back to tag routing.
Tag autocomplete classrooms.listUsedTags
Tag inputs show a <datalist> of every tag in use in the classroom. Pick a suggestion, commit — same chip as a freshly typed tag.
The list is the union of every tag on every enrollment. Updates as tags change.
This catches the silent miss: Diego is tagged esl, you type ell on a new variant, and routing breaks for a week. With autocomplete, esl is the first suggestion.
Common patterns — ESL, honors, extended-time
ESL / multilingual learners
Tag esl. ESL variant: shorter instructions (50-60% the length), simpler sentences. Same rubric and word-count — differentiate scaffolding, not standard. Sentence-frame starters ("In this story, I want to tell you about…") often help more than rewording.
Extended-time / IEP accommodations
Tag extended-time or iep. Same prompt restated as numbered steps, bullets on long paragraphs, requirement front-loaded. Keep the due date; for more time, use a per-student extension, not a variant.
Honors / stretch
Tag honors. Base prompt plus a "Push further" section requiring synthesis, counter-evidence, or meta-reflection.
Related
→ Creating an assignment — every section of the New Assignment modal.
→ Setting up your first class — People tab and roster basics.
→ Co-teachers and TAs — who can edit roster tags.
Hit a routing edge case this doc didn't cover? Email feedback — this doc grows by use.