Sheetwright for GGA

Build and edit GURPS characters on the GGA sheet, live — powered by the GCS rules engine. Version 0.4.8 (alpha).

1. What it is

Sheetwright puts a real character builder behind the ordinary GGA character sheet. The builder is GURPS Character Sheet (GCS) by Richard Wilkes, running inside your browser. You keep using the GGA sheet you know. When you change points or an attribute, the engine works out every number that depends on it — skill levels, defaults, point totals — exactly the way desktop GCS would, and the sheet updates.

Each character the engine builds is stored on the actor as a GCS file. The GGA sheet is a view of that file. You can download it at any time and open it in desktop GCS.

Sheetwright ships no game data. Your GM adds the GCS libraries your table uses.

This manual opens inside Foundry from Help in any Sheetwright menu and from ? in the builder, in a window of its own: the Contents on the left jump to any section, and the window remembers its size for you.

The engine is about 9 MB. Your browser downloads it the first time you edit a Sheetwright character, then keeps it. The first edit of a session can take a second or two; after that it's quick.

2. Setup: libraries (GM)

Open Game Settings → Configure Settings → Sheetwright for GGA → Open Libraries, or the Libraries button in any Sheetwright menu. There are three ways to add a library:

Folder

Use a folder that is already inside Foundry's Data folder and holds GCS library files (.adq .skl .spl .eqp .eqm .adm .not .gct; sub-folders are included). Pick it with the folder button, give it a name and press Add folder. Tip for Windows: a junction from Data to your desktop GCS library folder (mklink /J) keeps Foundry in step with GCS — press Reload after you change files.

GCS Master Library

Press Download the GCS Master Library. Your browser asks GitHub for the latest release, gets its list of files, then downloads the 2,091 library files a dozen at a time and stores them under Data/sheetwright-gga/libraries/master. A progress bar at the top counts them; on a home connection it takes about a minute, and Foundry stays usable. The files are stored once for the whole world, and players get them from your Foundry server, never from GitHub.

The tab shows which release the world has. When you open it, Sheetwright asks GitHub once whether a newer one is out ("Update available: v5.16.0"), the way desktop GCS does. Update if newer checks the release first and downloads only a newer one; when yours is the latest it says so ("Master Library 5.15.0 is current") and fetches nothing. Re-download anyway fetches every file again, for when files went missing. Characters keep what they already took. If GitHub can't be reached from your browser (offline, a firewall, GitHub's limit of 60 questions an hour from one address), the tab says why. Download the release zip from the link shown and add it on Upload instead, named "Master Library".

A release too new for this Sheetwright. Before it downloads anything, Sheetwright reads one file of the release (a trait, skill or template list) for its GCS file format. If the Master Library has moved to a format Sheetwright's GCS engine can't read yet, nothing is downloaded and the tab says so: "The Master Library now uses the GCS 6 file format. Sheetwright 0.4.8 reads up to GCS 5.53.0. Update Sheetwright first." The library you already have keeps working; update Sheetwright from Foundry's setup screen, then download again.

Upload

