Cap moved from /cap/ under this app to cap.pedshub.com, so anything else on this machine can use the same instance. Caddy terminates it, the backend keeps verifying over the compose network rather than going out and back, and the widget endpoint is configuration rather than a path baked into the component. Verified: a challenge is issued on the subdomain, and a token that was never issued is still refused. "Correct using hints" is now a per-topic figure. The knowledge profile's accuracy bar was two-tone because /study-tools/recommendations carried only `answered` and `correct`; the hint count existed lifetime-wide but never per topic, and inferring one from the other would have been a different set of answers drawn as though it were this one. The column was already on attempt_answers, so it is a group-by, and the bar is three-tone as the reference has it. And the objective is asked for. It decides which questions exist, how relevance is weighted, and what readiness measures against — and it was possible to sit a whole board paper without ever being asked, because no objective quietly means the entire bank. That is a reasonable default and a poor thing to arrive at by accident. Five of six accounts here had never set one. It can be declined: "everything" is a real answer, and trapping somebody behind a modal because a list failed to load would be worse than the gap it closes. Declining is still a choice made, which is the point. Also in this commit, from the exam-player work: Show answer in study mode that reveals without recording an answer, review keyed on the attempt being closed rather than every question being answered — a block that timed out with nothing answered is over too — and the exam top and bottom bars. That work found something worth knowing: the exam player is *served* questions with no correct answer and no explanation, so review cannot un-hide what it never had, and the player refetches the marked version once the attempt closes. Nothing is revealed while a block is running. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TqXevQJhxFrM7jJg82cgZN
11 lines
338 B
Bash
Executable file
11 lines
338 B
Bash
Executable file
#!/bin/sh
|
|
# Generate runtime config from environment variables.
|
|
# This avoids baking secrets/keys into the Docker image at build time.
|
|
cat > /usr/share/nginx/html/config.js <<EOF
|
|
window.__APP_CONFIG__ = {
|
|
CAP_SITE_KEY: "${CAP_SITE_KEY:-}",
|
|
CAP_API_URL: "${CAP_PUBLIC_URL:-https://cap.pedshub.com}"
|
|
};
|
|
EOF
|
|
|
|
exec nginx -g 'daemon off;'
|