- Defer polling_service.start() and FilterEngine init to a one-shot
before_request hook so importing app.py no longer spawns a scheduler
thread (also fixes migrate_*.py import side effects).
- Fix migrate_bookmarks.py: init_db returns None, so use the shared
`db` instead of assigning its None return.
- Enforce MIN_PASSWORD_LENGTH (8) in the password-reset route for
consistency with signup (was hardcoded 6).
- post_detail.html: replace undefined moment(...).fromNow() (always
"Recently") with a new timeago Jinja filter + data-timestamp attrs
that also drive the existing JS updater; make nl2br escape-then-Markup
and drop | safe from comment/post content to close the XSS hole.
- filter_pipeline: when AI is disabled but a filterset requires it,
pass posts through with status=FAILED + explicit error instead of
silently degrading to no_filter.
No source-file mojibake found; content-encoding ingest is a Phase 3 concern.
Co-Authored-By: Claude <noreply@anthropic.com>
## Problem Fixed:
Community selection in settings was using hardcoded list that didn't match the actual enabled communities in the admin panel's collection_targets configuration.
## Root Cause:
The settings_communities() function had a hardcoded list of only 6 communities, while platform_config.json defines many more communities and collection_targets specifies which ones are actually enabled.
## Solution:
- **Dynamic community loading** - Reads from platform_config.json instead of hardcoded list
- **Collection target filtering** - Only shows communities that are in collection_targets (actually being crawled)
- **Complete community data** - Includes display_name, icon, and description from platform config
- **Platform consistency** - Ensures settings match what's configured in admin panel
The community settings now perfectly reflect what's enabled in the admin panel\!
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>