Choose library files or a zip of them, give them a name and press Upload. They are stored under Data/sheetwright-gga/libraries/<name>. (Foundry only stores certain file types, so the copies get an extra .json at the end of their names. That's expected.)

The list

The top of the Libraries window shows which versions are running, like Sheetwright 0.4.8 · GCS engine 5.53.0 (fork 19dcf3c1): the GCS engine is the GCS release Sheetwright reads libraries and characters with. When a newer Sheetwright is published, a second line says so, and adds when that version brings a newer GCS engine.

If some files of a library were saved by a newer GCS than the engine reads, the rest of the library still loads and works; its row says which file could not be read and why, in a plain sentence (below, under Troubleshooting).

Test loads a library and shows what was found and any file it couldn't read. Reload reads the files again. Remove stops offering the library in this world; characters keep everything they already took from it, and the stored files stay on disk.

A library registered twice — say the Master Library once as "Master Library" and again as "master", which happens when it was downloaded and also added as a folder — gets a badge duplicate of Master Library on the second copy (a copy icon and the words, in the warning color). Every browser reads every library in full when the world opens, so each copy costs that read again: several seconds for the Master Library. Removing one copy is safe. Sheetwright only says so; it never removes anything by itself. Two libraries count as copies when more than half of the smaller one's files are also in the other.

Loading

Each browser reads the libraries into Sheetwright's rules engine once each time Foundry opens. It starts by itself as soon as the world has loaded and the browser is idle, quietly, on the GM's browser and on the browser of any player who owns an actor: the engine starts, the libraries are read, then the templates follow in the background. The Sheetwright menu's bottom line shows how far it has got ("Loading GCS libraries — Master Library, 120 of 246 files…", then "Templates loading in the background…", then "Engine: ready"). By the time someone opens the builder or a "+" search, it's usually done, and a builder opened meanwhile simply joins the reading already under way. Each player can turn this off with Start the GCS engine when the world opens (Settings, per player; on by default) — on a slow machine, or for someone who never builds characters — and the engine then starts the first time it is needed, as it did before 0.4.1. If they get there first, a progress bar at the top counts the files ("Loading GCS libraries — Master Library, 120 of 246 files…") and then says the engine is reading them. The engine runs beside the page, so every window stays usable meanwhile. The first time a player sees the bar, a note explains it once.

Templates (.gct files, half the Master Library) are left out of that first read. Right after it, your browser downloads them quietly in small batches, pausing whenever you are doing something in Sheetwright, and then reads them in one go, so the template panel is usually ready before you open it. Searching the library drawer or the "+" picker never waits for that reading: results come as soon as you stop typing. If you open the template panel first, the bar shows what is still to come and the cards that are already priced work meanwhile. On a metered or slow connection, turn off Load templates in the background (Settings, per player): templates then load the first time the template panel opens, or when Reset to template needs them, with the same bar. The Master Library takes a few seconds without templates and a few more for them: since 0.4.1 the templates are read on their own, so adding them never reads the rest of the library a second time. Test and Reload always read everything.

3. Giving a character to the engine

Open the Sheetwright menu from any of these places:

Then choose one of these:

Start a new character with the engineA blank character built by the engine, named after the actor.
Load a .gcs file into this actorPick a file saved by desktop GCS (or downloaded from Sheetwright). It becomes this actor's character.
Adopt this characterKeep a sheet you already have — typed by hand, or imported from GCA or an old GCS file — and let the engine take it over (section 7).

Both Start new and Load rebuild the traits, skills, spells and attributes from the engine. Rows the engine doesn't know about are replaced. Current HP and FP come from the new character: Start new gives full pools (it is a new character), and Load takes whatever damage the file carries. Conditions, resource trackers, maneuvers and equipped/carried toggles stay as they were. The version being replaced is kept as a snapshot, so you can undo it.

If you import a .gcs through GGA's own Import button onto a Sheetwright character, that file becomes the engine's character too (the old one is kept as a snapshot).

Linked and unlinked tokens

A token on the map is either linked to its actor (it is that actor: the usual way for player characters) or unlinked (a copy that keeps its own changes: the usual way for a crowd of the same guard). Foundry always shows an unlinked copy's base actor underneath it, and nothing can take a row away from that base. So if Sheetwright built an unlinked copy, its GGA sheet would keep every trait and skill the base actor has, even ones the character no longer has.

That's why, whenever you open the builder or start, load or adopt a character on an unlinked token, Sheetwright asks:

Make it its own actorThe token becomes a character of its own in the Actors list (a copy of it as it is now), and the token shows it from then on. The base actor isn't changed. Best for a player's character, or anyone who changes on their own.
Edit <base> insteadYou build the base actor itself; every token of it on every scene shares that one character. Best for a group of identical monsters.

It asks each time, because characters and monsters want different answers. An unlinked token's Sheetwright menu and builder say unlinked token in their title bar.

4. Adding traits, skills and spells

On a character the engine builds, "+" on the traits, skills or spells list opens a small search window instead of GGA's blank row. You'll find "+" in the list's header menu (click the little arrow next to Advantages, Skills or Spells) on the Full, Reduced, Tabbed and Editor sheets, and as the + Advantage / + Skill / + Spell buttons on the Modern sheet. The Full sheet hides an empty list entirely, so for a brand-new character use Add a trait, skill or spell… in the Sheetwright menu — it opens the same window.

Searching

Type a few letters. Every library your GM loaded is searched as you type, by name, specialization, tag and page reference (try B43). Each result shows what you need to choose: a skill's attribute and difficulty (DX/A), a technique's difficulty, a spell's college, a trait's cost (15 pts, or the cost at the library's level for a leveled trait), its tags, its page, and which library it comes from. Techniques are listed with skills. Templates (.gct) appear under their own Templates heading in every list.

Click a result, or move with the arrow keys and press Enter, to add it. It comes from the library with its real cost, difficulty, defaults, prerequisites and features, and the sheet updates a moment later. The window stays open so you can add several; Escape closes it. If the character has groups (containers), Put it in chooses where the new row goes.

Misspellings

You don't have to spell it right. When the search finds fewer than five exact names, a Did you mean group follows with up to eight names spelled close to what you typed: "cmbt reflx", "Combat Reflxes", "reflexes", "comabt" and even the initials "cr" all bring up Combat Reflexes. Each says how close it is — close or possible. The arrow keys move through the exact results and the suggestions alike, and Enter adds the highlighted one. The builder's library filter does the same under Close matches.

A name typed straight onto the sheet (in GGA's own editor, say) is forgiven too: if exactly one library name is close to it, Sheetwright takes that entry and says so in the browser console ("adopted 'Reflxes' as Combat Reflexes"). If two or more names are that close it leaves the row as you typed it — a custom row — rather than guess, and Sheetwright.sync.diagnose() lists the candidates under fuzzyMatches. GGA's own blank rows ("Skill…") are never matched this way. Two world settings (section 12) control this: "Did you mean" suggestions and Fix misspelled names typed on the sheet.

When nothing matches: custom rows

If no library has what you typed, the window says plainly why Sheetwright can't price it — no library loaded at all, no library of that kind (for example no .adq trait library, so nothing can price Combat Reflexes), or simply no entry by that name — and shows the custom form underneath. You enter the cost yourself:

Custom traitBase points, points per level (0 for a trait that isn't bought in levels) and levels (B33). The self-control roll (B120) is shown but can't be set yet: enter the cost already adjusted for it. Modifiers come from the builder window.
Custom skillSpecialization, attribute (ST, DX, IQ, HT, Will, Per), difficulty (E, A, H, VH) and points (B168).
Custom techniqueUnder Skills, switch the form to Custom technique: the skill it defaults to, the default level (e.g. −2), difficulty (A or H) and points (B229).
Custom spellCollege, attribute (IQ unless your campaign says otherwise), difficulty (H or VH) and points (B242).

Every field's tooltip says what it is and which page explains it. You can also open the custom form on purpose with Add a custom … named … below the results.

Rows added any other way still work: a row typed straight onto the sheet, made by a macro or by another module is matched by its exact name to a loaded library, and becomes a custom row if there's no match.

The world setting Library search on "+" (section 12) turns this off and gives GGA's plain blank row back.

5. Everyday editing

Edit on the GGA sheet the way you always have. The editor sheet and the item editors work too. Sheetwright watches these changes:

AttributesChange ST, DX, IQ, HT, Will, Per (and QN). Their point cost follows.
HP, FP maximumChange the maximum; its point cost follows.
Skill, technique, spell pointsChange the points; the level follows. A technique shows the skill it is bought from after its name, "Rappelling (Climbing)", as GGA always meant to.
Trait levelsChange the level, or edit the number at the end of the name ("Acute Vision 2" → "Acute Vision 3").
Adding a rowUse "+" — see section 4. A row typed onto the sheet some other way is matched by its exact name to a loaded library; with no match it becomes a custom row (a custom skill made that way starts as DX/Easy, because GGA's sheet has no difficulty field — use "+" instead to choose).
Deleting a rowDelete it as usual; the engine removes it.
Renaming, notesRename rows and edit their notes as usual.
Character detailsName, title, age, birthday, handedness, gender, eyes, hair, skin, religion, TL, player, size modifier.

A moment after an edit, the sheet refreshes with the engine's numbers.

6. Locked values and breakdowns

Some numbers are results, not inputs: skill, technique and spell levels and relative levels, trait point costs, attribute point costs, and the point cost of HP and FP. GCS has no way to "set a level"; it works the level out from points and attributes. On an engine character these numbers carry a small lock mark.

If you type over a locked number anyway (on the Editor sheet, say), Sheetwright puts the engine's value back and tells you what to change instead.

Lock marks and breakdown tooltips are per-player display settings (section 12); turning them off changes nothing else.

What the numbers mean

The points block on the GGA sheet (Total, Unspent, Race, Attributes, Advantages, Disadvantages, Quirks, Skills, Spells) shows the engine's count on an engine character: the same numbers desktop GCS shows for the same file, and the same Unspent as the builder's budget bar. Hover a line to see what it counts. Change the character, not these numbers; they are worked out again every time the character changes.

On a character that is not given to the engine, the block is GGA's own count, as before.

7. Adopt this character

For a character that already lives on a plain GGA sheet. In the Sheetwright menu choose Adopt this character. Sheetwright reads every trait, skill and spell on the sheet (groups included), looks each one up in your libraries, and shows a report before anything changes:

MatchedA library entry with the same name (and specialization). It is taken from the library — with its real difficulty, defaults and prerequisites — and the sheet's points carry over. A leveled trait keeps its level.
GuessedClose, but not the same: the case differs ("climbing"), the specialization does, or the name is misspelled ("Combat Reflxes" — shown as a close or possible match). Both are shown; choose the library entry you meant or keep it as a custom row. A case-only difference is accepted for you; a different specialization is left for you to decide. An entry that takes a word, like Area Knowledge (@Area@), is filled in from the sheet ("Paris").
Not in any libraryBecomes a custom row priced from the sheet: a trait's points become its base cost; for a skill or spell you pick the attribute and difficulty (taken from the sheet when it says, otherwise DX/A for skills and IQ/H for spells) and its points carry over.

The sheet's attributes and HP/FP maximums carry over too. Below the report, Level differences lists every row where the engine works out a different level or cost than the sheet showed — for example a skill typed in at 11 that is really 12 with those points. Change a choice and press Check again to see its effect. Nothing is saved until you press Adopt.

Adopting keeps play state: current HP and FP, conditions, trackers and maneuvers. Equipment and notes stay GGA's on an adopted character — Sheetwright leaves those lists alone from then on (until you Start new or Load .gcs, which hand them to the engine). One thing does change: GGA rebuilds the attack lists from the character's traits, skills and equipment every time the engine refreshes the sheet, so attacks typed by hand are replaced. The window warns you when the sheet has attacks. The adopted character is kept as a snapshot.

8. The builder window

The builder is a character sheet of its own, laid out like desktop GCS's, and one more door into the same character: everything you do here shows on the GGA sheet straight away, and everything done on the GGA sheet shows here. Open it with Builder window in the Sheetwright menu (sheet header, token controls) or Sheetwright builder when you right-click the actor in the Actors sidebar. It works on a brand-new actor too.

Start from a template

A character the engine doesn't hold yet (or a blank one) opens on Start from a template. On the left: the name, the point total and a search box (misspellings are forgiven; folder names count too, so "skill sets" finds the Action skill sets). In the middle: every template you have, alphabetical, as Cards or as a one-line List (name, book, points, choices); the buttons above switch, and the panel remembers which you like. The book chips above them ("Action 103", "Dungeon Fantasy 212"…) narrow it to the books you pick, several at once, and are remembered too; Clear books shows everything again. Each template shows what it costs before its choices and how many choices it asks. The panel opens at once, straight from your libraries' file lists. The costs are read from the template files themselves (the totals desktop GCS saved in them) while the templates load in the background, the first time and again after the GM updates a library; each card fills in as they arrive, and your browser keeps them, so next time they show the moment the panel opens. A few Master Library templates were copied from one another and share the same id inside their files; the rules engine finds templates by that id, so for those the preview warns that the result may be one of the others. Click a card and the right side shows what it gives — attributes, traits, skills, spells, items, summed up as "Adds 2 traits, 1 skill and 1 item" (the picks its choices require included; "or more as chosen" when a choice may add more) — the choices still to come, each marked required or optional, and your points after it. These numbers come from a dry run on a blank character; nothing is saved.

The Build <name> from this template button is in the preview twice: right under the template's name and cost, so it is in view without scrolling, and again at the end, after everything the template gives. Both do the same thing; use whichever is nearer. A kit's build and Apply the whole file are shown the same way. Build <name> from this template asks the choices one at a time ("choice 2 of 4"). Each window is titled with where the choice sits in the template ("Hobgoblin (Yrth) › Select level of night vision") and lists the options with their costs and what you may take ("Choose one item", "Choose options worth exactly 10 points"; for points written in a group's name, see Points chosen from a list). An option bought in levels has a levels box beside it, and its cost follows the number you set. An option with beside it asks more questions of its own once you choose it ("choice 2 of 3 so far"). An option that is a group shows what it holds on a second line ("group of 2: Climbing (2), Rappelling (2) — 4 pts"), so you know what you get before you pick it. The choose button stays off until your pick fits, except where a Go on anyway box lets you keep a pick that breaks the rule. Surprise me picks at random among what the template allows; when a choice carries dice (a name ending in something like [3d6], with options like 7–9:), Roll rolls them in chat — Dice So Nice shows them if you have it — and ticks the option the roll lands on. You may still change it.

Cancel, Skip and Back. All the windows of one template — its choices, modifier choices and the Fill in window — are one build. Cancel the template stops the whole build: no further window opens, nothing is applied, no snapshot or Undo step is made, and the character stays exactly as it was. The window's close button and Esc do the same. If you have already made a choice, it asks once — "Cancel the Bard template? Your 3 choices so far will be discarded." — and Keep choosing takes you back to the window you were on, with what you had ticked. Skip this choice (on a choice written in a group's name) and None of these (on an optional GCS choice) are different: they leave out that one choice and go on to the next; the rest of the template still applies. From the second window on, Back (left of Choose and go on) returns to the previous choice with your answers still filled in; change them or not, and go on. The "choice 2 of 9" line stays right after Back and skips.

Required, optional and modifier choices (GCS 5.52 templates). Templates saved by GCS 5.52 or later say more about their choices, and Sheetwright shows it. Beside the rule ("Choose one item") a choice is marked * required (bold, solid outline) or optional (dashed outline). An optional choice has a None of these button: nothing from it goes on. A cost that is still a range shows as "5–12 pts" with a mark; hover it for why — the final cost depends on choices still open inside it, such as which modifier you pick or how many levels. An option inside the template's own sorting groups shows them first in muted text ("Weapons › Blades › Broadsword"); those groups only organize the list and never land on the sheet. Equipment choices show value and weight ("$450 · 3 lb"); the item you pick goes on the carried list, equipped.

Some entries come with a choice of modifier — which enhancement or limitation it takes. When you tick such an option, its modifier choices open right beneath it in the same window, one set of round buttons each: the name, required or optional, every modifier with what it does to the cost ("+20%", "−50%"), and none for an optional one. The choose button waits until each required one has a pick. If the template's author already chose the modifier, it is ticked and noted set by the template author; you needn't touch it, but you may change it. Modifier choices on entries that aren't part of any choice come in a window of their own after the choices, grouped under each entry.

Choices first, then words. Every choice comes first — the template's own and the ones written in group names (below). Only then does Sheetwright ask for the words some rows need (the area of an Area Knowledge, who a Duty is to), and only for the rows you actually chose, as desktop GCS does. The Fill in window reads like a form: each row gets a header band with its name — a word still to fill shows as that word in muted italics with a dotted underline ("Sense of Duty (Charge or cause the hero protects)"), and changes to what you type as you type it — its kind in words (trait, skill, spell, equipment) and a colored edge on the left; hover the (i) for what the row is, its notes and its page. Under the band come its words, each with a small gray line saying why it is asked — from the name, from notes, from modifier: Sworn. Hover a box for what to type: the entry's notes and page, a plain sentence ("Type the particular attack this Trademark Move is for."), the template author's own examples when the blank lists them, and what leaving it blank does — the entry then keeps its @word@ exactly as the template wrote it. A long word label sits above its box instead of beside it. Words that belong to a modifier are asked only for modifiers that are on: an entry like Resistant whose optional modifiers the template leaves off asks nothing for them. If you switch such a modifier on later (its tick box in the inspector), Sheetwright asks for its word at that moment; Cancel leaves the modifier off. A word two rows share is asked once. The window follows the builder's Aa text size. Only after the last answer is the template applied, as one step: one Undo takes it back, and a snapshot is kept.

Placeholder specialties. Some templates give a skill a specialty that is only a placeholder — Monster Hunters' Commando adds Area Knowledge (Any). There is no blank to fill in the file, so desktop GCS adds it as written and asks nothing. Sheetwright asks it in the same Fill in window: the skill gets its own band ("Area Knowledge (any)"), its box is labeled Specialty, and the gray line says the template says "any". Type the specialty you take and it becomes the skill's specialty; leave it empty and the skill stays exactly as the file has it. Only these whole specialties count as placeholders, in any capitals: any, any other, any type, any hobby, choose a speciality (or specialty), choose a subject and pick a speciality (or specialty). A specialty that describes something, like Gambling (any card game), is left alone. Only templates are asked this way: a skill you add from the library drawer comes as the library has it, as on the desktop, and you type its specialty in the inspector. You can change any skill's specialty there later too.

Kits. A few template files are not one template but a kit of them — the Delvers to Grow build templates hold a 62-, a 125- and a 187-point build plus a stack of upgrade modules, meant to be taken one at a time (desktop GCS would put all of them on the character). Such a file shows as one card marked kit · 41; click it to see its builds and modules, each with its own cost and number of choices, groups of alternatives marked with a folder. Pick one and Build it: only what it holds goes on, only its own choices are asked ("choice 1 of 2" counts that build alone), and the character lists it as DTG Fast Delver Build Template › 062 Point template - Fast, Novice. Reset to template takes the same build again. Apply the whole file, on the kit itself, does what desktop GCS does, for the rare file whose author meant it.

Choices written in a group's name: old-style templates. Many Master Library templates (about 500, most of the Action ones) say what to choose only in a group's name — "Choose one", "Two of these options, or one of them twice", "20 points chosen from" — and desktop GCS adds every option. Their cards carry a small old-style template mark: the Master Library is converting them to real GCS choices, so a library update will replace them. Sheetwright reads those names and asks them like any other choice, with a note that says so. A template that has real GCS choices anywhere is never read this way: its group names are just names. The rows you didn't choose are left out, points GCS had folded into a row elsewhere are taken back off it, and the chosen rows land in the template's real group. A chosen option that is a group ("Air Assault") stays a group inside it while Keep template groups is on, and its rows join the list with it off. No folder is ever left empty: an option you didn't choose goes with its folder, and an option whose only skill the template already had ("Advanced Jump" holds Parachuting) adds its points to that skill, as GCS does, without leaving its folder behind. "Or one of them twice" lets you choose a single option, whose points are then doubled. When the same skill turns up in several places — Action's Shooter has Tactics in three of its lenses — GCS keeps one row and adds the others' points to it, and that row may be one you didn't choose: Sheetwright keeps it with the points from the copies you did take (and the ones the template always adds), and drops only the unchosen copy's own points. An option the template author copied in from a library (it still names that library as its source) is dropped like any other when you don't choose it. A name Sheetwright recognizes as an instruction but can't read ("And choose from:") becomes a free choice that shows the name. As written keeps every option, exactly as desktop GCS would. Reset to template repeats your answers.

Points chosen from a list. A group named like "50 Points chosen from:", "20 Points on:" or "-15 Points chosen from:" means: spend that many points among the rows inside it. Sheetwright lists those rows, not the groups they sit in. Each group's name is a heading — a folder mark and bold text, which you can click to fold — with its rows beneath and, once you tick something there, how much you chose under it ("21 pts chosen here"). A group whose name is only a connector — "Or:", "Either", "And", "— or —" — or ends in one ("from the previous list or:") is a label, not an option: it shows as a divider line carrying its own words (— or —, — from the previous list, or —), with any rows it holds under a heading of their own. Points from both sides count toward the same total; the template doesn't bind you to one side, so ask your GM if the book does. A group inside that says "Choose 1 From" lets you tick only one of its rows. A group that holds nothing ("Or 20 Points of Spells") is a label too: never a checkbox, never counted, left off the sheet; add what it names from the library afterwards. This holds in every choice window, not only points choices.

Disadvantage choices. "-35 Points Chosen From:" reads Choose up to 35 points of disadvantages, and the bar counts by size: "20 of 35 points of disadvantages chosen". Quirks read as quirks. A row of the other kind inside one — an advantage in a disadvantage choice — is marked advantage and counts by its real sign: a +5 row gives 5 points of the allowance back. A positive number over disadvantages ("Disadvantages › 20 points from the following") is read the same way.

The rule reads Choose up to 50 points unless the group's name says exactly. A bar under it shows what you have ticked: "32 of 50 points chosen · 18 left", and past the limit "⚠ 12 over" with a hatched bar. A disadvantage group counts by size — "Choose up to 25 points of disadvantages", "10 of 25 points of disadvantages chosen" — and quirks the same way. A leveled entry (Charisma, a Talent, Extra Fatigue Points) has a levels box, and a skill or spell a pts box; the cost follows the number you set, so you can land right on the total. Choose and go on works whenever you are within the rule; with points still unspent it asks once ("18 points are unspent — go on anyway?") — unspent points simply stay unspent on the budget bar. If what you ticked breaks the rule, a Go on anyway box (Go on over the limit when you are over) lets you keep it; the budget bar then shows the points over. Only when even the cheapest row is more than the allowance does the window say that nothing fits — and even then you can choose by hand, keep it As written, or Skip this choice. Surprise me ticks random rows, at random levels where a row has them, as close to the total as they come without going over; it never picks a heading. You can change its picks before going on. Rows you don't tick are left off, the "chosen from" group and any "Or:" are dissolved, and a group you took nothing from goes. With Keep template groups on, a group you took rows from (Bard-Song) stays, holding only those rows; with it off, the rows join the list. Words a chosen row needs ("Language: @Language@") are asked afterwards, in the Fill in window, only for the rows you took.

Numbered options. Some templates number a choice's options as folders — DF Archer's "Primary Skill" offers "1." (Bow), "2." (Crossbow), "3." (Sling). The window shows each such option as what it holds, "Sling (16)", with the number as a small gray mark in front, and the number never lands on the sheet: you get "Primary Skill › Sling", even with Keep template groups on. A named option folder ("Bard-Song", "Air Assault") still follows that setting.

Attribute increases: Meet or Stack. When a character takes a second template, the attribute increases it already has are not bought again — the game's rule Meet, which the GM sets once for the whole world under Settings › Sheetwright › Attribute increases from templates. Say the first template gave Increased Strength 1 and the second also gives Increased Strength 1: the character already has ST 11, so the second adds nothing (0 points). If the second gives Increased Strength 2, only the missing level is bought, by raising the Increased Strength row the character already has — one row at level 2, never two rows. ST bought directly counts too. Only ST, DX, IQ, HT, HP, FP, Will, Per, Basic Speed and Basic Move are covered, and only increases that always apply: lifting-only or striking-only ST, every other trait, skills and spells always go on as written, and a template that lowers an attribute (Decreased Health) always does so. A trait switched on as a temporary effect is not counted as something the character has. Under Stack every template adds its increases on top. The template panel and the preview say which rule is in force ( "Attributes: Meet — increases you already have are not bought again"; a GM sees Change… beside it, which opens the setting), and the preview's Attributes lines say what this template will do for this character: "ST: already 11 · template asks 11 · 0 pts added", "DX: 12 → 13 · +20 pts", "HT: template lowers by 1 · applied as written", or under Stack "ST: 11 → 12 · +10 pts (Stack)". Hover a line for the rows involved. The rule acts only when a template is applied; traits you add by hand or adopt are never touched.

Packages the book may mean you pick one of. Some templates put a set of plain groups side by side with no choice in the file at all — Monster Hunters' Champions hold Know Thy Enemy, twelve groups from Cryptids to Zombies; Action's lenses are another. Desktop GCS adds every one, and so does Sheetwright, because nothing in the file says otherwise. The book may mean "pick one", so the preview says so in one muted line with a mark: Know Thy Enemy adds 12 packages (Cryptids, Demons, …) — the book may mean pick one; remove the rest after building; hover it for the full list. The same line appears under the status once you have built. Nothing is asked and nothing is removed for you: check the book, then delete the groups you don't take on the builder's sheet. The template's own top-level sections (Advantages, Disadvantages; Primary, Secondary, Background) are never called packages.

Templates stack: press Templates again later and the next one (race, then profession, then a lens) is added on top. The identity strip lists them under Built from. A choice's own wrapper ("Choose one") never lands on the character; the rows you chose take its place, as in desktop GCS. The template's real groups ("Airborne School") do arrive as groups, unless the GM turns off Keep template groups. Skip — start blank starts with nothing; once there is a sheet, Back to sheet (or Esc) closes the templates without adding one. If the GGA sheet already has rows typed by hand, building replaces them; use Adopt this character to keep them.

The toolbar

TemplatesStart from a template, or add another one. The window shows one thing at a time: the templates, or the sheet (with the drawer over it or not). Templates closes the drawer.
LibraryThe library drawer (below). From the templates it goes back to the sheet and opens the drawer there.
Undo, RedoStep back through every change to this character while the window is open — yours, a template, an erase, a reset, or an edit made on the GGA sheet. Up to 50 steps; closing the window forgets them.
SnapshotsEarlier versions kept on the character for good (section 10). Undo is the quick net; snapshots are the long one.
Download .gcsSection 11.
ResetEmpties the character but keeps the identity strip (name, player, portrait…) and the point total. If it was built from templates you may instead choose Reset to template: back to what the templates gave, with the same choices, dropping everything added since. Either way a snapshot is kept first ("Before reset").
AaText size: Small (as it always was), Medium, Large, Extra large, one step per click. Everything in the builder grows — templates, sheet, drawer, inspector — and the cards and tables rearrange to fit; at the larger sizes the toolbar takes a second line so every button stays in view. Only for you; the same choice is under Configure Settings › Builder text size.
LayoutWhich blocks this window shows you, and in what order. Only for you; the character's own layout is untouched. The character's order goes back to the order its file uses.
?This manual, in a window inside Foundry, open at this chapter.

The budget bar

Always visible: the point total, what is spent and what is left (with a fill bar), disadvantages against the campaign's limit and quirks against theirs (Basic Set B11). The total is the world's Campaign points unless you type a number here, which gives this character its own total (use campaign goes back). A character loaded from a file built on another total keeps that total as its own. Overspent never shows as color alone: the bar fills with diagonal stripes and the number beside it reads ⚠ 12 over instead of "unspent"; a disadvantage or quirk count past its limit gets the same ⚠. The problems line under it says what is wrong and what to do: overspent, over a limit, prerequisites not met (click one to select the row), or simply points left to spend. Nothing is ever blocked.

The sheet

Blocks in the character's own order: the identity strip (type into any field; drop an image on the portrait or click it to pick one), then four boxes — attributes with −/+ or a typed value and their locked cost; secondary characteristics with Dodge and Move; encumbrance and lifting; hit locations with DR — then the weapons the character has, and the lists: traits, skills and techniques, spells, equipment (carried and other). Each list has + (opens the drawer on that kind), new group, erase and a count. The inputs are levels, points and quantity; the results beside them are locked and carry the engine's breakdown when you hover them.

In the lists, a group is a shaded band in bold with a folder icon (open or closed). Rows inside it are indented with a thin line for each level, so you can see what belongs where. Other rows are shaded every second line. Right after each name comes its type in small text: advantage, perk, quirk or disadvantage for a trait (by its cost), the attribute and difficulty for a skill or spell (DX/A, plus the spell's college), and technique of Broadsword for a technique. An equipment group says group (it only sorts the items in it) and a container says container (an item in its own right, like a backpack, whose weight counts).

A row whose prerequisites aren't met shows beside its name; hover it for what is missing. When the character's Disable traits whose prerequisites are unsatisfied switch is on (in the inspector), that mark becomes a boxed prereqs unmet label, and such a trait counts as switched off until its prerequisites are met.

Erase removes every row of one list after you confirm — one step, so Undo brings them all back, and a snapshot named for it is kept.

The portrait shows in desktop GCS. GGA puts it on the actor too when GGA's own "overwrite portraits" setting is on.

Moving and groups

Every row has a grip on its left. Drag it above or below another row to move it there, onto the middle of a group to put it inside, or onto the list's title to take it out of its group. Equipment can move between carried and other the same way. A group's arrow folds it shut — only in your view. New group (the folder icon on a list, or in the drawer) adds one; for traits you may make it alternative abilities, a meta-trait or an ancestry, which GCS prices by its rules.

Sort ( on a list's title) asks what to sort by and which rows. Every list offers name, book order (the order the library files list them) and as entered (the order the list had before you first sorted it here). Skills add attribute, then name, level (highest first) and points. Traits add points and type (advantages, perks, disadvantages, quirks). Spells add college, level and points. Equipment adds weight and cost. Which rows: within each group (the groups stay put), the groups themselves (only the groups move, by name or total points), everything (groups by name, rows by your key), or across all, ignoring groups (takes the rows out of their groups first, after asking). The same icon on a group's row sorts just the rows inside it. A sort is one step that Undo takes back, and the order is saved in the character, so the GGA sheet and desktop GCS show it too. The menu remembers your last choice for each list.

Ungroup ( on a group's row) puts its rows where the group was, in order, and removes the group. Flatten all ( on a list's title) does that to every group in the list at once. Both are one step that Undo takes back. Meta-traits, alternative abilities and ancestries are left whole, because their grouping sets their cost. An equipment container is an item itself (a backpack), so equipment has neither. Remove numbered option folders ( on a list's title, shown when the list has one) dissolves only folders named a bare number or letter — "3.", "(b)", "Option B" — which characters built before Sheetwright 0.4.8 kept from a template's numbered choice; their rows stay in the group around them. One step, Undo takes it back.

Order lives in the character file, so it shows on the GGA sheet and in desktop GCS. It works the other way too: drag rows or use Sort on the GGA sheet and the character keeps that order. (GGA lets you drop a row "inside" a row that isn't a group; the engine can't hold that, so the row goes back and a note says why.) A template's choice is never a place to drop a row: applying a template replaces each choice with what you picked from it, so the sheet never offers one, and if the engine refuses a move its reason pops up as a notice.

The inspector

Click anywhere on a row to select it (its boxes, buttons and drag handle keep doing their own thing; click it again to clear). The right-hand column explains the selected row: what it is, its page and library; why it costs what it does (the engine's own breakdown); its modifiers as tick boxes, with levels where they have them (ticking one that needs a word, like Specialized (@Type@), asks for the word first) (a choice of modifiers says its rule, "choose one (required)" or "choose one or none": ticking one turns the others off, and the pick of a required choice is grayed with a lock — you swap it by ticking another, never untick it), plus Add to search your libraries' modifiers and Custom modifier for one no library has; its prerequisites and whether they are met, with the character's Disable traits whose prerequisites are unsatisfied switch (a GCS 5.52 setting saved in the character: a GM turns it on to keep a build honest, so a trait counts only once what it needs is there; leave it off to buy things in any order); what it changes — every number on the sheet, without it and with it, from a dry run; for a skill, its Specialty (type it and press Enter or click away; a template's placeholder such as "any" is pointed out); your notes; and Remove. For a trait there is an On switch and a Temporary effect switch: a temporary effect (a spell like Might, a potion) is kept off until you switch it on. Turning such effects on and off through Foundry's Active Effects comes in a later version.

The library drawer

Library (or a list's +) slides the drawer over the sheet: tabs for traits, skills, spells and equipment, a search box, and All libraries or just one. Results are a flat list, each with its book on the right. The same entry found in several books is one line — "in 10 books ▸" — and Add takes your house library's copy (world setting); ▸ lists every copy by the file it is in ("Magic › Sorcery Spells") with what sets it apart from the others (page reference, tags, college) underneath, and each copy can be dragged onto the sheet or added with its own +. For up to 25 skills or spells each row shows the level one point would buy on this character today. An entry with several page references shows the first with a "+" ("B92+"), as GCS does; hover it for all of them. Drag a row anywhere onto the sheet, or press Add; Enter adds the first. A dragged row always goes to the list its kind belongs to — a trait dropped on Skills lands in Traits — and a banner while you drag says where; drop it on a group of that list to put it inside. You can also drop it on the character's GGA sheet in another window: it is added there the same way. Close matches show under Did you mean, and Custom… prices something no library has. Esc closes the drawer. The "+" search on the GGA sheet stays as it was.

Just type: the search box keeps the cursor while results come in, on every tab, and switching tabs puts the cursor back in the box. The first search of each kind after a library loads takes a moment (about half a second for the Master Library's fifteen thousand traits); every keystroke after that is answered at once.

The window remembers its size and place for you.

9. Current HP and FP

Damage and fatigue belong to play, not to the build. Editing the build never changes your current HP, FP or QP: before every refresh Sheetwright writes your current values into the character file, so GGA's "keep or overwrite current HP/FP?" question never comes up, and the downloaded file shows the same damage in desktop GCS. The two exceptions are deliberate: Start new starts you at full pools, and Load .gcs uses the damage recorded in the file.

Other modules can add pools of their own to this: with the Shattered Earth override on, your current SP (Stability Points) is kept through every edit the same way, with the same two exceptions.

10. Snapshots

Snapshots in the Sheetwright menu lists earlier versions of the character: when, why and who. Restore puts one back, and the current version is kept as a snapshot first, so a restore can itself be undone. How many are kept, and whether every sheet edit takes one, are world settings (below).

11. Download .gcs

Download .gcs (Sheetwright menu, or right-click in the Actors sidebar) saves the character as <name>.gcs. It opens in desktop GCS unchanged, and it imports back through GGA as the same character. Use it to back up, to share with someone who doesn't use Foundry, or to keep working in desktop GCS.

Other modules that watch imports

Sheetwright shows every edit on the GGA sheet through GGA's own character importer, so a module that reacts to imports (the Shattered Earth override's advancement ledger is one) would otherwise take each click for a new character file. Sheetwright marks its own refreshes so those modules can skip them, and tells them once per edit what changed — a line like "Added Stealth (4 pts)" or "Undo: Added Stealth (4 pts)" — after the sheet shows it. With the Shattered Earth override that means one advancement proposal per edit for the GM, and none for a refresh — once the character is out of build: while you are still building it, SE takes each edit as the new baseline without asking (its Advancement window has the In build switch). A file you import through GGA's own Import button is still a real import, and GGA's re-import still finds the file you first imported from. Module authors: the hook is sheetwright-gga.committed, and Sheetwright.playState.register keeps a pool of yours through edits; both are described in the README.

12. Settings

Library search on "+" (world)"+" on the traits, skills and spells lists of an engine character opens the library search (section 4). Default on. Turn it off to get GGA's plain blank row back; the Sheetwright menu still offers Add a trait, skill or spell.
"Did you mean" suggestions (world)When a search finds few exact names, the "+" search and the builder filter also list names spelled close to what was typed (section 4). Default on. Turn it off if the suggestions only get in your table's way.
Fix misspelled names typed on the sheet (world)A row typed onto the GGA sheet with a slightly misspelled name is taken from the library when exactly one name is that close; the console says so (section 4). Default on. Turn it off if only exact names should come from the library.
Snapshots kept per character (world)How many earlier versions are kept for Restore. Default 5. Raise it for a longer undo history; lower it if actor data feels heavy.
When to take snapshots (world)Always before big actions (start new, load, restore, a GGA import). Choose "every sheet edit" too if you want to undo single point changes; it uses up the history faster.
New characters use the engine automatically (world)New character actors start as blank engine characters. Turn it on once everyone builds with Sheetwright. Default off.
Lock marks on computed values (per player)The small lock beside levels and point costs (section 6). Default on. Turn it off if the sheet feels busy.
Breakdown tooltips on computed values (per player)The engine's breakdown when you hover a level or cost (section 6). Default on. Turn it off if the tooltips get in your way during play.
Show engine timing in the console (per player)Writes how long each engine call took to the browser console. Turn it on when something feels slow and you want numbers to report.
Campaign points (world)The point total characters are built on; the builder's budget bar measures against it and writes it into the character. Default 150 (Basic Set B10: heroes are built on 100 to 200). One character can have its own total in the builder.
Disadvantage limit (world)How many points of disadvantages a character may take, quirks not counted. Default -50 (Basic Set B11). The builder warns past it but never blocks.
Quirk limit (world)How many quirks a character may take. Default 5 (Basic Set B11). The builder warns past it but never blocks.
House library (world)Your table's own library, by its name in the Libraries list. When the same entry is in several libraries the drawer lists this one first and Add takes it. Leave it empty if you only use the Master Library.
Higher contrast (per player)Makes Sheetwright's quieter text full strength, its bands, stripes and lines stronger, and its icons solid, in both Foundry themes. Turn it on if gray text or the shaded rows are hard to read on your screen. Foundry has no contrast setting of its own (its UI settings are size, font, colors and fade), so this is Sheetwright's.
Start the GCS engine when the world opens (per player)Starts the rules engine and reads your libraries (templates too, quietly) as soon as the world has loaded, so the first builder click is instant instead of waiting for the libraries. On by default; turn it off on a slow machine or if you never build characters, and the engine starts the first time you need it.
Load templates in the background (per player)After the libraries load, your browser quietly downloads the template files too, pausing while you work, so the template panel is ready when you open it. On by default; turn it off on a metered or slow connection, and templates load when you open the panel.
Builder text size (per player)How big everything in the builder is drawn: Small (as before), Medium, Large, Extra large. Change it if the builder's text is hard to read; the Aa button on the builder's toolbar steps through the same sizes.
Keep template groups (world)On: a template's rows arrive in its own groups, as desktop GCS shows them. Off: they arrive as bare rows (meta-traits, alternative abilities and ancestries still stay whole). Turn it off if your table prefers flat lists; it changes templates applied from then on, and Reset to template repeats what was done. Numbered option folders ("3.") never stay, whatever this says.
Attribute increases from templates (world, GM)The game's rule for attribute increases a template gives. Meet (default): a template raises an attribute only up to what it asks — a second template with Increased Strength 1 adds nothing to a character who already has ST 11 from the first. Stack: every template's increases are added on top. Pick Stack if your templates are written as bought add-ons meant to pile up. It applies to every template and every character in the world; there is no switch per template or per character, and players only see it. Changing it never rewrites a character already built; Reset to template follows the setting as it is then. (section 8)
Builder layout, collapsed groups (per player, hidden)The blocks you show in the builder and their order (Layout), and the groups you folded shut.
Builder window size (per player, hidden)Where and how big the builder window opens for you. Set by moving or resizing the window.
GCS libraries (world, GM)Opens the Libraries panel (section 2).

13. What this version doesn't do yet

14. Troubleshooting

Sheetwright fails safe. If the engine can't load, or a library can't be read, GGA keeps working exactly as it does without Sheetwright. Your rolls are never blocked and no GGA control is hidden.

Press F12 and open the Console. Sheetwright's messages start with Sheetwright |. To get a full report to paste into a bug report, type:

Sheetwright.diagnose()

Select the character's token first to include its details. It shows the engine version and load time (its line reads like the Help window's: Sheetwright 0.4.8 · GCS engine 5.53.0 (fork 19dcf3c1)), the libraries and their counts, the last edit sent to the engine and its result, and the last refresh. Each part can be asked on its own: Sheetwright.engine.diagnose(), Sheetwright.libraries.diagnose(), Sheetwright.sync.diagnose(), Sheetwright.project.diagnose(), Sheetwright.picker.diagnose(), Sheetwright.edits.diagnose(), Sheetwright.decorate.diagnose(), Sheetwright.adopt.diagnose(), Sheetwright.builder.diagnose(), Sheetwright.builderActions.diagnose(), Sheetwright.committed.diagnose(), Sheetwright.names.diagnose(), Sheetwright.templateIndex.diagnose(), Sheetwright.entity.diagnose(actor), Sheetwright.version.diagnose().

Which version am I running? The Help window's top line and the Libraries window's both say, for example, Sheetwright 0.4.8 · GCS engine 5.53.0 (fork 19dcf3c1). The GCS engine number is the GCS release whose rules and file format Sheetwright uses. It is read from the engine itself, so it is always the one actually running.

"This file was saved by GCS 6…" Every GCS file carries a format number, and GCS raises it only with a new major version. When a character (Load .gcs) or a library file was saved by a newer GCS than Sheetwright's engine, it can't be read yet, and instead of the engine's own error you see: "This file was saved by GCS 6. Sheetwright's engine is GCS 5.53.0, which can't read it yet. Update Sheetwright, or re-save the file from GCS 5.53.0 or earlier." Nothing on the character changes. Update Sheetwright (a newer one carries a newer engine), or, if you have the character in an older GCS, save it from there. For a library, only the files too new are skipped; its row in the Libraries window names the first one, and the rest of the library works.

Readability. await Sheetwright.contrast.audit() checks every Sheetwright text on screen against the 4.5:1 contrast line (3:1 for large text) and lists any that fall short, in the theme you are using. Sheetwright.contrast.emulate('deuteranopia') (or 'protanopia', 'tritanopia', 'achromatopsia') shows the page roughly as a color-blind player sees it; Sheetwright.contrast.emulate(null) puts it back. Chrome's own DevTools › Rendering › Emulate vision deficiencies does the same more exactly. Nothing in Sheetwright tells two things apart by color alone: a group is also bold with a folder icon, a selected row also bold with a bar at its edge, an active chip also bold with a check mark, an over-budget line also says how far over. In the builder, block titles (Attributes, Traits, Skills…) are in the accent color and also bold, under a tinted rule; group rows alternate a gray band and a warm one, the second also with a dashed top edge, so one group's end and the next one's start show. Higher contrast makes both bands the same strong gray (the edge still tells them apart) and the rules full strength.

The sheet keeps rows the builder doesn't have — is this an unlinked token?Most likely. Look for unlinked token in the Sheetwright menu's title. Foundry shows the base actor's own rows under an unlinked copy and nothing can remove them (see Linked and unlinked tokens). Open the menu or the builder and choose Make it its own actor; the next update replaces the lists cleanly. Sheetwright's warning says the same and is not repeated for the same rows.
The GGA sheet shows rows the character doesn't haveGGA's importer can hit an error part-way through and still report success; the lists it had not reached keep their old rows (unlocked, unpriced). After every update Sheetwright checks the sheet, projects once more, and if the rows stay it stops trying and tells you which rows they are and what kept them — usually "GGA's import never wrote the skills list" with the error GGA hit. It does not retry the same rows again. Send Sheetwright.project.diagnose(): its leftovers list each row's key, uuid and save flag, the lists GGA wrote, and GGA's error. GGA's save checkbox does not keep traits or skills (it matters only for equipment and notes), so that is not the cause.
The sheet didn't change after an editLook for a Sheetwright | warning. "engine unavailable" means the engine didn't load (check the Network tab for gcs-engine.wasm). Use Refresh the sheet from the engine in the menu.
"+" gives GGA's blank row, not the searchThe character isn't built by the engine yet (Sheetwright menu → Start new), the setting Library search on "+" is off, or the engine didn't load — Sheetwright.picker.diagnose() shows lastFallback. GGA's own "+" always works as a fallback.
No lock marks on a sheetCheck the two display settings (section 12). On a sheet layout Sheetwright doesn't know, the marks simply don't appear; Sheetwright.decorate.diagnose() lists rows it couldn't find (misses).
A number snapped backIt's a result, not an input (section 6). Change points or the attribute instead.
A library shows unreadable filesPress Test to list them. They are usually from a newer GCS than the engine (GCS 5.51).
Something went wrong with a characterOpen Snapshots and restore an earlier version.

Sheetwright for GGA is not affiliated with Steve Jackson Games. GURPS is a trademark of Steve Jackson Games. The engine is GCS by Richard A. Wilkes (Mozilla Public License 2.0).