Commit graph

16 commits

Author SHA1 Message Date
Barely Removable
3270a9fe69 Harden: cap request body before reading, WAL for concurrent writes, socket timeout, surface unmeasured edges
- _body() read the full declared Content-Length into memory before any size
  check, so MAX_UPLOAD_BYTES could only reject an upload already held in
  RAM. nginx caps this on the proxied path, but the container also listens
  on the LAN, so the app now enforces its own 20MB ceiling and closes the
  connection rather than reading.
- SQLite ran with the default rollback journal and 5s lock timeout, chosen
  when a row was a few KB; rows now carry the original photos, so two
  people grading at once could block each other's History. WAL + 30s.
- No socket timeout meant a stalled keep-alive connection held a worker
  thread indefinitely.
- An edge excluded as a different material was dropped from the UI with no
  explanation, presenting three sides as though they were all four.
2026-08-22 12:56:58 -07:00
Barely Removable
f8db3df605 Full PSA palette: light silver ground, brand red accent, dark text 2026-08-22 12:41:53 -07:00
Barely Removable
2abb568c49 Slab label: promote range to the focal line when the card name is suppressed 2026-08-22 12:32:28 -07:00
Barely Removable
f910a603c3 PSA-slab theme: render the verdict as a slab label, matching grade chips in history 2026-08-22 12:31:15 -07:00
Barely Removable
3c98373ad6 Refine slab mark proportions; stack header+banner instead of magic top offset 2026-08-22 12:26:11 -07:00
Barely Removable
527558bef2 UI: slab brand mark replacing checkmark, header aligned to page column, flatter controls 2026-08-22 12:20:56 -07:00
Barely Removable
fa5467e55d Refuse centering measurement on die-cut/clear-window cards
Same failure family as the edge-whitening fix: centering_profile assumed a
uniform printed border, so on an E-X/SPx-style die-cut the side midpoint
samples landed on clear acetate and the border-width walk measured two
different materials, producing a confident 70/30 the model then treated as
authoritative. Now the four side samples must read as the same material or
the measurement refuses with the reason; the prompt tells the model to judge
die-cut centering as design-to-cut registration instead.
2026-08-22 11:34:36 -07:00
Barely Removable
bb5d50502c Docker hardening (non-root, healthcheck, .dockerignore, log caps) + UI table/typography polish 2026-08-22 11:25:52 -07:00
Barely Removable
e586bc92e7 Add Regrade: instant re-run when photos are stored, fallback re-pick otherwise
Stores the original photo(s) for every card graded from now on, so an
existing history row can be re-graded in place without re-uploading -- most
useful right after a grading-logic fix like the last few commits. Cards
graded before this feature (or saved without images) fall back to the same
photo picker as a fresh grade, then start getting instant regrades from then
on. list_grades/get_grade now select an explicit column list rather than
SELECT * so the stored images are never pulled into memory just to be
discarded for the browser-facing response.
2026-08-22 11:17:06 -07:00
Barely Removable
f464faca43 Add aspect-ratio measurement as a soft trimming signal, reported against every standard card size 2026-08-22 11:03:54 -07:00
Barely Removable
5ef97ad4ad Drop duplicated card name from the slab inside the history modal 2026-08-22 09:51:30 -07:00
Barely Removable
cc104e7e35 Pin modal close button top-right when the card name wraps 2026-08-22 09:49:53 -07:00
Barely Removable
7f62e4ad7c Redesign: collector-grade dark theme, slab promoted to hero element 2026-08-22 09:48:26 -07:00
Barely Removable
27a6b49b37 Surface install-prompt failures instead of failing silently 2026-08-22 09:40:43 -07:00
Barely Removable
6b247794db Add a dedicated Take Photo button alongside the library picker 2026-08-22 09:32:10 -07:00
Barely Removable
c7bd71a3e1 Initial commit: Card Grader deployed to hippofam.com/cards
PWA card-grading app, deployed behind Nginx Proxy Manager on Unraid with
basic auth. Includes CARD_GRADER_BASE_PATH support for running under a
sub-path, and Docker/compose config for the Unraid deployment.
2026-08-22 09:22:41 -07:00