diff --git a/backend/src/server/services/definitions/example.rs b/backend/src/server/services/definitions/example.rs
deleted file mode 100644
index 830be5c3..00000000
--- a/backend/src/server/services/definitions/example.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-use crate::server::services::definitions::{create_service, ServiceDefinitionFactory};
-use crate::server::services::types::patterns::Pattern;
-use crate::server::hosts::types::ports::PortBase;
-use crate::server::services::types::types::ServiceDefinition;
-use crate::server::services::types::categories::ServiceCategory;
-
-#[derive(Default, Clone, Eq, PartialEq, Hash)]
-pub struct YourService;
-
-impl ServiceDefinition for YourService {
- fn name(&self) -> &'static str { "Your Service Name" } // < 15 chars
- fn description(&self) -> &'static str { "Brief description" } // < 60 chars
- fn category(&self) -> ServiceCategory { ServiceCategory::Web }
-
- fn discovery_pattern(&self) -> Pattern {
- // Choose appropriate pattern
- Pattern::Port(PortBase::new_tcp(8080))
- }
-
- // Optional overrides:
- // fn is_generic(&self) -> bool { false }
- // fn is_gateway(&self) -> bool { false }
- // fn icon(&self) -> &'static str { "icon-name" }
-}
-
-inventory::submit!(ServiceDefinitionFactory::new(create_service::
+
+
+
+
+
+
+
+
-**General Options**
-
-*Network Selection*
-- Choose which networks to include in the diagram
-- Multi-select to overlay multiple networks
-- Useful for comparing environments
-
-*Service Category Filters*
-- Hide specific categories (Media, Development, etc.)
-- Reduces clutter for large networks
-- Categories remain in data, just hidden from view
-
**Visual Options**
*Don't Fade Edges*
- Show all edges at full opacity
- Default behavior fades unselected edges
-- Enable for clearer edge visibility
+- Enable for clearer edge visibility and screenshot appearance
*Hide Resize Handles*
- Remove subnet resize handles from corners
@@ -801,7 +822,10 @@ Access the options panel via the button on the right side of the topology view:
**Node Positioning**
- Click and drag any node to reposition
-- Reset by refreshing the topology
+
+**Edge Handle**
+- Select an edge to show handles (same-colored circle at edge ends)
+- Move handles to other locations on node
**Subnet Sizing**
- Drag subnet corners to resize
diff --git a/media/topology_conflict.png b/media/topology_conflict.png
new file mode 100644
index 00000000..aa599023
Binary files /dev/null and b/media/topology_conflict.png differ
diff --git a/media/topology_fresh.png b/media/topology_fresh.png
new file mode 100644
index 00000000..c044bc12
Binary files /dev/null and b/media/topology_fresh.png differ
diff --git a/media/topology_full.png b/media/topology_full.png
index 98ca82af..6399d440 100644
Binary files a/media/topology_full.png and b/media/topology_full.png differ
diff --git a/media/topology_locked.png b/media/topology_locked.png
new file mode 100644
index 00000000..f3a85f07
Binary files /dev/null and b/media/topology_locked.png differ
diff --git a/media/topology_stale.png b/media/topology_stale.png
new file mode 100644
index 00000000..de28e0c1
Binary files /dev/null and b/media/topology_stale.png differ
diff --git a/ui/src/lib/features/topology/components/TopologyModal.svelte b/ui/src/lib/features/topology/components/TopologyModal.svelte
index 3456e873..ac221e72 100644
--- a/ui/src/lib/features/topology/components/TopologyModal.svelte
+++ b/ui/src/lib/features/topology/components/TopologyModal.svelte
@@ -4,6 +4,8 @@
import {
createEmptyTopologyFormData,
createTopology,
+ topologies,
+ topology,
topologyOptions,
updateTopology
} from '../store';
@@ -11,21 +13,33 @@
import ModalHeaderIcon from '$lib/shared/components/layout/ModalHeaderIcon.svelte';
import TopologyDetailsForm from './TopologyDetailsForm.svelte';
- export let isOpen = false;
- export let onSubmit: () => Promise