- Eliminate a component that is no longer needed.
- Reduce duplicate code.
- Tidy up code along the way.
- Ran `deno fmt` to auto-format code (hence the large diff).
-Combined filtering, counting, and set construction into a single pass with getEligiblePersons
-Reduced redundant iterations and improved performance for large networks
- Change minEventCount to 1 to display all tags regardless of occurrence count
- Add radio buttons to sort tags by count (default) or alphabetically
- Add "Invert Selection" checkbox to toggle all tags at once
- Fix tag sorting implementation with proper Svelte @const placement
These changes provide better control over tag visibility and organization,
making it easier to explore and filter the visualization by tags.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Previously, only certain node types (person anchors, tag anchors, and 30040 events) would remain fixed after dragging, while other event types like kind 1 would snap back to their force-simulated positions.
Now all event nodes remain fixed in their dragged position, giving users full control over the graph layout. This applies to both regular force simulation and star visualization modes.
Changes:
- Modified setupDragHandlers to keep all nodes fixed after drag ends
- Modified createStarDragHandler to keep all nodes fixed after drag ends
- Removed special cases that only fixed certain node types
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Person anchors now maintain their fixed position after being dragged
- Exclude person anchors from gravity forces (like tag anchors)
- Update both regular and star force simulations to handle person anchors
- Ensure person anchors are draggable but stay anchored at their new position
This ensures person nodes behave as true anchors in the visualization,
maintaining their position in the graph even after user interaction.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Only fetch profiles from event authors when follow list limit is 0
- Color person nodes differently based on their source:
- Green (#10B981) for authors of displayed events
- Kind 3 color for people from follow lists
- Track isFromFollowList flag through person extraction and display
- Update Legend to show colored diamonds matching the graph visualization
This helps distinguish between actual content authors and social graph connections.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Limited person nodes to 20 by default to prevent graph overload
- Added "Displaying X of Y people found" message in Legend
- Implemented signed-by vs referenced connection tracking
- Added checkboxes to filter by connection type (signed by / referenced)
- Different link colors: green for signed-by, blue for referenced
- Removed "People (from follow lists)" from tag types (now handled by person visualizer)
- Consolidated all person connections into single node per pubkey
- Display count shows (Xs/Yr) for signed-by/referenced counts
- Disabled person toggle clicks when Show Person Nodes is off
- Cleaned up unused requirePublications code
This makes the person visualizer more manageable and informative while preventing performance issues from too many nodes.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added PersonAnchor type to NetworkNode types
- Created personNetworkBuilder utility for extracting and creating person nodes
- Added person visualizer section to Legend component with collapsible UI
- Implemented diamond shape rendering for person nodes in D3 visualization
- Added state management for show/hide person nodes and individual toggles
- Auto-disable all person nodes by default to prevent graph overload
- Integrated person node filtering into the graph update logic
- Added green color (#10B981) for person anchor nodes
- Fixed duplicate handleTagToggle function declaration
Person nodes now display as diamond shapes and can be individually toggled for visibility.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Moved tag type selection, expansion depth, and requirePublications to Legend component
- Used native HTML button instead of flowbite Toggle to avoid rendering issues
- Removed tag anchor controls from Settings panel
- Added proper prop bindings between components
- Fixed TypeScript type error in networkBuilder.ts
This provides better UI organization with tag-related controls now grouped together in the Legend.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit represents a checkpoint in implementing a sophisticated event
configuration system with people tag anchors. The implementation has grown
complex and needs reimplementation in a smarter way.
## Major Changes:
### Event Configuration System Overhaul
- Replaced simple allowed/disabled kinds with EventKindConfig objects
- Each event kind now has individual limits and type-specific settings:
- Kind 0 (profiles): Controls max profiles to fetch
- Kind 3 (follow lists): Has depth setting and complex fetch logic
- Kind 30040: Has nestedLevels setting
- Created new EventTypeConfig component replacing EventKindFilter
### Follow List Fetching Logic
- Kind 3 limit=1: Fetches only user's follow list
- Kind 3 limit>1: Fetches user's + (limit-1) follow lists from follows
- Added depth traversal (0=direct, 1=2 degrees, 2=3 degrees)
- Attempted to implement "addFollowLists" toggle (later simplified)
### Profile Fetching Changes
- Modified to be more selective about which profiles to fetch
- Attempted to limit based on follow lists and event authors
- Added progress indicators for profile loading
### People Tag Anchors Implementation
- Complex logic to create "p" tag anchors from follow lists
- Synthetic event creation to connect people to visualization
- "Only show people with publications" checkbox
- Attempted to connect people to:
- Events they authored (pubkey match)
- Events where they're tagged with "p"
- Display limiting based on kind 0 limit
### UI/UX Changes
- Tag anchors legend now scrollable when >20 items
- Auto-disable functionality when >20 tag anchors
- Added various UI controls that proved confusing
- Multiple iterations on settings panel layout
## Problems with Current Implementation:
1. **Overly Complex Logic**: The synthetic event creation and connection
logic for people tag anchors became convoluted
2. **Confusing UI**: Too many interdependent settings that aren't intuitive:
- Limit inputs control different things for different event types
- The relationship between kind 3 and kind 0 limits is unclear
- "addFollowLists" checkbox functionality was confusing
3. **Performance Concerns**: Fetching all profiles then limiting display
may not be optimal
4. **Unclear Requirements**: The exact behavior for people tag anchors
connections needs clarification
## Next Steps:
Need to revert and reimplement with:
- Clearer separation of concerns
- Simpler UI that's more intuitive
- Better defined behavior for people tag anchors
- More efficient profile fetching strategy
## Files Changed:
- EventTypeConfig.svelte: New component for event configuration
- visualizationConfig.ts: Major overhaul for EventKindConfig
- profileCache.ts: Added selective fetching logic
- visualize/+page.svelte: Complex follow list and profile fetching
- EventNetwork components: People tag anchor implementation
- settings_panel.org: Documentation of intended behavior
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created profileCache utility to fetch and cache kind 0 (Metadata) events
- Replace pubkeys with display names throughout the visualization:
- Node tooltips show author display names instead of pubkeys
- p tags in tooltips show display names
- Network nodes store display names in author field
- Fetch user profiles when loading events for better UX
- Fixed infinite loading loop by:
- Adding isFetching guard to prevent concurrent fetchEvents calls
- Temporarily disabling the re-enabled kinds watcher that was causing loops
- Extract pubkeys from event content (nostr:npub1... format) for profile fetching
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>