- Enhanced update-cache-version.js to update service worker and version.json
- Added inst_075 governance instruction (HIGH persistence)
- Integrated cache check into deployment script (Step 1/5)
- Created CACHE_MANAGEMENT_ENFORCEMENT.md documentation
- Bumped version to 0.1.1
- Updated all HTML cache parameters
BREAKING: Deployment now blocks if JS changed without cache update
- Create Economist SubmissionTracking package correctly:
* mainArticle = full blog post content
* coverLetter = 216-word SIR— letter
* Links to blog post via blogPostId
- Archive 'Letter to The Economist' from blog posts (it's the cover letter)
- Fix date display on article cards (use published_at)
- Target publication already displaying via blue badge
Database changes:
- Make blogPostId optional in SubmissionTracking model
- Economist package ID: 68fa85ae49d4900e7f2ecd83
- Le Monde package ID: 68fa2abd2e6acd5691932150
Next: Enhanced modal with tabs, validation, export
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
SUMMARY:
Added version query strings to script tags on privacy.html to force
browser cache refresh for i18n updates.
CHANGES:
- Added ?v=20251019145500 to i18n-simple.js
- Added ?v=20251019145500 to language-selector.js
- Added ?v=20251019145500 to footer.js
IMPACT:
Users will now load the updated JavaScript that knows how to load
common.json for footer translations. Prevents stale cache issues.
🤖 Generated with Claude Code (https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
SUMMARY:
Implemented complete internationalization for footer component and
privacy page across English, German, and French languages.
CHANGES:
1. Privacy Page Translations (3 files):
- Created locales/en/privacy.json (baseline)
- Created locales/de/privacy.json (German - Datenschutzerklärung)
- Created locales/fr/privacy.json (French - Politique de confidentialité)
- All 11 sections + Te Tiriti fully translated
2. Footer i18n Enhancement:
- Rewrote footer.js with data-i18n attributes
- Added languageChanged event listener for dynamic updates
- Expanded homepage.json footer translations (en/de/fr)
- Footer now auto-translates with language selection
3. Privacy Page Integration:
- Added data-page="privacy" attribute to HTML
- Added data-i18n to all content sections (header + 11 sections)
- Integrated with existing language-selector.js component
- Updated i18n-simple.js pageMap to recognize privacy page
4. Bug Fix:
- Fixed SessionStart hook error in .claude/settings.local.json
- Changed from $CLAUDE_PROJECT_DIR to absolute path
- Hook now runs successfully at session start
BENEFITS:
- Better UX for international users (German, French speakers)
- Legal compliance (privacy policy in native languages)
- Consistent language experience across entire site
- Leverages existing language persistence (localStorage)
INTEGRATION:
- Works with existing language-selector.js (flag icons: 🇬🇧🇩🇪🇫🇷)
- Language preference persists across all pages
- Zero duplication - integrates with existing i18n system
WCAG COMPLIANCE:
✓ Maintains semantic HTML structure
✓ Preserves WCAG AA contrast ratios
✓ All links remain accessible and distinguishable
✓ German and French translations maintain accessibility standards
FRAMEWORK COMPLIANCE:
✓ Zero CSP violations - uses data-i18n attributes only
✓ No inline scripts or styles
✓ Follows existing Tractatus i18n patterns
🤖 Generated with Claude Code (https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove inline styles from category rendering (CSP violation)
- Apply collapsed state via JavaScript after DOM insertion
- Update cache version to v=0.1.0.1760254264664 across all HTML files
- Categories now properly collapsed on page load (Research, Advanced, Case Studies, Business, Archives)
Multi-Currency Implementation:
- Add currency configuration with 10 supported currencies (NZD, USD, EUR, GBP, AUD, CAD, JPY, CHF, SGD, HKD)
- Create client-side and server-side currency utilities for conversion and formatting
- Implement currency selector UI component with auto-detection and localStorage persistence
- Update Donation model to store multi-currency transactions with NZD equivalents
- Update Koha service to handle currency conversion and exchange rate tracking
- Update donation form UI to display prices in selected currency
- Update transparency dashboard to show donations with currency indicators
- Update Stripe setup documentation with currency_options configuration guide
Privacy Policy:
- Create comprehensive privacy policy page (GDPR compliant)
- Add shared footer component with privacy policy link
- Update all Koha pages with footer component
Technical Details:
- Exchange rates stored at donation time for historical accuracy
- All donations tracked in both original currency and NZD for transparency
- Base currency: NZD (New Zealand Dollar)
- Uses Stripe currency_options for monthly subscriptions
- Dynamic currency for one-time donations
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>