Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,8 @@ dist/enhanced/
# public/cards/hacking/ are the committed record; these are intermediates.
# node scripts/hacking-legends.mjs all
dist/hacking/

# Security Professionals (Series Three) working dirs. Same deal — the published
# faces under public/cards/security/ are the committed record.
# node scripts/security-pros.mjs all
dist/security/
29 changes: 23 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,30 @@ Chromium — set `CHROME_PATH` if it is not on the usual paths.
`dist/hacking/` is gitignored, so the full-resolution faces are local only.
Archive them before wiping the directory if you want print masters.

**Series Three — Security Professionals** (`src/data/security.ts`, roster only):
**Series Three — Security Professionals** (`src/data/security.ts`, 50 cards):

50 hand-curated cards for the defensive side of the field. Copy and sources are
written; no art pipeline exists yet, so the set renders as a data-only roster at
`/security-professionals` and its cards have no `front`/`back` and no card pages.
When art starts, copy `scripts/hacking-legends.mjs` — the data module already
carries every field that pipeline reads.
```bash
pnpm security validate # roster checks, reports what art is missing
pnpm security all # portraits -> render -> publish
pnpm security all 1 5 12 # ...only these card numbers
pnpm security render # re-render faces from the template, no API calls
```

Same stages and the same resumability as Series Two, with one deliberate
difference: **`all` does not run `enhance`.** On Series Two that image-to-image
finish pass rewrote text on the card faces despite the prompt forbidding it — it
fabricated quotes attributed to living people, invented stat panels that were not
on the card, and misspelled a name. Nothing in the pipeline catches that, because
there is no OCR step. Since this set's whole premise is documented, sourced
history, an invented quote is the worst defect it can carry, so the pass is
opt-in: it refuses to run unless `ENHANCE_I_WILL_CHECK_EVERY_FACE=1` is set, and
running it means checking every face by eye before publish.

Two template changes follow from the same finding. The curator's note renders as a
labelled panel rather than wrapped in quote marks, because on Series Two backs the
quoted note reads as something the subject said — the field is editorial voice.
And the front's portrait window is taller, so the caption band is sized to what it
holds instead of leaving a third of the card empty.

