Editors
The admin site’s Edit Lists page edits decks, collections, and wanted lists. Tabs at the top pick the list type, a dropdown picks the file, and the same editor opens for all three. The few per-type differences are covered at the end of this page.
Every edit is held in memory as a pending change until you press Save Changes. Before then you can undo, review the pending list, or discard everything.
Opening a list
Section titled “Opening a list”Open Edit Lists from the admin sidebar or the Dashboard card. Pick a list type with the tabs, then choose the file from the dropdown below them. Loading a file fetches its card data, printings, and prices from the cache.
The address bar follows both choices: #/edit/deck/Winota%20Stax is the deck editor with that deck open. You can bookmark or share it, and a reload returns to the same list. See page URLs.
A list’s description: (the blurb the built site prints above the cards) appears at the top of the editor as the public site renders it, collapsed behind Read more past 200 characters. It is read-only here. Write it with ritual metadata set <list> description …, the List Metadata route, or the MCP set_list_metadata tool. It is not a pending change, so an edit made elsewhere shows up on the editor’s next load.
How editing works
Section titled “How editing works”Each card has + and − buttons to add or remove copies. Reducing a card to zero removes it. In binder and overlap views the buttons appear as overlays on hover; in list view they are inline. The ⋯ button (or a right-click) opens the card’s context menu for everything else, and + Add Card in the bottom action bar adds new cards.
Change Tracking
Section titled “Change Tracking”All edits are pending changes in memory until you save.
- The Changes button shows the pending count and opens a dialog listing them
- Additive changes (add card, set commander, set finish, set printing, set language) are green; removals are red
- Opposite changes cancel out (adding then removing the same card). This happens only when the two copies are the same card in every respect, label override included. Re-adding a card as a proxy does not cancel the removal of a real copy
- Card names in the dialog open the card detail modal; hovering one shows a preview image
Saving and Discarding
Section titled “Saving and Discarding”Save Changes writes the file and appends to the changelog. It is disabled when nothing is pending. Saving again without leaving the editor folds the later changes into the same changelog entry (bumping its timestamp) rather than adding a new one. Reloading the file, or hitting a save conflict and reloading, starts a fresh session.
Discard Changes shows a confirmation dialog listing everything that would be lost.
The same confirmation appears whenever you navigate away with pending changes: picking another file, switching the Decks / Collections / Wanted Lists tab, moving to another page via the sidebar, or logging out. Confirming discards the changes; cancelling keeps you on the current file with them intact. Reloading or closing the tab raises the browser’s own “leave site?” prompt.
A save rewrites the whole file from its parsed cards, so it can only be applied to a file the parser read completely. If the file holds a line the parser cannot read (a stray comment, a malformed card line) or a fenced code block, the save is refused with a 400 naming each offending piece, and nothing is written. Fix or remove it in the file and reload. The editor reports the same content when it loads, so you see the problem before you start editing.
What a saved deck line looks like
Section titled “What a saved deck line looks like”A saved deck line carries the card’s printing metadata as optional fields:
- 1 Sol Ring (2XM:1) [foil] &1- 1 Lightning Bolt &2- 4 Island &3Fields in order (see List File Format for the full grammar):
(SET:CN): set code and collector number[finish]:nonfoil,foil, oretched[condition]:NM,LP,MP,HP, orDMG(NMis the default and is not written)[lang]: a Scryfall language code, omitted for English[labels]: the card’s label override, adjusting the list default ([trade,no-sale]). A deck carriesproxy/no-proxyonly#tags: the card’s tags, one comma-separated token. Every list type carries them{note}: the card’s note&N: persistent card ID, auto-assigned and used internally for change tracking
Collections and wanted lists write one line per copy with no quantity. A collection line always carries (SET:CN); a wanted line never carries [condition] or [labels]. See List Files.
Keyboard Shortcuts
Section titled “Keyboard Shortcuts”The editors can be driven entirely from the keyboard. Page-level shortcuts are suppressed while a dialog is open, so the dialog’s own keys always win:
| Key | Action |
|---|---|
| ? | Open the Keyboard Shortcuts reference, the same as clicking the ? button at the end of the action bar |
| Ctrl+Enter | Open the card search modal, the same as clicking + Add Card |
| Ctrl+B | Move focus into the bottom action bar, on its first enabled button |
| ← / → | While focus is in the action bar, move between its buttons (wrapping at either end). Tab still works as normal |
| Esc | While focus is in the action bar, drop focus back to the page |
The ? dialog lists every binding above plus the per-step keys of the add-card dialog. Because ? is an ordinary character, it only triggers when you are not typing in a text field.
On macOS, Cmd substitutes for Ctrl. The public site’s editor shares the action bar and dialogs, so it has the same shortcuts.
Editor Action Bar
Section titled “Editor Action Bar”A bar pinned to the bottom of the editor holds every editing control, left to right:
- + Add Card: opens the card search modal (see Adding Cards); also Ctrl+Enter
- Add Card Defaults: expands the defaults panel
- Sections: opens the Manage Sections dialog
- Categories: opens the Manage categories dialog (all three editors)
- Labels: opens the Default Labels modal (deck and collection editors)
- Cover Image…: opens the Cover Image modal (all three editors)
- Import…: loads an exported change bundle as pending edits
- Swap Printings…: opens the Swap Printings wizard over the whole list (deck and collection editors)
- Changes: shows the pending-change count and opens the changes dialog
- Undo: reverts the most recent change
- Save Changes / Discard Changes
- ?: opens the Keyboard Shortcuts reference
Adding Cards
Section titled “Adding Cards”Click + Add Card or press Ctrl+Enter to open the card search modal. Shortcut hints along its bottom edge change per step, and every step works from the keyboard. In the search box, Esc first clears what you typed; on an empty box it dismisses the modal, as clicking outside it does.
Step 1: Search
Section titled “Step 1: Search”- Type at least 2 characters. The search waits 500 ms after your last keystroke by default; change it with
searchDebounceMs - Your text is split on whitespace and every term must appear in the card name, in any order.
in trefinds “In the Trenches”;bolt lightfinds “Lightning Bolt”. Case, accents, and punctuation need not match (jaces archivistfinds “Jace’s Archivist”). The CLI prompts match the same way - Closest matches lead: a name you typed in full, then names your query prefixes, then names whose words your terms begin, then mid-word matches
- ↑/↓ move through results; Enter selects
- Hovering or moving to a card shows a preview image of its cheapest printing
The static public site’s editor is the exception. It queries the Scryfall API directly, which matches the query as one contiguous string, so its results can differ. A public site backed by a live API uses the term matching above.
Step 2: Select Printing
Section titled “Step 2: Select Printing”Choose a printing from the grid, which shows set, collector number, and price. In the Deck and Wanted List Editors you can also choose No specific printing.
Prices follow the selected price store. The step has its own USD-store selector (the same choice as the header’s Prices dropdown, shown when both USD stores are enabled). Each printing lists its alternate finishes under its main price, and the finish prices on the next step follow the same store. Card Kingdom quotes for printings no list carries are fetched as the grid opens, so a printing the search just found is priced like any other.
Keyboard: ←/→ move to the previous/next printing, ↑/↓ move a whole row (the row width follows the grid’s column count). Moving past the current page turns the page. Enter selects the highlighted printing.
Type to filter. Typing anywhere on this step builds a set-code / collector-number query in the filter box below the heading. It uses the same grammar as the CLI’s collector mode:
- An all-letter token matches set codes as a substring
- Any other token matches set codes or collector numbers.
16finds#161, not#516; leading zeros are trimmed, so0161finds it too - Every whitespace-separated term must match, in any order (
ds 12and12 dsare the same query) - A
:names the halves outright (mkm:123)
The box is never focused automatically, so the arrow keys keep driving the grid while you type. Backspace erases; Esc clears the query, and a second Esc closes the dialog. While a query is live the No specific printing tile is hidden. On touch devices, tap the box to type with the on-screen keyboard.
Step 3: Finish & Condition
Section titled “Step 3: Finish & Condition”This step appears when the selected printing has more than one finish.
- Select a finish (nonfoil, foil, etched)
- Select a condition (NM, LP, MP, HP, DMG). Deck and Collection editors only; defaults to NM
- Set a Quantity: how many copies of this exact printing to add. Starts at 1 and cannot go below it. Not shown when the dialog was opened via Change Printing…, which asks for a copy count beforehand
Focus lands on the first group’s selected option when the step opens.
- ←/→ move within the focused group: they change the finish or condition, and step the quantity while the quantity ticker has focus
- ↑/↓ (or Tab) move between the groups: finish, condition, quantity
- +/- adjust the quantity from anywhere in the step
- Enter adds the card from anywhere in the step, except while ← Back is focused, where it goes back
Two commit buttons finish the step, each with its shortcut shown in its corner (hidden on touch devices). Both add the chosen quantity of the chosen printing and show a ×N multiplier once the quantity is above one:
- Add Card (Enter) adds the card and closes the modal
- Add Another Card (Ctrl+Enter) adds the card, then returns to a fresh search step. Not offered when the dialog was opened via Change Printing…, which edits an existing card
A deck folds the added copies into one entry with a quantity. Collections and wanted lists store one entry per copy, since each copy carries its own condition and note.
Card Options
Section titled “Card Options”Beneath the printing grid, and again on the finish/condition step (bound to the same values), the dialog offers two optional per-card settings:
- Label: the label state the new card starts in. The choices are what the list type carries: the full vocabulary on a collection (plus No labels under a default), Proxy and Not a proxy on a deck (the latter under a
proxydefault), nothing on a wanted list. The card is written with the smallest token that gives it that state under the list’s default. The label is part of theaddchange itself, so it lands on the copy being added and never on a same-named card already in the list. - Custom art: a path inside the art directory or an image URL, validated as you type. An unusable reference is explained under the field and blocks the add until fixed or cleared. Unlike the printing, the art is not part of the change. It is held until the save gives the new line its
&N, then written straight after (see Custom Art). Admin editors only: the public editor exports changes and has no art file to write.
Both fields reset for the next card, including after Add Another Card.
Add Card Defaults
Section titled “Add Card Defaults”The Add Card Defaults toggle sits in the bottom action bar, between + Add Card and Changes. Clicking it expands a panel with the default fields. A dot on the toggle shows when any default is active. This mirrors the session filters in the CLI’s edit and add-card commands and is meant for batch entry: set the defaults once, then add many cards without confirming the same fields each time.
| Field | Deck Editor | Collection Editor | Wanted List Editor |
|---|---|---|---|
| Set codes | ✅ Comma-list | ✅ Comma-list | ✅ Comma-list |
| Finish | ✅ | ✅ | ✅ |
| Condition | ✅ | ✅ | ❌ Not applicable |
Defaults are kept per editor and persist across reloads in localStorage under ritual:admin:defaults:{deck,collection,wanted}.
How defaults change the add-card flow
Section titled “How defaults change the add-card flow”- Set codes: the printing picker shows only matching printings. If exactly one matches, it is auto-selected and the picker step is skipped. If none match, the picker shows all printings with a hint banner.
- Finish: pre-selected on the finish/condition step. If the chosen printing supports it, the step is skipped.
- Condition: pre-selected on the finish/condition step. The step is skipped only when both finish and condition are resolved.
When a default cannot be applied (the printing lacks the default finish, or the Collection Editor has no condition default) the finish/condition step still appears with the inputs pre-filled.
Context Menu
Section titled “Context Menu”Right-click a card, or click its ⋯ button in binder/overlap views, to open the context menu. Every editor offers:
- Set as Foil: greyed out when the printing has no foil, and on a card with no printing at all. Set the printing first and the row becomes available. The same rule holds outside the editors:
ritual set-card --finish foiland the MCPapply_changesset-finishaction both refuse a foil or etched finish on a line with no printing - Change Printing… (Set Printing… on a card with no printing): see Change Printing. On an entry with quantity > 1 it first asks how many copies to change
- Set Language…
- Edit Tags…
- Edit Categories…
- Set Custom Art…
- Move to section…: see Move to Section
- Move to list…: see Moving Cards to Another List
The Deck Editor adds Set as Commander, which moves the card to the Commander section (several commanders are allowed). The Deck and Collection Editors add Set Label… with their type’s choices, and Swap printing…, which opens the swap wizard on that one card. On a card with no printing, the wizard sets one from a copy owned in another list.
Move to Section
Section titled “Move to Section”Move to section… opens a picker listing every section except the card’s current one, plus New section…, which asks for a name and moves the card into the new section. The move is a set-section change. Latest wins: moving a card back to its original section cancels the pending move.
Change Printing
Section titled “Change Printing”Change Printing… reopens the printing picker used when adding a card, starting on the printing step for the card you clicked. Pick a printing (and finish/condition where applicable) to change the card.
On a card whose line has no printing yet, the menu row, the picker, and its copy-count prompt read Set Printing… instead. It is the same flow. Collection entries always have a printing, so only the Deck and Wanted List Editors show it.
When the card represents more than one copy (a deck entry with quantity > 1, or a collection tile that groups identical copies), a prompt first asks how many of the N copies get the new printing:
- Decks: changing all copies changes the entry in place, logged as one set-printing change. Changing some copies lowers the entry’s quantity by that amount and adds the same number of copies of the new printing under a new card ID, logged as a quantity decrease plus an add, so it is clear which copies moved.
- Collections: each copy is its own entry, so the chosen number of entries are changed individually (one set-printing change each). Untouched copies keep the old printing and re-group into a separate tile.
- Wanted lists: each row is a single entry and is changed directly.
Every printing change is recorded as a change event with the card ID and the target printing, and appears in the changelog (Set "Lightning Bolt" printing to M10:146 [foil] &5).
Sections
Section titled “Sections”Every list type supports named sections, which render as headed groups on the public site. Decks use them for Commander/Main/Sideboard/Maybeboard. Collections and wanted lists can use any sections you like (Trade Binder, Foils, High Priority).
Click Sections in the bottom action bar to open the Manage Sections dialog:
- Add a section: type a name and click Add Section (or press Enter). New sections start empty. Names must be unique case-insensitively: typing a name that already exists in any casing marks the input invalid, highlights the clashing row, and disables Add Section.
- Rename a section: click Rename on a row. All cards in that section move with it. A rename that collides with another section (case-insensitive) is rejected.
- Delete a section: click Delete on a row. Only empty sections can be deleted; the button is disabled while the section holds cards.
One kind of deck section does not survive a save while empty. An extras section (## Maybeboard, ## Tokens or ## Token, matched exactly as on List Files) is dropped when it holds no cards, whether you just created it or just removed its last card. Extras count toward no total, so an empty header is a leftover rather than content. Add a card to it in the same save if you want it to stick.
Cards with no explicit section belong to an implicit Main section, written out explicitly on the next save. On the public site, a list with two or more sections defaults to grouping by section, and Section becomes a grouping option in the toolbar. The Category and Categories groupings and the Category sort are offered on every list (a list with no categories shows one Uncategorized group). See Card Categories.
On disk, sections are ## Section Name headers beneath the list’s # Title, with card lines grouped under each. See Title and sections.
Multi-Select
Section titled “Multi-Select”Cards can be selected in every view mode for bulk actions. Hovering a card in binder, overlap, or stack view reveals a checkbox in its top-left corner; in list view the checkbox sits at the far left of each row. Click it, or Ctrl-click (⌘-click on macOS) anywhere on the card, to select it. A Selected (N) button then appears in the toolbar with the count of selected copies in the list you are editing. The selection survives grouping, sorting, and view-mode changes. A quantity group (4×) selects all of its copies at once and counts them individually; once some copies are removed it shows a dash instead of a checkmark.
The button opens a menu of actions over that list’s selection:
- Copy as Text: copies a quantity-prefixed
N Card Name (SET:Collector Number)list to the clipboard - Copy as CSV: copies the selection as CSV (
Name,Set,Collector Number,Finish,Condition,Language,Quantity) - Clear selection: deselects the current list’s cards only
The public site adds an Add to Trade action here. The admin site has no Trade Planner page, so it omits it.
Bulk Edit Actions
Section titled “Bulk Edit Actions”While a list is open in edit mode, the Selected (N) menu gains an edit section. It applies the same operations as a single card’s + / − buttons and ⋯ menu, over the whole selection at once:
- Add a copy / Remove a copy: bump each selected card up or down by one copy
- Remove from list (decks: Remove from deck): remove every copy of each selected card
- Set as Foil / Set as Nonfoil: set the finish on each selected card that supports it; others are skipped. Set as Foil is disabled while any selected card has no printing, since a finish belongs to a printing (Change Printing sets one). Set as Nonfoil stays available, since it clears a finish rather than asserting one
- Change Printing…: runs the printing picker over the selected cards one at a time (cancelling skips that card and continues)
- Swap Printings…: decks and collections. Opens the Swap Printings wizard with the selected cards pre-checked
- Set Language…: opens the language picker and applies the chosen language to every selected card
- Set as Commander: decks only. Marks each selected card as a commander
- Set Label…: decks and collections. Opens the label picker for the selection’s list type (a deck is offered Proxy, Not a proxy under a
proxydefault, and Use list default) and puts every selected card in the picked state. Hidden when the selection spans several list types, or when the type carries no labels (wanted lists) - Add Tag…: every editor. Opens the tags dialog empty, with the list’s tags as suggestions, and adds the typed tags to every selected card’s existing tags without replacing them. One pending
add-tagper card per tag it lacked, each its own Undo step - Move to section…: moves every selected card into an existing section, or New section… to name a new one
- Move to list…: moves every selected card into another list, carrying what Moving Cards to Another List describes
These edits go through the same pending-changes/undo flow as per-card edits, so nothing is written until you Save (admin) or export (public). The selection is cleared once an action is applied.
Selecting across lists
Section titled “Selecting across lists”Selections are held globally, so switching to another list or list type keeps them. Whenever anything is selected, an All Selected (N) button appears in the admin header on every page, with the total across all lists. Its menu runs the copy actions over the whole cross-list selection, and Clear all selections wipes every list.
View all selections… in that menu opens a dialog listing every selected card with its quantity, printing, finish, condition, and source list, in selection order or grouped by source. Each row’s ✕ removes one copy, and the copy/clear actions are repeated there. In the editor and on Move Cards, the Selected (N) menu’s View selected cards… opens the same dialog scoped to that page. A Show toggle switches between This page and All lists, and the dialog’s actions apply to whichever it is showing.
The cross-list menu also offers Remove all selected, which deletes every selected card from its list. The dialog offers it, with Move all to list…, in its Edit row, acting on the cards it is showing. On the admin site this writes every affected list file atomically in one pass (auto-committed to git when enabled), much like Move Cards. On the public site, which has no server, the list open in the editor is updated live, and removals for other selected lists are merged into those lists’ saved browser sessions, appearing the next time each is opened in edit mode.
Moving Cards to Another List
Section titled “Moving Cards to Another List”While editing a list you can move a card into another list without leaving the editor. This is separate from the Move Cards batch tool. A Move to list… item appears in three places:
- the per-card ⋯ context menu (moves that card),
- the per-list Selected menu (moves the current selection), and
- the cross-list All Selected header menu (moves every selected card from its own list).
Choosing it opens a picker listing your other decks, collections, and wanted lists. Pick one as the destination.
For the per-card and per-list Selected moves, choosing a destination removes the card from the list you are editing and stages a move. When you Save, both lists are written. The card is removed from the source (with a “Move … to …” changelog entry) and added to the destination (with a matching “Move … from …” entry). Moving a card with no printing into a collection, which requires one, opens a printing picker first.
Whichever way it moves, the card’s custom art and its tags, its note, and its labels go with it: a proxy stays a proxy and a real card stays real wherever both lists carry proxy, a sale/trade/keep state the source list stated (in its default or on the card) is kept, and a label the source never stated takes the destination’s default. The destination keeps only the labels its type accepts (proxy into a deck, all of them into a collection, none into a wanted list) and writes the smallest token that says so. A copy that merges onto a deck line with a different note keeps that line’s note, and the save reports the dropped one.
The cross-list All Selected move does not go through the editor’s Save button. It is applied immediately and atomically across every affected file via POST /api/move/selected, each card moving from its own list to the chosen destination.
Incoming moves
Section titled “Incoming moves”Pending changes can also carry incoming moves: a move-to recording a copy that arrives in the list you are editing from another list. A printing swap that pulls a copy you own elsewhere produces one, as does a bundle loaded through Import…. Save handles these symmetrically: the copy is added here and taken out of the source list, and both changelogs are written (“Move … from …” here, “Move … to …” on the source). The source copy is found by the source line id the change names when that line still holds the card; otherwise by the exact printing; otherwise (for a source line with no printing, such as a wanted entry) by name.
A move from the Swap Printings wizard that gives one of this list’s name-only lines a printing carries replacesCardId instead. The line is converted in place, keeping its &N, or split when only some of its copies are filled — or when the copy’s labels differ from the line’s (a proxy never turns a real line into proxies, nor the reverse), in which case the copy lands beside it with its own labels. No copy is added. Such a move may also carry a replacement: a printing added back to the source list in the section the departed line left, logged there as an Added line (see Save a List).
Every move, in either direction, is validated in memory before anything is written. A missing list, a source with no copy left to take, or a card with no printing headed into a collection fails the save with nothing written. A swap that leaves and enters the same other list stages both halves against one copy of its file. The moved copy’s tags, note, labels and custom art follow it both ways, by the rules above. An incoming copy that merges onto a deck line with a different note keeps that line’s note, and the save’s droppedNotes reports it. When the source holds several lines of the printing, the one whose effective labels match the copy’s is taken first, so a [proxy] copy leaves from the proxy line.
Swap Printings
Section titled “Swap Printings”The Deck and Collection Editors can re-pick printings for many cards at once using copies you already own in your other lists: upgrade a deck to the foils in a binder, or downgrade it to your cheapest copies. The result is a set of cross-list moves rather than edits to a single file. Lines with no printing yet take part too, so the wizard is also the way to batch-set printings on a deck’s name-only lines from copies your collections hold. The Wanted List Editor has no swap entry points.
Three entry points, all in edit mode:
- Swap Printings… in the action bar: every line of the list
- Swap Printings… in the multi-select Selected (N) menu: the selected cards are pre-checked
- Swap printing… in a card’s ⋯ context menu: opens on that one card and goes straight to its picker
The wizard’s steps:
- Cards: every line of the list, pre-checked, with a checkbox to leave any out. A line with no printing shows a “no printing set” note; it has nothing to swap away from and takes whatever printing you pick.
- Sources: which other lists to draw replacements from, with the same per-type / per-list scope control as the Find page. Decks and collections are on by default; wanted lists are off but selectable. The list being edited is never a source. Only the saved contents of other lists count; their unsaved edits are not seen.
- Mode: Manual (choose per card), Most expensive, or Least expensive. Controls on this step:
- A finish filter (any / foil / nonfoil) over the candidates, which also seeds the picker’s quick-filter.
- Where displaced copies go: back to the list each replacement came from (default), or one chosen deck or collection for all of them. A displaced copy can never land in a wanted list, so if a replacement comes from a wanted list and no override is set, the summary asks for a destination.
- Price modes only: what to do with a card that has an unpriced candidate (no declared market value; not “worthless”). Skip it unchanged and flag it for review (default), Ignore unpriced options and rank the rest, or Ask me to force a pick by hand. A name-only card’s missing printing is not an unpriced option; the price modes plan it from its priced candidates.
- Every mode, when a checked card has no printing: Cards without a printing → Replace the copies taken from other lists (off by default). A name-only card displaces nothing, so its source list is simply one copy short afterwards. With this on, a Replacements step asks which printing each of those lists gets back.
- Pick (manual mode, forced cards, and any card you Change…): per card, the candidate copies across the chosen sources (source list, printing, finish, price, copies available), with the same collector-grammar type-to-filter as the printing picker and a finish quick-filter. Copies are allocated per candidate row, so a card’s copies may come from several printings. Unfilled copies keep their current printing. A candidate with no printing in its source (a wanted line, or a name-only deck line) first asks you to confirm it is that entry, then opens the full printing dialog to say which printing it actually is.
- Review (price modes only; manual mode goes straight on from picking): every card, current → chosen printing with prices where known, flags (unpriced candidates, no candidates, partial), and a Change… button to override the pick.
- Replacements (only with the replace-taken option on, and only when a name-only card was given a printing): one row per source list and printing taken from it (
1× Lightning Bolt (LEA:161) taken from Binder), each with Choose replacement… (Change printing… once picked) opening the full printing grid. Rows fold by source list and printing, so two cards taking the same printing from the same list share one row and one pick. The chosen printing is added back to that list in the same quantity when the swap is saved. A row left empty leaves the list a copy short. No replacement clears a pick. - Summary: the planned moves grouped by list (in / out, with any replacement going back to a source shown under its “Taken from” group), the edited list’s value before → after with per-card deltas where priced, the displaced-copy destination when one is required, then Discard or Apply.
Apply records the plan into the editor’s pending changes. Each replacement is a move in from its source list and each displaced copy a move out to its destination, one change per physical copy (a deck line’s copies share its &N; a collection tile’s copies each carry their own). A copy arriving on a name-only line fills that line instead of adding to the list: the line keeps its &N and quantity when one printing fills it whole. A deck line filled partially or from several printings is split: one copy comes off the name-only line for each filled copy, which lands as an add would, and the name-only line goes (its id released) when its last copy is taken. No copy is displaced, so no move out accompanies it.
The edited view updates immediately, the moves appear in the Changes dialog, and undo walks them back one change at a time. Nothing is written until you Save, which, as with Move to list…, updates both sides: the edited list and every source/destination list, each with its own changelog entry. A source list promised a replacement gets that printing added (logged as an Added line) in the same save. On the public site the moves travel in the exported bundle’s top-level moves array instead, with a filling move marked pinsCardId and carrying its replacement.
Card Language
Section titled “Card Language”Every card entry has a language: a Scryfall code written on the line as a lowercase bracket token ([ja]) and omitted for English, so a bare line always means en.
- Set Language… in a card’s ⋯ menu (and in the multi-select Selected menu) opens a picker over the 17 Scryfall languages, with the current one marked. Picking English clears the token. The change is a pending
set-languageedit like any other: undoable, listed in Changes, and written on save (changelog:Set language of "Sol Ring" to Japanese &7). - Adding never asks for a language. New cards get the configured
defaultLanguage, editable on the admin Settings page. Change a copy afterwards with Set Language…. - The printing picker shows one tile per physical printing (set + collector number), never one per language. Under a non-English default, a printing that does not exist in that language is marked with a notice. Picking it records the copy in a language that does exist (English when available) rather than inventing one Scryfall has no card for.
Card Tags
Section titled “Card Tags”Every card entry on every list type can carry tags: your own words for the card as a copy (Signed, Trade Binder), as many as you like. Tags follow the card when it moves to another list. Unlike a label, a tag is not an instruction to Ritual. It is your word for the card, and it drives the Tags grouping, sort, and filter row on the public site.
- Edit Tags… in a card’s ⋯ menu opens a dialog with one field holding the card’s whole tag set. Type tags separated by commas (
My Tag, My Other Tagis two tags; spaces are part of a tag). The field validates as you type: a tag cannot contain#,,,&, brackets, braces, or parentheses. An invalid one is explained under the field and blocks Save. Tags already used on other cards in the list appear as one-click suggestions. Saving an empty field removes every tag. On a collection tile that groups identical copies, the edit applies to every copy. - Saving records one change per tag that differs: an
add-tagfor each tag added and aremove-tagfor each removed. Each is its own Undo step, most recent first. Aremove-tagcancels a pendingadd-tagof the same tag (and vice versa), so adding a tag and removing it again in one session leaves nothing pending. Changes are listed in Changes and written on save (changelog:Added tag "Ramp" to "Sol Ring" &5). - To tag several cards at once, select them and use Add Tag… in the Selected menu. The same dialog opens empty (headed Add tags; it cannot be saved empty) and the typed tags are added on top of each selected card’s own tags.
Card Categories
Section titled “Card Categories”Every list type can carry categories: a card’s role in this list (Ramp, Board Wipes), ordered so the first is its primary category. Unlike a tag, a category belongs to a card name in this list: one assignment covers every line of that name, and it never follows a card to another list. Categories drive the Category groupings, sort, and filter on the public site.
- Edit Categories… in a card’s ⋯ menu opens a dialog with one field holding the card’s ordered category list. Type categories separated by commas (
Ramp, Artifactsis two; spaces are part of a name). The field validates as you type: a category cannot contain a control character, and a comma always separates two categories. An invalid entry is explained under the field and blocks Save. Above the field, the parsed categories appear as chips in order, the first marked primary; the ◀ and ▶ buttons on a chip move it, so changing the primary is one click. Categories already used in the list, followed by the configureddefaultCategories, appear as one-click suggestions. Saving an empty field clears the card’s categories. - Saving records one
set-categorieschange for the card, whatever changed inside it, and it is one Undo step. Repeated edits of the same card consolidate into the last one, and restoring the card’s on-disk categories cancels the pending change outright. - Categories in the bottom action bar opens the Manage categories dialog: every category the list uses, with how many cards hold it. ▲ ▼ reorder (that order is the site’s group-heading order), Rename (refused if another category already has that name, case-insensitively), and Remove takes the category off every card holding it. The list here is the list’s whole vocabulary, including categories its
orderdeclares that no card currently holds (shown with a count of 0). Reorder and rename are one Undo step each. Remove records oneset-categorieschange per card that held the category plus one order change, so undoing it takes one step per recorded change. - Saving writes the list’s
<list>.categories.jsonfile and records the changes in the changelog. If the save’s removals left that file naming cards the list no longer holds, those entries are pruned and the status line names them. The same status line carries any categories-file warning the save reported (an unreadable file, entries for cards the list no longer holds). A warning reported when the list loads is shown once as an editor error.
Card Labels
Section titled “Card Labels”A card label tells Ritual what a copy is for. Collections carry the whole vocabulary (For sale, For trade, To keep, Proxy). A deck carries Proxy alone; a wanted list carries none. Labels are set at two levels:
- Set Label… in a card’s ⋯ menu (and in the multi-select Selected menu) puts a card in a label state. On a collection the picker offers the five label states, No labels (when the list has a default to take away), and Use list default, which clears the override. On a deck it offers Proxy, Not a proxy (under a
proxydefault), and Use list default. The card’s override adjusts the list default, so the editor writes the smallest token that gives the picked state ([no-proxy],[trade,no-sale]). The change is a pendingset-labeledit like any other: undoable, listed in Changes, and written on save. Tiles badge a card’s own override; a negation shows struck through (PROXY, tooltip Not a proxy), and the list view spells it out. - The action bar’s Labels button opens the Default Labels modal, which sets the list’s front-matter
labels:default (No default or Proxy on a deck). It writes immediately through the List Metadata route. Front matter is not a card change, so it needs no save, and the editor adopts the returned content hash so pending card edits still save cleanly afterward. This is how you mark a whole playtest deck as proxies without touching a card line.
In the Selected menu, the picker offers only what the selected cards’ list type carries. It is hidden for a selection spanning several list types (their vocabularies differ) or one whose type carries no labels.
Proxied cards show their badge and, in place of a price, the PROXY marker, in the editor and on the public site alike. They count as 0 in every total and are never offered to a buylist. See Custom art carries no price for the rule both priceless kinds share.
Custom Art
Section titled “Custom Art”Set Custom Art… in a card’s ⋯ menu opens the Custom Art dialog, where a card can show your own image instead of its Scryfall art: a proxy scan, an alter, commissioned art. See Custom Card Art for the file format and how the image is published.
- Pick an Image source: File in the art directory (a path like
proxies/sol-ring.jpg, relative toartDir) or Image on the web (anhttp(s)URL). A live preview renders as you type, and says so when the image cannot be loaded. - Save writes immediately through the Card Art route. Remove art clears the card’s entry. Both take effect at once: the tile and the card modal re-render with the new image.
- Setting custom art is metadata, not a pending change. It is never listed in Changes, never part of a save, and never recorded in the changelog. It is safe to set while card edits are pending. A save still moves art entries with the ids it changed: a removed card’s art goes with it, a renumbered line takes its entry along, and Move to list… / Swap Printings… carry it to the destination in either direction. See Art follows the card.
- The dialog targets a card’s
&Nid. On a tile that groups identical copies, the art goes on the first copy, the one the tile renders. - A card added this session has no card line yet, so there is nothing to write against. The dialog says so and holds the reference with your pending changes. The save that writes the card’s line writes its art right after. If that write fails (a missing file, for instance) the error banner says which card and why; the list is saved either way, so re-open the dialog and fix the reference.
- Undo of a removal brings the card’s art back as long as its id has not been reused. An undo that has to allocate a fresh id restores the card without its art.
- A card with custom art carries no price, like a
proxylabel;custom-artis the reason shown when a card has both. It shows CUSTOM where a price would be, counts as0in every total, and is never quoted against a buylist, even if the image file is missing. - A local file must already exist under the art directory. The route refuses a path with nothing behind it and names the location it checked. The admin server serves the art directory read-only, behind the same login, so the preview can show local files.
Cover Image
Section titled “Cover Image”The action bar’s Cover Image… button opens a modal that writes the list’s front-matter image: key through the List Metadata route immediately. Like the labels modal, this is front matter rather than a card change, so it needs no save, and the editor adopts the returned content hash so pending card edits still save cleanly afterward.
- Four modes: Ritual’s own choice (removes the key), a card from this list, an art file, and a URL. The file and URL fields are the same control and preview the Custom Art dialog uses, and a value that does not parse is refused with the same sentence the API would return.
- The card picker offers only cards already on disk. A card added this session has no
&Nin the file yet, and a cover naming one would be rejected. Save first, then pick it. Rows that would otherwise read identically (several copies of one printing) are suffixed with the&Na pick would write, since which copy the cover names decides whether removing one clears it. - Saving the dialog without changing anything writes nothing, since the file already says what the form says and a write would rotate its content hash.
Toolbar and Filters
Section titled “Toolbar and Filters”The list toolbar is the one the public site uses. Its right-aligned Filters dropdown groups every card filter, with a badge counting the active ones and a Clear action at the top. Filters combine, and on deck pages the commander section is never filtered. The Filtering Cards page has the full rules for each; in brief:
- Hide Lands / Hide Unpriced / Hide Extras (decks only: maybeboard and token sections). Hide Unpriced goes by the price, so it also hides cards priceless by rule: proxies and custom-art copies price at
0 - Name: space-separated terms, every one of which must appear in the name, ignoring case and accents (
jotunmatchesJötun Grunt, as in the CLI session filter) - Color Identity: the five colors plus Colorless, with Subset (default), Include, Exclude, and Exact modes
- Sets: set codes, with Include (default) and Exclude
- Card Type / Oracle Tags / Art Tags: tag inputs sharing one Include / Exclude / Exact mode, default Exact
- Categories and Tags: shown when the list’s cards carry categories or tags. Same three modes, default Exact, committing on commas only. Tags match case-sensitively. The grouping menu also offers Category (primary only) and Categories (every category a card holds, non-primary ones dimmed and badged), and the sort menu offers Category
- Labels: chips for For Sale / For Trade / To Keep / Proxy / Unlabeled, against each card’s effective labels. A deck shows only Proxy and Unlabeled; a wanted list has no row
- Mana Value: a comparison (
=,<,≤,>,≥) against a non-negative value (0 is a valid value) - Price: shown while prices are displayed. A comparison (
=,<,≤,>,≥) against the card’s price from the selected price store. The label carries the currency (Price ($)), and switching the store clears the field - Copies: a comparison (
=,<,≤,>,≥) against how many copies of the card the list holds, with a Name / Number / Exact toggle for what counts as the same card - Buylist ($) and Buylist: sell mode only. A dollar comparison against the buyer’s per-copy offer, and On buylist / Not on buylist chips (a paused offer counts as not on buylist)
- Shares Cards With / Doesn’t Share Cards With: your other lists, with Any / All and Name / Printing toggles. Shown only when other lists exist. They read the other lists’ saved files, so another editor’s unsaved session is not seen, and each list is loaded once per browser session, so a later save is not picked up until you reload. See Filtering against other lists
The toolbar also has the quick filter: start typing anywhere outside a field and a Quick filter tab drops out of the toolbar’s bottom-right corner, holding the same Name filter as the panel. Empty it (or press Escape) and it goes away.
Prices in the editors
Section titled “Prices in the editors”The editors follow the priceSources config. The admin header has the same Prices store dropdown as the public site (shown when more than one store is enabled), opening on the configured defaultPriceSource; with an empty list, price displays hide entirely. The public site reads prices stored in its built list data, but the editors quote live against the admin’s own API, so a card added mid-edit is priced immediately.
Sell mode in the editors
Section titled “Sell mode in the editors”When sell mode is enabled, the toolbar gains a Sell mode toggle and a buyer selector, and the editors offer buylist prices, the Buylist filters, buylist grouping and sorting, and the Card Kingdom cart export. It is off by default on the admin site too. Enable it with the Offer sell mode checkbox on the Settings page, with ritual config set site.sellMode true, or by starting the server as ritual admin --sell-mode. With it off, the toggle and buyer selector are not rendered and the sell routes answer 404, unless the cardkingdom price store, which uses the same feed, is enabled. Saving the checkbox applies at once: reopen an editor and the toggle is there (or gone) with no reload.
Quotes come from the locally cached buylist, and the first download never happens on its own. Press Refresh buylist on the Refresh Cache page, or run ritual sell --refresh auto. After that, admin refreshes a day-old copy at startup and the button forces one mid-session. A press that downloads a new feed also clears the quotes this browser session has already resolved, so an editor opened afterwards prices against the new feed.
Differences Between List Types
Section titled “Differences Between List Types”The editor is the same for all three types. What differs is what a card line must carry.
Deck Editor
Section titled “Deck Editor”- Set as Commander in the context menu and the Selected menu moves a card to the Commander section (several commanders are allowed).
- No specific printing is available when adding a card.
- Condition (NM, LP, MP, HP, DMG) is optional and defaults to NM.
- Labels: Proxy / Not a proxy only (
proxy,no-proxy). See Card Labels.
Collection Editor
Section titled “Collection Editor”Collections are .md files in the collections/ directory.
- No Set as Commander. Collections have no reserved Commander section but support any user-named sections.
- Printing required. No specific printing is not offered; you must pick a printing.
- Finish and condition required. Both must be set for collection entries.
- Labels: the full vocabulary. See Card Labels.
Wanted List Editor
Section titled “Wanted List Editor”Wanted lists are .md files in the wanted/ directory.
- No Set as Commander. Wanted lists have no reserved Commander section but support any user-named sections.
- No condition. Wanted lists track cards you want, not cards you own.
- Printing optional. Cards can be name-only (cheapest printing), a specific printing, or a printing with a finish.
- No labels, and no Swap Printings entry points.
Feature Comparison
Section titled “Feature Comparison”| Feature | Deck Editor | Collection Editor | Wanted List Editor |
|---|---|---|---|
| Set as Commander | ✅ | ❌ | ❌ |
| Change printing | ✅ | ✅ | ✅ |
| Multi-copy printing split | ✅ Entry | ✅ Per-entry | ❌ Single rows |
| Swap printings | ✅ | ✅ | ❌ Not offered |
| No specific printing | ✅ Allowed | ❌ Must select | ✅ Allowed |
| Condition field | ✅ Optional | ✅ Required | ❌ Not applicable |
| Finish field | ✅ Optional | ✅ Required | ✅ Optional |
| Card labels | ✅ Proxy / Not a proxy + list default | ✅ + list default | ❌ |
| Card tags | ✅ | ✅ | ✅ |
| Card categories | ✅ | ✅ | ✅ |
| Custom art | ✅ | ✅ | ✅ |
| Cover image | ✅ | ✅ | ✅ |
| Description | 👁️ Read-only | 👁️ Read-only | 👁️ Read-only |
| Sections | ✅ + reserved Commander | ✅ User-named | ✅ User-named |
| Add/rename/delete section | ✅ | ✅ | ✅ |
| Move card to section | ✅ | ✅ | ✅ |
| Changelog on save | ✅ | ✅ | ✅ |
| Add Card Defaults | ✅ Set/F/C | ✅ Set/F/C | ✅ Set/F |
Ritual is unofficial Fan Content permitted under the Fan Content Policy. Not approved or endorsed by Wizards of the Coast. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC.
Card data, images and symbols come from Scryfall, which is not affiliated with this project. Ritual is free software under the AGPL-3.0. License and attribution.