π― FIXED BROKEN HTML - UNIFIED LINK
PROCESSING: Completely eliminated double-processing that caused
broken HTML! Now uses ONLY HyperlinkProcessor for all text (event descriptions +
analysis) - no more nested attributes or garbled links
πΊοΈ Automatic Location Linking: Any
text after "Location:" in OSINT Analysis automatically becomes a clickable link
- catches locations not in the known places list
π Added 10+ New Locations:
Novovoronezh, Oryol/Orel, Vovchansk, Berdiansk/Berdyansk, Yevpatoria (multiple
spellings), Kirovskoe, Morskoy Neftyanoy, Belaya Tserkov, Chornobyl/Chernobyl
π€ Split Person Names for Better
Matching: Each person now has TWO entries (full name + last name) -
both "Denys Shmyhal" AND "Shmyhal" are clickable. Applied to all 12 key people
(Zelensky, Putin, Shoigu, Gerasimov, Lukashenko, Budanov, Zaluzhnyi, Syrskyi,
Goncharenko, Grekov, Likhachev)
π» Podcast Player Shows Full Text:
Increased breakpoint from 1500px to 1100px - "Timeline Podcast" with player now
visible on wider screens, only hides on truly narrow displays
π Smart Button States in Advanced
Search: Save and Share buttons now disabled when no query built -
no more "Please build a query first" web alerts! Buttons greyed out until usable
β
Inline Share Feedback: Share
button in Advanced Search shows "β
Link Copied!" with green background instead
of web alert - auto-reverts after 2 seconds
π Compact Analysis Search Spacing:
Reduced padding between "Search within analysis sections" input and OSINT
Analysis box from 15px to 5px - tighter, cleaner layout
π± Responsive Title Fixed: Changed
breakpoint from 1500px to 900px - full "Vasama OSINT Sentiment Visualization"
now shows on normal desktop screens
Redesigned Search Help Button:
Question mark button now has proper contrast - WHITE ON BLACK in light mode,
BLACK ON WHITE in dark mode (no more horrible green/red colors!)
Beautiful Search Help Dialog:
Replaced jarring web alert with elegant modal dialog for search syntax help -
consistent with the rest of the app UI
Entity Names Cleaned: Removed
redundant titles from person names (just "Alexey Likhachev" instead of "Alexey
Likhachev (Rosatom General Director)") - prevents duplicate entries
Super-Compact Search Panel: Reduced
excessive padding throughout search panel - top padding 50% less (20pxβ10px),
tabs margin 50% less (20pxβ10px), checkbox spacing 3x tighter (8pxβ3px), Quick
Ranges box 50% less padding (15pxβ8px)
Fixed Feed Panel Resize Growth: Feed
no longer suddenly grows from 320px to 350px when resizing window - stays
consistent width at all desktop sizes
Fixed Zoom Controls Position: +/-
buttons now properly positioned at LEFT CORNER of map (not center!) - changed
map container to use padding instead of left/right offsets
Better Podcast Label Breakpoint:
"Timeline Podcast" text now hides at 1500px (when dark mode button would touch
it) - prevents any overlap
Stronger HTML Protection: Enhanced
broken HTML detection to check for onclick=, href=, title=, class= attributes -
prevents ANY re-processing of already-linked text
Cleaner Responsive Title: Wide
screens show "Vasama OSINT Sentiment Visualization", narrow screens (β€1500px)
show "Vasama OSINT" - no more awkward "Visuali" halfway word!
Global Analysis Section Padding
Control: Added CSS variable --analysis-section-padding (default:
0px) - now you can adjust padding for all analysis sections (OSINT, Named
Entities, Sentiment) in one place!
Cleaner Analysis Sections: Removed
horizontal space/margin below section headers when closed - no more wasted
vertical space between collapsed sections
Zero Top Padding in Analysis:
Reduced top padding to 0px in all analysis sections - text starts immediately
after clicking section header
Fixed Responsive Title: Title now
shows full "Visualization" by default, shortens to "Visuali" only when screen
β€1200px (no space left) - proper responsive behavior
Zoom Controls Positioning Fixed: +/-
buttons now positioned at left: 330px (to right of feed panel), uses
getBoundingClientRect() for accurate positioning below stats area - no more
overlap with feed!
Clickable Coordinates: GPS
coordinates (e.g., "50.9667Β° N, 37.2167Β° E") in analysis text now clickable -
click to center map on exact location
Enhanced Entity Linking Protection:
Universal HTML detection prevents any text with HTML tags from being
re-processed - eliminates broken HTML artifacts, nested quotes, and visible
attributes. Added 60+ word blacklist (no more "Two", "Reported", "However"
links)
Improved start.sh Error Output:
JavaScript syntax errors now show complete error messages with line numbers and
context - much easier to debug
Search Panel Stays Open: Clicking
location links now keeps search panel open for better workflow - only closes
when manually clicking Apply Filters or Search buttons
Location/Source Field Alignment:
Added event-field-label class with min-width: 75px - "Location:" and "Source:"
labels same width, values perfectly aligned vertically
Responsive Podcast Label: "Timeline
Podcast" shortens to "Timeline" on narrow screens (β€1350px), then to just emoji
+ player at β€1200px - saves horizontal space
Responsive Notifications Above Dock:
Filter notifications now dynamically positioned above dock controls - always
visible, responsive to screen size, never hidden behind buttons
Improved Zoom Controls Positioning:
Map zoom (+/-) buttons now dynamically position based on header and stats height
- responsive to content changes and screen sizes
No More Web Alerts for Filters:
Clicking weapon systems, units, or entities now shows smooth inline
notifications with color-coded backgrounds (green for success, blue for info,
red for errors) that auto-fade after 4 seconds
Clickable Location Workflow:
Clicking any location (e.g., "Sumy, Ukraine") now automatically opens search
panel, switches to Location Search tab, populates search input, and triggers
geocoding to center map
Expanded Clickable Locations: Added
Sumy and 11 more Ukrainian cities to OSINT Analysis clickable locations:
Chernihiv, Zhytomyr, Poltava, Cherkasy, Vinnytsia, Rivne, Ivano-Frankivsk,
Ternopil, Lutsk, Uzhhorod, Konotop, Shostka
Perfect Text Alignment: Location and
source lines now use baseline alignment with consistent spacing (4px gap) - no
more vertical misalignment or floating text
Balanced Stat Card Spacing:
Increased stat card padding to 8px 12px for better visual breathing room while
maintaining compact layout
Centered Dark Mode Toggle:
Dark/light mode emoji now perfectly centered using flexbox - positioned in
top-right corner with optimal padding (8px 12px)
Dark Mode Toggle Repositioned: Moved
dark/light mode toggle (π) to the top-right corner of header for better
accessibility and cleaner layout
Aligned Location & Source: Added
"Location:" label to match "Source:" format - both lines now align perfectly
(emoji + label + value)
Smart Map Search Button: Feed "Apply
Search to Map" button now disabled when search input is empty - prevents
searching for nothing with helpful tooltip
Clickable Locations: Event location
names (e.g., "Konstantinov") are now clickable links - click to search and
center map on that location
Super-Compact Top Bar: Reduced
spacing between top bar icons from 20px β 10px β 5px - now fits Favorites and
light/dark mode toggle on same row
Seamless Feed Panel: Purple gradient
now extends from top to bottom with no white gaps - header and search area made
transparent
Compact Feed Header: Reduced feed
header padding (10px vertical, 15px horizontal) and font size (18px) for tighter
layout matching stats area height
Consistent Map Attribution: Light
and dark modes now show identical attribution text ("Β© OpenStreetMap
contributors") - no more layout shifts when switching themes
Sentiment Analysis Alignment: Fixed
bullet point formatting to properly align all Target Entity entries (added
support for β’ bullet character)
Keyboard Shortcuts Complete:
Restored H shortcut (Start Tutorial) and corrected order - now shows S, F, A, T,
Esc, ?, β/β, β/β, H
Smart Entity Linking: Event
descriptions now automatically detect and link weapon systems, units, locations,
and people - click any term to instantly search for related events
Share Button Improvements: Replaced
alert popups with smooth inline feedback (button changes to "β
Copied!" with
green background)
Auto-Focus Search: When clicking on
Search button, search textfield is now automatically highlighted and focused for
easier usage - just start typing immediately!
Tour Navigation Fixed: Tutorial
"Back" button now works correctly and skips invalid targets in the right
direction
Tutorial Complete: All 11 tutorial
steps now correctly display and navigate - no more skipped steps!
Fixed all tour step targets to point to elements that
actually exist in the DOM (#feedPanel, #bottomSearchPanel, #timelineToggleBtn,
#umbrellaToggleBtn)
Added navigation direction tracking to skip steps
correctly when pressing Back vs Forward buttons
Removed changelog scrollbar - now flows naturally
within modal for cleaner appearance
Fixed feed panel light mode styling for proper theme
support
Fixed map positioning to properly cover viewport
behind header and timeline
Fixed timeline slider to overlay map instead of
pushing it down
Optimized modal spacing globally: reduced padding
between header and content
Fixed modal action buttons positioning with proper
padding from edges
Fixed calendar day clickable hotspots to match visual
rectangles
Improved event detail header: favorite star now
inline with title, saving vertical space
Fixed feed search "Apply to Map" to avoid page flash
by using targeted updates
Fixed search panel visibility: now completely hidden
when closed, no longer visible behind dock
Disabled full-screen loading overlay for instant
filter application
Optimized header layout: reduced button spacing to
fit more controls on first row
Moved timeline podcast player inline with main title
in header
Fixed My Views saved filter layout: name/date and
Load/Delete buttons now on same row
Improved Save View UX: button now disabled until name
is entered (no more hostile alerts)
Optimized Export modal layout: CSV export
title/description and button now on same row
Improved Shareable Link section: title and
description now on same row for compact layout
Added automatic linking for Telegram channel mentions
(e.g., @voynareal) in analysis text
Fixed hyperlink punctuation: periods, commas, and
other punctuation no longer included in links
Added "My Location" button to quickly center map on
your current GPS location
Optimized Search Location layout: search box and
buttons now on same row for compact design
Optimized Search Events layout: search box and date
filters now on same row
Fixed date input font to match text inputs (no more
monospace terminal font)
Replaced hostile Reset All Filters browser alert with
friendly inline confirmation UI
Fixed Quick Range date presets to avoid page flash by
using targeted updates
Fixed feed virtual scrolling to maintain expanded
state when scrolling
Fixed hyperlink processing to prevent nested/repeated
HTML in entity links
Changed body background from purple gradient to
neutral gray (#f5f5f5)
Fixed map extending to fill space when feed panel is
closed
Renamed "SyΓΆte" button to "Feed" (now fully English)
Fixed "Show on Map" button in feed to properly center
and highlight events
Redesigned timeline with manual DD/MM/YYYY date
inputs and auto-formatting
Improved share link descriptions for WhatsApp/social
media previews (uses event-specific text)
Responsive Podcast Player: Timeline
podcast now resizes dynamically on small screens (120-200px range) and wraps on
very small screens
Stats Area Consistency: Fixed stats
cards and podcast player to maintain identical sizing when switching between
dark/light modes (no more layout shifts)
Smart Button Toggle: Search and
Heatmap buttons now mutually exclusive - clicking one automatically closes the
other (no more double-clicking needed)
Dual-Source Media: Podcast and video
now try local files first (podcast.m4a, timeline_video.mp4), then fall back to
vasama.systems URLs automatically
Optimized modal spacing for My Views and Export
modals - removed needless scrollbars and excessive whitespace
Direct CSV download - removed confirmation alert,
downloads immediately when clicked
Fixed legend field styling - map legend text no
longer selectable (cursor stays default)
Enhanced podcast player with flexbox properties for
fluid resizing when window is resized from small to large
Added transparent borders to stat cards to prevent
dimension changes between themes
Removed "All Events / Recent" timeline section for
cleaner, more compact layout
Smart Startup Script (start.sh):
Intelligent bash script with automatic port detection, conflict resolution
(kills existing :8000 processes), multi-server support
(Python3/Python2/PHP/Node), and automatic browser opening
Global CSS Variables: Implemented
CSS variables for all modal spacing (--modal-padding,
--modal-header-margin-bottom, etc.) - change one variable to adjust ALL modals
at once
Reduced Web Alerts: Replaced 8+
browser alerts with better UX - Keyboard Shortcuts (proper modal dialog), Reset
Filters (inline confirmation), Share buttons (inline feedback), CSV download (no
confirmation), Save View (disabled validation), Sentiment Filter (disabled
validation), Analyze by Source (disabled validation), Copy Link (inline
feedback)
Keyboard Shortcuts Modal: Converted
keyboard shortcuts from ugly alert popup to beautiful modal dialog with
organized categories and visual key styling
Smart Sentiment Filter Buttons:
"Apply Sentiment Filter" and "Analyze by Source" buttons now disabled until
entity name is entered - no more hostile "Please enter entity name" alerts
Advanced Search Reordering: Filter
blocks in Advanced Search Builder can now be dragged and reordered - move blocks
around freely, insert between existing blocks, reorganize your query structure
on the fly
Email address (info@vasama.systems) is now a
clickable mailto: link in About modal for easy contact
start.sh script detects missing data files
(tapahtumat.csv, raportit.csv, entities.json) and warns user before starting
start.sh offers to automatically kill conflicting
processes on port 8000 and restart cleanly
start.sh works on macOS, Linux, Windows (Git
Bash/WSL) with automatic browser detection (open/xdg-open/start)
Tour Navigation Fixed: Step 5β6
transition now properly closes Analytics modal before opening Timeline controls
Timeline Positioning Fixed: Timeline
slider now appears below stats area (145px from top) instead of overlapping
Events/Locations/etc.
Dynamic Search Panel: Search panel
position now calculates dynamically based on bottom controls height -
automatically responds to window resize for proper web-responsive layout
Map Legend Improvements: Legend text
is now non-selectable (user-select: none) for cleaner interaction
Smart Apply Button: Advanced Search
"Apply Search" button now validates query and shows helpful tooltip when
disabled - no more confusing error alerts, just hover to see what's missing!
Advanced Search Alignment: Filter
labels in Advanced Search Builder now have consistent width (120px) so all
textfields align perfectly