Saving your own assignment templates
Once an assignment shape works — instructions, rubric, attempt cap, peer-review setup — save it as a template. The next assignment starts from that shape instead of an empty form.
- Why templates exist
- The starter templates Red Stet ships
- Saving an assignment as a template
- What actually gets saved
- Applying a template to a new assignment
- Per-teacher scope — yours alone
- Cross-classroom reuse
- Managing the library — edit, rename, delete
- Where templates are stored
- Copy-on-apply — past assignments don't change
- The "All options" demo template
- Related docs
Why templates exist
A working assignment carries a rubric, style preset, attempt cap, target word counts, sub-tasks, reference links, self-assessment prompts, sometimes peer review, sometimes variants — fifteen or more decisions.
Click From template… in the New Assignment modal, pick the shape, the form fills in. Week-specific content — passage, question, due date — you fill in fresh.
A template holds the structural decisions, not the week's content.
The starter templates Red Stet ships
The picker isn't empty on day one. Six starters cover common secondary and early-college writing patterns:
- Close reading essay — 500–800 words, MLA, 4-criterion rubric.
- Research paper — 1200–1500 words, APA, 5-criterion rubric with counterargument; 2-attempt cap.
- Persuasive essay — 600–900 words, 4-criterion rubric weighted toward audience awareness.
- Reflection journal — 300–500 words, single attempt, no rubric — engagement-graded.
- Discussion post — 150–250 words plus a reply, single attempt, no rubric.
- All options demo (kitchen sink) — every field populated (see below).
Starters live in code, identical for every teacher. To tweak one, apply it, change what you want, then Save as template.
Saving an assignment as a template Save as template
Fill out the New Assignment modal, click Save as template in the header. The name prompt pre-fills with the assignment's title — usually just hit Enter.
The name is for you; students never see it. "Close reading — short prose" beats "Lit assignment 1". Picker sorts by most-recently-updated.
To build outside the modal: the Assignment templates panel on the dashboard has a + button for a dedicated editor. Useful when stocking the library at the start of a year.
What actually gets saved
The modal's Save-as-template button captures the reusable fields:
- Title — placeholder for the new assignment.
- Instructions — the markdown body.
- Style preset —
chicago,ap,apa, ormla. - Max attempts.
- Rubric — criteria with names and descriptors.
The dashboard editor adds two more: a description (note to your future self) and a default due-date offset in days — 14 pre-fills the due date two weeks out.
What's not captured by Save-as-template: sub-tasks, reference links, self-assessment prompts, peer-review config, variants, target word/page/citation counts. The kitchen-sink starter shows these exist — apply it and tweak.
Applying a template to a new assignment From template…
Open the New Assignment modal, click From template…. The picker has two sections:
- Starter templates — always visible.
- Your saved templates — newest-touched first. Empty libraries show "no saved templates yet."
Each card shows name, meta summary (style preset, attempt cap, rubric size), and the first 180 instruction characters. Click; modal fills in, picker closes. Fill in the assignment-specific bits — due date, classroom.
Applying overwrites whatever you'd typed. Cancel if you opened the picker by mistake.
Per-teacher scope — yours alone, with explicit sharing teacherUserId
Every template you save is yours. Backend keys each row by teacherUserId; listMine returns only the caller's rows. Co-teachers don't see your library; you don't see theirs.
To bridge, Share any saved template into one of three scopes:
- Co-teachers — every staff member on the originating classroom gets a notification; the template lands in their Shared with you sub-section.
- Department — set a label (e.g. "English department"). Anyone with the same label sees the row.
- Organization — school-wide. The cross-org admin surface ships in Phase 9; today, org rows land in the table but only the owner sees them.
Sharing is a copy. The receiver's Import mints a new row — no live link back. Later edits to the shared template don't reach existing imports.
JSON export / import
For teachers in different orgs, the Shared with you section has an upload-arrow button for a JSON file. Each row has a download arrow to export. Same shape as shareAssignment minus storage IDs. Hand off the file however; the receiver imports through the same button.
Cross-classroom reuse
Templates scope to you, not to a class. Save one in AP Lit Period 4 and it's in the English 11 Period 2 picker immediately. No per-class list, no "copy to another class" step.
At term boundaries: when Fall AP Lit archives and Spring AP Lit spins up, no migration — templates were never bound to the class.
Managing the library — edit, rename, delete
The Assignment templates panel on the dashboard manages everything. Each row carries name, meta (style preset, attempt cap, rubric size, due offset), and three actions: Apply, Edit, Delete.
Edit
Opens the full editor. Save replaces the old version.
Apply to new assignment
Starts from the dashboard, not the modal: click Apply, the active classroom's create form opens pre-filled.
Delete
Removes the template. Past assignments stay intact — each got its own copy at apply time (see copy-on-apply). Permanent; no undo.
Personal reflection-prompt templates personalReflectionPromptTemplates
A narrower second library: reflection prompts. Each template is one tab's worth of self-assessment questions — same shape as assignments.selfAssessmentPrompts.
The reflection-prompts editor inside the modal has two controls:
- Load from template… — dropdown, newest first. Picking one replaces the prompts on the active attempt tab.
- Save as template — captures the visible attempt's prompts. Copied by value; later assignment edits don't write back.
Per-teacher scope (ownerUserId). No shared surface.
Source: personalReflectionPromptTemplates.listMine, create, remove. No edit mutation — delete and re-save to change one.
Where templates are stored teacherAssignmentTemplates
One Convex table — teacherAssignmentTemplates — in convex/teacherAssignmentTemplates.ts. Each row:
teacherUserId— owner;by_teacherindex.name,description— labels.title,instructions— assignment-shape fields.stylePreset,maxAttempts,rubric,defaultDueOffsetDays— pre-fill values.createdAt,updatedAt.
Three mutations: create, update, remove. All require teacherStatus === 'verified'; update/remove check ownership.
Starters live in public/app.js as STARTER_TEMPLATES. Never hit Convex, never count against your total, change only on app deploy.
Copy-on-apply — past assignments don't change
Apply copies the template's fields into the new assignment. From there the assignment owns its own rubric, instructions, everything. Edit the template later — the published assignment doesn't move. Delete the template — the assignment is untouched.
The flip side: a typo fix doesn't propagate. Past assignments keep the typo until you edit them directly.
The "All options" demo template
The last starter — All options demo (kitchen sink) — populates every field the modal supports. Fastest way to see how each section renders for students.
What's in it:
- Markdown body with headings, bold/italic, inline code, block quote, code block, link.
- Starter body — text Red Stet pre-fills into the student's doc.
- Target word count (600–900), pages (2–4), citations (3).
- 4-criterion rubric.
- Four sub-tasks with weights.
- Three reference links.
- Three self-assessment prompts (two required, one optional).
- Peer review, two reviewers, anonymized.
- Two variants —
eslandextended-time.
Apply to a throwaway assignment and walk the modal; apply to a sandbox student account and see the other end. Creating an assignment covers each section in detail.
Sharing surfaces — where templates land for others
Receivers see shared templates in the Shared with you sub-section under Assignment templates. Each row: owner's name, scope ("co-teachers", "department", or "org"), preview with rubric count + peer-review flag.
Two actions per row:
- Import copies into the receiver's library. From there: edit, share onward, or apply.
- Export (down arrow) downloads as JSON for hand-off to another org.
Co-teacher scope fires a bell notification. Department and org scopes are silent — discovered on next visit.