diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs
new file mode 100644
index 0000000000..c625ced209
--- /dev/null
+++ b/Content.Server/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs
@@ -0,0 +1,7 @@
+namespace Content.Server.Xenoarchaeology.Equipment.Components;
+
+[RegisterComponent]
+public sealed class NodeScannerComponent : Component
+{
+
+}
diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs
new file mode 100644
index 0000000000..ee1d7f8edf
--- /dev/null
+++ b/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs
@@ -0,0 +1,38 @@
+using Content.Server.Popups;
+using Content.Server.Xenoarchaeology.Equipment.Components;
+using Content.Server.Xenoarchaeology.XenoArtifacts;
+using Content.Shared.Interaction;
+using Content.Shared.Timing;
+using Robust.Shared.Player;
+
+namespace Content.Server.Xenoarchaeology.Equipment.Systems;
+
+public sealed class NodeScannerSystem : EntitySystem
+{
+ [Dependency] private readonly UseDelaySystem _useDelay = default!;
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnAfterInteract);
+ }
+
+ private void OnAfterInteract(EntityUid uid, NodeScannerComponent component, AfterInteractEvent args)
+ {
+ if (!args.CanReach || args.Target == null)
+ return;
+
+ if (!TryComp(args.Target, out var artifact) || artifact.CurrentNode == null)
+ return;
+
+ if (args.Handled)
+ return;
+ args.Handled = true;
+
+ var target = args.Target.Value;
+ _useDelay.BeginDelay(uid);
+ _popupSystem.PopupEntity(Loc.GetString("node-scan-popup",
+ ("id", $"{artifact.CurrentNode.Id}")), target, Filter.Pvs(target));
+ }
+}
diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs
index 5b7664313e..45ff20ac80 100644
--- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs
+++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs
@@ -48,7 +48,8 @@ public sealed partial class ArtifactSystem
var node = uninitializedNodes.First();
uninitializedNodes.Remove(node);
- node.Id = _random.Next(0, 10000);
+ //random 5-digit number
+ node.Id = _random.Next(10000, 100000);
//Generate the connected nodes
var maxEdges = Math.Max(1, targetNodeAmount - tree.AllNodes.Count - uninitializedNodes.Count - 1);
diff --git a/Resources/Locale/en-US/xenoarchaeology/node-scanner.ftl b/Resources/Locale/en-US/xenoarchaeology/node-scanner.ftl
new file mode 100644
index 0000000000..14b07941a6
--- /dev/null
+++ b/Resources/Locale/en-US/xenoarchaeology/node-scanner.ftl
@@ -0,0 +1 @@
+node-scan-popup = The node ID is {$id}
\ No newline at end of file
diff --git a/Resources/Prototypes/Catalog/Research/technologies.yml b/Resources/Prototypes/Catalog/Research/technologies.yml
index ebdbf76959..213ca87a89 100644
--- a/Resources/Prototypes/Catalog/Research/technologies.yml
+++ b/Resources/Prototypes/Catalog/Research/technologies.yml
@@ -484,6 +484,7 @@
- MicroLaserStockPart
- MicroManipulatorStockPart
- ScanningModuleStockPart
+ - NodeScanner
- type: technology
name: technologies-robotics-technology
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/node_scanner.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/node_scanner.yml
new file mode 100644
index 0000000000..8f0a704a54
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/node_scanner.yml
@@ -0,0 +1,15 @@
+- type: entity
+ parent: BaseItem
+ id: NodeScanner
+ name: node scanner
+ description: The archeologist's friend, able to identify the node of an artifact with only a single scan.
+ components:
+ - type: Sprite
+ sprite: Objects/Specific/Xenoarchaeology/node_scanner.rsi
+ state: icon
+ netsync: false
+ - type: Item
+ sprite: Objects/Specific/Xenoarchaeology/node_scanner.rsi
+ - type: NodeScanner
+ - type: UseDelay
+ delay: 3
diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
index 73632991c4..fd30b6f033 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -228,6 +228,7 @@
- PowerCellHigh
- SynthesizerInstrument
- RPED
+ - NodeScanner
- HolofanProjector
- type: entity
diff --git a/Resources/Prototypes/Recipes/Lathes/misc.yml b/Resources/Prototypes/Recipes/Lathes/misc.yml
index c023913afa..119c844b71 100644
--- a/Resources/Prototypes/Recipes/Lathes/misc.yml
+++ b/Resources/Prototypes/Recipes/Lathes/misc.yml
@@ -85,3 +85,14 @@
Steel: 300
Plastic: 300
Glass: 100
+
+- type: latheRecipe
+ id: NodeScanner
+ icon:
+ sprite: Objects/Specific/Xenoarchaeology/node_scanner.rsi
+ state: icon
+ result: NodeScanner
+ completetime: 2
+ materials:
+ Steel: 100
+ Plastic: 50
diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/icon.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/icon.png
new file mode 100644
index 0000000000..919f7d2856
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/inhand-left.png
new file mode 100644
index 0000000000..39a2af84a0
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/inhand-right.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/inhand-right.png
new file mode 100644
index 0000000000..1504a48723
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/meta.json b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/meta.json
new file mode 100644
index 0000000000..7c0fc9d9e8
--- /dev/null
+++ b/Resources/Textures/Objects/Specific/Xenoarchaeology/node_scanner.rsi/meta.json
@@ -0,0 +1,22 @@
+{
+ "version": 1,
+ "license": "CC0-1.0",
+ "copyright": "Created by EmoGarbage404",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}