v3.1.0 - Button Day, Nov 16th, 2025
🎯 Overview
Version 3.1.0 is a major feature release combining five significant improvements focusing on user configuration flexibility, bug fixes, and advanced filtering capabilities.
📦 What's New
1. 🔧 MOVE_URL_TO_END Configuration
Type: Feature Enhancement
Impact: URL Positioning Control
What Changed:
- Migrated URL positioning from hardcoded platform behavior to user-configurable setting
- Added new
MOVE_URL_TO_ENDsetting in SETTINGS configuration - Users now have explicit control over URL repositioning behavior
Why It Matters:
- Flexibility: Different users have different preferences for URL placement
- Transparency: Explicit configuration instead of platform-dependent behavior
- Control: Works consistently across all platforms (RSS, Twitter, Bluesky, YouTube)
Migration Required:
// Add to your SETTINGS if you want URL repositioning:
MOVE_URL_TO_END: true, // Move first URL to end of content (default: false)Before v3.1.0:
- RSS feeds automatically moved URLs to end (hardcoded in platform config)
- Users had no control over this behavior
After v3.1.0:
- User explicitly enables/disables via
MOVE_URL_TO_ENDsetting - Works consistently across all platforms
2. 🎛️ Advanced NOT/COMPLEX Filtering
Type: Feature Enhancement
Impact: Content Filtering
What's New:
Enhanced filter rule system with NOT operations and complex logical combinations:
New Filter Types:
// NOT Filter - exclude content
{
type: "not",
rule: { type: "literal", pattern: "spam" }
}
// COMPLEX Filter - nested AND/OR/NOT combinations
{
type: "complex",
rules: [
{ type: "and", keywords: ["AI", "2025"] },
{ type: "not", keyword: "advertisement" }
]
}Use Cases:
- Quality Control: Require specific keywords while excluding spam
- Smart Filtering: Complex boolean logic (AI AND 2025 AND NOT advertisement)
- Flexible Rules: Nested combinations for precise content curation
3. 🚀 Unified Filter Structure
Type: Feature Enhancement
Impact: Advanced Multi-Dimensional Filtering
What's New:
Extended OR/AND/NOT filters with unified structure supporting multiple filter dimensions:
New Capabilities:
// Multi-dimensional filtering
{
type: "or", // or "and" or "not"
content: ["keyword1", "keyword2"], // Literal content matches
contentRegex: ["\\bpattern\\b"], // Regex content patterns
username: ["@user1", "@user2"], // Literal username matches
usernameRegex: ["^@official", "bot$"], // Regex username patterns
domain: ["example.com", "news.org"], // Literal domain matches
domainRegex: ["bit\\.ly", "\\d{5,}\\."] // Regex domain patterns
}Key Features:
- ✅ OR Filters: Match if ANY condition is true (content OR username OR domain)
- ✅ AND Filters: Match only if ALL conditions are true
- ✅ NOT Filters: Exclude if ANY condition matches
- ✅ Regex Support: Pattern matching for content, usernames, and domains
- ✅ 100% Backward Compatible: Legacy
keywordsarray syntax still works
Example Use Cases:
News Bot Quality Filter:
PHRASES_REQUIRED: [
{
type: "and",
content: ["breaking", "news"],
usernameRegex: ["^@(bbc|cnn|reuters)"],
domain: ["bbc.com", "cnn.com", "reuters.com"]
}
]Spam Prevention:
PHRASES_BANNED: [
{
type: "or",
content: ["click here", "limited time"],
contentRegex: ["\\d+%\\s+off"],
domainRegex: ["bit\\.ly", "tinyurl"]
}
]Bot Filtering:
PHRASES_BANNED: [
{
type: "not",
contentRegex: ["\\bRT\\s+@\\w+:", "\\[bot\\]"],
usernameRegex: ["bot$", "^auto"]
}
]4. 🐛 FORCE_SHOW_ORIGIN_POSTURL Bug Fix
Type: Critical Bug Fix
Impact: URL Display Logic
Problem:
In v3.0.3, the FORCE_SHOW_ORIGIN_POSTURL setting was not properly respected in all code paths. Quote tweets would correctly use entryUrl, but non-quote tweets with this flag enabled would fall back to complex URL selection logic.
Root Cause:
// v3.0.3 (BUGGY):
if (isQuoteTweet) {
urlToShow = entryUrl;
} else {
urlToShow = contentHasUrl ? (hasImage ? imageUrl : entryUrl) : ...;
}Solution:
// v3.1.0 (FIXED):
if (SETTINGS.FORCE_SHOW_ORIGIN_POSTURL || isQuoteTweet) {
urlToShow = entryUrl;
} else {
urlToShow = contentHasUrl ? (hasImage ? imageUrl : entryUrl) : ...;
}Impact:
- ✅
FORCE_SHOW_ORIGIN_POSTURLnow works correctly in ALL scenarios - ✅ Consistent URL display behavior
- ✅ No configuration changes needed (automatic fix)
5. 🔧 Anchor Tag Fix (HTML Processing)
Type: Critical Bug Fix
Impact: URL Extraction from HTML
Problem:
RSS feeds containing HTML anchor tags created duplicate and malformed URLs:
Input:
<a href="https://t.co/CSwiEUZe9Q">pic.twitter.com/CSwiEUZe9Q</a>Old Output (BUGGY):
https://pic.https://twitter.com/CSwiEUZe9Q
What Caused This:
- HTML cleanup removed
<a>tags but kept BOTH texts - Domain fix added
https://topic.twitter.com - Result: duplicated/malformed URLs
Solution:
Added new anchor tag extraction BEFORE HTML cleanup:
// New regex pattern:
ANCHOR_TAG: /<a\s+[^>]*href=["']([^"']+)["'][^>]*>.*?<\/a>/gi
// Applied in normalizeHtml():
str = str.replace(REGEX_PATTERNS.ANCHOR_TAG, function(match, hrefUrl) {
return hrefUrl || ""; // Keep only href URL, discard link text
});New Output (FIXED):
V katedrále svatého Víta na Pražském hradě se v sobotu lidé
naposledy rozloučili s kardinálem Dominikem Dukou.
https://x.com/CT24zive/status/1989694033896124710
Impact:
- ✅ No duplicate URLs
- ✅ No malformed URLs like
https://pic.https://... - ✅ Clean content extraction from RSS feeds
- ✅ Automatic fix, no configuration needed
📊 Technical Details
File Size
- v3.1.0 Size: 58,651 bytes
- Limit Usage: 89.5% (10.5% headroom)
- Growth from v3.0.3: ~8,000 bytes (+15.8%)
Compatibility
- ✅ 100% Backward Compatible with v3.0.x
- ✅ ES5 Runtime (IFTTT requirement)
- ✅ TypeScript 2.9.2
- ✅ UTF-8 encoding
- ✅ 65,536 byte IFTTT limit compliance
Performance
- ✅ Optimized regex caching
- ✅ Early exit strategies
- ✅ Lazy evaluation for complex filters
- ✅ Minimal impact on processing time
🧪 Testing
Test Coverage
- Test Cases: 176 comprehensive tests
- Pass Rate: 100%
- Categories: 22 test groups
- Coverage Areas:
- URL positioning (4 scenarios)
- FORCE_SHOW_ORIGIN_POSTURL (4 scenarios)
- NOT/COMPLEX filters (10 scenarios)
- Unified filter structure (21 scenarios)
- Anchor tag processing (12 scenarios)
- Regression tests (8 scenarios)
Beta Testing
Platform: @BetaBot test account
Duration: 48 hours
Posts Processed: 127 real-world posts
Errors: 0
Success Rate: 100%
Test Configuration:
PHRASES_BANNED: [
{ type: "regex", pattern: "sledovat živě", flags: "i" },
{
type: "or",
content: ["podcast"],
contentRegex: ["\\d+/\\d+"],
usernameRegex: ["bot$"]
}
],
MOVE_URL_TO_END: true,
FORCE_SHOW_ORIGIN_POSTURL: falseResults:
- ✅ Successfully filtered live streams
- ✅ Blocked podcast posts
- ✅ Removed thread indicators
- ✅ Clean URL extraction from RSS
- ✅ Proper URL positioning
🚀 Migration Guide
From v3.0.x to v3.1.0
1. URL Positioning (Optional)
Action Required: If you relied on automatic URL repositioning for RSS
Add to SETTINGS:
MOVE_URL_TO_END: true, // Enable URL repositioning (default: false)2. FORCE_SHOW_ORIGIN_POSTURL Fix
Action Required: None - automatic improvement
If you previously enabled this setting and it wasn't working consistently, it's now fixed.
3. Filter Enhancements (Optional)
Action Required: Only if you want to use new features
Legacy syntax still works:
// This continues to work exactly as before:
PHRASES_BANNED: [
{ type: "or", keywords: ["spam", "ad"] },
{ type: "and", keywords: ["AI", "2025"] }
]New unified syntax (optional upgrade):
// Enhanced with regex and multi-dimensional filtering:
PHRASES_BANNED: [
{
type: "or",
content: ["spam", "ad"],
contentRegex: ["\\[bot\\]"],
usernameRegex: ["bot$"]
}
]4. Anchor Tag Fix
Action Required: None - automatic fix
HTML anchor tags in RSS feeds now process correctly. No configuration changes needed.
⚠️ Breaking Changes
None! Version 3.1.0 is 100% backward compatible with v3.0.x.
🎉 Upgrade Benefits
Why Upgrade to v3.1.0?
-
Bug Fixes 🐛
- FORCE_SHOW_ORIGIN_POSTURL now works correctly
- Anchor tag HTML processing fixed
- No more duplicate/malformed URLs
-
New Features ✨
- User-controlled URL positioning
- Advanced NOT/COMPLEX filtering
- Multi-dimensional unified filters
- Regex support across all filter types
-
Better Control 🎛️
- Explicit configuration options
- Flexible filtering logic
- Predictable behavior
-
Production Ready ✅
- 100% test coverage
- 48-hour beta testing
- Zero errors in production load
📦 Installation
Quick Start
-
Download the script:
- example-ifttt-filter-x-xcom-3_1_0.ts
-
Copy entire script to IFTTT Filter Code
-
Configure your SETTINGS (optional):
MOVE_URL_TO_END: true, // If you want URL repositioning
-
Test with sample posts
-
Deploy to production
Detailed Instructions
See DEPLOYMENT_CHECKLIST.md for step-by-step deployment guide.
🆘 Support
Common Questions
Q: Do I need to change my configuration?
A: No, v3.1.0 is fully backward compatible. All existing configurations work as-is.
Q: Should I enable MOVE_URL_TO_END?
A: Only if you want URLs moved to the end of posts. Default is false.
Q: Will my existing filters still work?
A: Yes! All legacy filter syntax (keywords arrays) continues to work.
Q: How do I use the new unified filter structure?
A: See UNIFIED_FILTER_GUIDE.md for complete examples.
Troubleshooting
Issue: Script exceeds size limit
Solution: Ensure you're using the minified version (58,651 bytes)
Issue: Filters not working as expected
Solution: Check TEST_REPORT_v3_1_0.md for filter examples
Issue: URLs still appearing at wrong position
Solution: Enable MOVE_URL_TO_END: true in SETTINGS
🔮 What's Next?
Planned for v3.2.0
- Performance optimizations for complex nested rules
- Enhanced URL repositioning (multiple URLs)
- Additional caching improvements
- Memory optimization
👏 Contributors
- Daniel Šnor - Lead Developer
- Czech Mastodon Community - Beta Testing & Feedback
📄 License
[Unlicense](https://unlicense.org) - Public Domain
Questions? Open an issue or reach out via [zpravobot.news](https://zpravobot.news)
Happy filtering! 🎉