Nobody appears in more than one series; `src/data/roster.ts` holds the shared card
vocabulary that Series Two and Three both render through.
Expand Down
Binary file added assets/portraits/security-pros/card_001.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_002.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_003.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_004.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_005.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_006.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_007.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_008.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_009.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_010.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_011.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_012.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_013.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_014.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_015.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_016.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_017.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_018.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_019.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_020.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_021.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_022.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_023.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_024.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/portraits/security-pros/card_026.png
Binary file added assets/portraits/security-pros/card_027.png
Binary file added assets/portraits/security-pros/card_028.png
Binary file added assets/portraits/security-pros/card_029.png
Binary file added assets/portraits/security-pros/card_030.png
Binary file added assets/portraits/security-pros/card_031.png
Binary file added assets/portraits/security-pros/card_032.png
Binary file added assets/portraits/security-pros/card_033.png
Binary file added assets/portraits/security-pros/card_034.png
Binary file added assets/portraits/security-pros/card_035.png
Binary file added assets/portraits/security-pros/card_036.png
Binary file added assets/portraits/security-pros/card_037.png
Binary file added assets/portraits/security-pros/card_038.png
Binary file added assets/portraits/security-pros/card_039.png
Binary file added assets/portraits/security-pros/card_040.png
Binary file added assets/portraits/security-pros/card_041.png
Binary file added assets/portraits/security-pros/card_042.png
Binary file added assets/portraits/security-pros/card_043.png
Binary file added assets/portraits/security-pros/card_044.png
Binary file added assets/portraits/security-pros/card_045.png
Binary file added assets/portraits/security-pros/card_046.png
Binary file added assets/portraits/security-pros/card_047.png
Binary file added assets/portraits/security-pros/card_048.png
Binary file added assets/portraits/security-pros/card_049.png
Binary file added assets/portraits/security-pros/card_050.png
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@
"db:migrate": "node scripts/migrate.mjs",
"hacking": "node scripts/hacking-legends.mjs",
"hacking:validate": "node scripts/hacking-legends.mjs validate",
"hacking:render": "node scripts/hacking-legends.mjs render"
"hacking:render": "node scripts/hacking-legends.mjs render",
"security": "node scripts/security-pros.mjs",
"security:validate": "node scripts/security-pros.mjs validate",
"security:render": "node scripts/security-pros.mjs render"
},
"dependencies": {
"@libsql/client": "^0.17.4",
Expand Down
Binary file added public/cards/security/002-martin-hellman-back.png
Binary file added public/cards/security/003-ron-rivest-back.png
Binary file added public/cards/security/003-ron-rivest-front.png
Binary file added public/cards/security/004-adi-shamir-back.png
Binary file added public/cards/security/004-adi-shamir-front.png
Binary file added public/cards/security/007-bruce-schneier-back.png
Binary file added public/cards/security/008-paul-kocher-back.png
Binary file added public/cards/security/008-paul-kocher-front.png
Binary file added public/cards/security/010-gene-spafford-back.png
Binary file added public/cards/security/011-ross-anderson-back.png
Binary file added public/cards/security/012-matt-blaze-back.png
Binary file added public/cards/security/012-matt-blaze-front.png
Binary file added public/cards/security/013-radia-perlman-back.png
Binary file added public/cards/security/016-marcus-ranum-back.png
Binary file added public/cards/security/016-marcus-ranum-front.png
Binary file added public/cards/security/018-dan-farmer-back.png
Binary file added public/cards/security/018-dan-farmer-front.png
Binary file added public/cards/security/019-gordon-lyon-back.png
Binary file added public/cards/security/019-gordon-lyon-front.png
Binary file added public/cards/security/020-martin-roesch-back.png
Binary file added public/cards/security/021-gerald-combs-back.png
Binary file added public/cards/security/021-gerald-combs-front.png
Binary file added public/cards/security/023-paul-vixie-back.png
Binary file added public/cards/security/023-paul-vixie-front.png
Binary file added public/cards/security/024-niels-provos-back.png
Binary file added public/cards/security/024-niels-provos-front.png
Binary file added public/cards/security/026-robert-hansen-back.png
Binary file added public/cards/security/027-mark-curphey-back.png
Binary file added public/cards/security/027-mark-curphey-front.png
Binary file added public/cards/security/028-jeff-williams-back.png
Binary file added public/cards/security/029-gary-mcgraw-back.png
Binary file added public/cards/security/029-gary-mcgraw-front.png
Binary file added public/cards/security/030-michael-howard-back.png
Binary file added public/cards/security/031-adam-shostack-back.png
Binary file added public/cards/security/032-ivan-ristic-back.png
Binary file added public/cards/security/032-ivan-ristic-front.png
Binary file added public/cards/security/033-mark-dowd-back.png
Binary file added public/cards/security/033-mark-dowd-front.png
Binary file added public/cards/security/034-halvar-flake-back.png
Binary file added public/cards/security/034-halvar-flake-front.png
Binary file added public/cards/security/035-alex-sotirov-back.png
Binary file added public/cards/security/035-alex-sotirov-front.png
Binary file added public/cards/security/037-matthew-green-back.png
Binary file added public/cards/security/039-nadia-heninger-back.png
Binary file added public/cards/security/040-troy-hunt-back.png
Binary file added public/cards/security/040-troy-hunt-front.png
Binary file added public/cards/security/041-window-snyder-back.png
Binary file added public/cards/security/042-heather-adkins-back.png
Binary file added public/cards/security/043-parisa-tabriz-back.png
Binary file added public/cards/security/044-alex-stamos-back.png
Binary file added public/cards/security/044-alex-stamos-front.png
Binary file added public/cards/security/045-dan-geer-back.png
Binary file added public/cards/security/045-dan-geer-front.png
Binary file added public/cards/security/046-kevin-mandia-front.png
Binary file added public/cards/security/048-robert-m-lee-back.png
Binary file added public/cards/security/048-robert-m-lee-front.png
Binary file added public/cards/security/049-lesley-carhart-back.png
Binary file added public/cards/security/050-katie-nickels-back.png
Loading
Loading