Replace hardcoded id-based section lookup with declarative rules:
- data-show-category="games|books|films" on sections
- data-hide-status="unending" on individual fields
JS now has a single updateVisibility() that evaluates attributes.
Adding new conditions only requires touching HTML, not JS.
Also hides Progress and Total Hours for unending items.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
0007_merge referenced 0006_item_category_unending which git had
renamed, causing NodeNotFoundError on clean DBs. Restores the file
so both 0006 leaves exist, then 0008 reverts the stale category
choices back to the correct set (no unending in category).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
0006_item_category_unending was already applied to the dev DB before
the rename commit, causing a conflict with 0006_item_status_unending.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Unending belongs in STATUS_CHOICES alongside completed/abandoned.
Adds an Unending shelf tab and an ∞ button on active game cards.
Reverts the incorrect category addition from the previous commit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
For games like Dota 2 that have no completion state — shows hours
played on the card, reuses the games fields in the form (hours played
/ total hours), and gets its own cyan badge. No DB column change,
only choices metadata update.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Items can be moved to Completed or Abandoned via card buttons.
Only active items appear in the default/category tabs; completed and
abandoned items are visible only in their respective shelf tabs.
Restore button moves items back to active.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fetch HLTB main/extra/completionist hours when a game item is saved
- Re-fetch only when name or category changes on edit
- Steam imports also fetch HLTB for each selected game
- Cards show compact HLTB row: "HLTB: 40h · +extra 60h · 100% 100h"
- Edit form shows HLTB breakdown as a hint next to Total hours field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Steam OpenID flow: user authenticates with Steam, we get their Steam ID
- Server-side API key fetches their owned games with playtime
- Import page shows full library, marks already-imported games
- Imported games land in backlog as GAMES items with hours_played set
- STEAM_API_KEY env var plumbed into both prod and dev containers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add debug.killmybacklog.com nginx config (IP-restricted to 164.215.8.152)
- Add django-dev container on port 8081 in docker-compose
- Add dev branch pipeline step deploying to django-dev
- Add killmybacklog.com and debug subdomain to ALLOWED_HOSTS/CSRF origins
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Django raises VariableDoesNotExist when a failed dict lookup is used as a
filter argument (|default:mineral.properties_ru.X). Rewrite color description
to use an {% if %} block so the dict lookup is always the main variable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add properties_ru JSON field to store translated category, crystal_system,
luster, streak, specific_gravity, color_description
- Add translate_minerals management command using deep-translator (Google
Translate), with a hard-coded dictionary for crystal systems
- Template: show translated values in RU mode, fall back to English if missing
- Add deep-translator to requirements.txt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- EN mode no longer shows Russian subtitle under mineral name
- RU mode now correctly reveals all lang-ru elements via CSS body.mode-ru rules
- Subtitle in RU mode shows English name as reference below Russian heading
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Russian fields on Mineral model (name_ru, description_ru, history_ru, etc.)
- scrape_minerals_ru management command fetches from Russian Wikipedia via langlinks
- EN/RU toggle in header, saved to localStorage
- Speaker button next to mineral name uses Web Speech API
- Section headers and labels translated
- Russian Wikipedia link in footer when in RU mode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Search bar toggle in header (magnifying glass icon)
- /daily-stone/search/?q= endpoint with results list
- /daily-stone/mineral/<id>/ permalink for each mineral
- Mineral count shown in footer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Removed readonly on image_urls so URLs can be changed in admin.
Added list_editable for day_of_year and color_hex for quick edits.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SVG gem shape as inline data URI, automatically tinted with the
mineral's color_hex. No static assets needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a template filter that cleans up spaced-out formulas from scraping
and wraps subscript numbers in <sub> tags for proper display.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New dailystone app with 207 minerals scraped from Wikipedia.
Each day displays a different mineral with photos, formula,
properties, description, and history. Page theme color matches
the mineral's typical appearance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Django app with Item model (games/books/films/other categories), CRUD
views, and login-required access. Login page at /accounts/login/ uses
custom dark-themed template consistent with the site design.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>