diff --git a/src/bonsai/bonsai/bim/module/drawing/operator.py b/src/bonsai/bonsai/bim/module/drawing/operator.py
index 66a1482acc..582c7b062b 100644
--- a/src/bonsai/bonsai/bim/module/drawing/operator.py
+++ b/src/bonsai/bonsai/bim/module/drawing/operator.py
@@ -18,6 +18,7 @@
import hashlib
import json
+import logging
import multiprocessing
import os
import shutil
@@ -39,7 +40,6 @@ from typing import (
import bmesh
import bpy
-import logging
import ifcopenshell
import ifcopenshell.api.document
import ifcopenshell.api.pset
@@ -58,9 +58,9 @@ from bpy_extras.io_utils import ImportHelper
from lxml import etree
from mathutils import Color, Vector
-import bonsai.bim.import_ifc
import bonsai.bim.export_ifc
import bonsai.bim.handler
+import bonsai.bim.import_ifc
import bonsai.bim.module.drawing.sheeter as sheeter
import bonsai.bim.module.drawing.svgwriter as svgwriter
import bonsai.core.drawing as core
diff --git a/src/bonsai/bonsai/bim/module/project/operator.py b/src/bonsai/bonsai/bim/module/project/operator.py
index 7bffc724e5..da3771ba9c 100644
--- a/src/bonsai/bonsai/bim/module/project/operator.py
+++ b/src/bonsai/bonsai/bim/module/project/operator.py
@@ -56,14 +56,6 @@ import bonsai.core.project as core
import bonsai.tool as tool
from bonsai.bim import export_ifc, import_ifc
from bonsai.bim.ifc import IfcStore
-from bonsai.bim.ui import IFCFileSelector
-from bonsai.bim import import_ifc
-from bonsai.bim import export_ifc
-from math import radians
-from pathlib import Path
-from collections import defaultdict
-from mathutils import Vector, Matrix
-from bpy.app.handlers import persistent
from bonsai.bim.module.model.decorator import FaceAreaDecorator, PolylineDecorator
from bonsai.bim.module.model.polyline import PolylineOperator
from bonsai.bim.module.project.data import LinksData, ProjectLibraryData
diff --git a/src/bonsai/bonsai/bim/module/project/ui.py b/src/bonsai/bonsai/bim/module/project/ui.py
index 7029eb7227..1f00c1b2b4 100644
--- a/src/bonsai/bonsai/bim/module/project/ui.py
+++ b/src/bonsai/bonsai/bim/module/project/ui.py
@@ -29,7 +29,6 @@ import bonsai.tool as tool
from bonsai.bim.helper import draw_attributes, prop_with_search
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.project.data import LinksData, ProjectData
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.project.prop import (
diff --git a/src/bonsai/bonsai/core/drawing.py b/src/bonsai/bonsai/core/drawing.py
index 953f57e7f4..42b0f77fbb 100644
--- a/src/bonsai/bonsai/core/drawing.py
+++ b/src/bonsai/bonsai/core/drawing.py
@@ -19,7 +19,7 @@
from __future__ import annotations
from pathlib import Path
-from typing import TYPE_CHECKING, Optional, Union
+from typing import TYPE_CHECKING, Literal, Optional, Union
if TYPE_CHECKING:
import bpy
diff --git a/src/bonsai/bonsai/tool/project.py b/src/bonsai/bonsai/tool/project.py
index 6e1c9b2186..dc47b977f8 100644
--- a/src/bonsai/bonsai/tool/project.py
+++ b/src/bonsai/bonsai/tool/project.py
@@ -18,10 +18,9 @@
from __future__ import annotations
-import os
import json
+import os
import shutil
-import numpy as np
from collections import defaultdict
from math import radians
from pathlib import Path
@@ -32,6 +31,7 @@ import ifcopenshell
import ifcopenshell.api.document
import ifcopenshell.util.element
import ifcopenshell.util.representation
+import numpy as np
from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES
import bonsai.bim.schema
diff --git a/src/bonsai/pyproject.toml b/src/bonsai/pyproject.toml
index 398687a715..4ee183cba0 100644
--- a/src/bonsai/pyproject.toml
+++ b/src/bonsai/pyproject.toml
@@ -38,6 +38,12 @@ exclude = ["test*"]
[tool.ruff]
extend = "../../pyproject.toml"
-lint.select = [
+lint.extend-select = [
"F401", # unused imports
]
+
+[tool.ruff.lint.isort]
+known-first-party = [
+ "test",
+ "bonsai",
+]
diff --git a/src/bonsai/test/tool/test_blender.py b/src/bonsai/test/tool/test_blender.py
index 97e68b9d08..cd155b5dee 100644
--- a/src/bonsai/test/tool/test_blender.py
+++ b/src/bonsai/test/tool/test_blender.py
@@ -16,6 +16,8 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import tempfile
+from pathlib import Path
from typing import TYPE_CHECKING
import bpy
@@ -24,10 +26,8 @@ import pytest
import bonsai.core.tool
import bonsai.tool as tool
-import tempfile
from bonsai.tool.blender import Blender as subject
from test.bim.bootstrap import NewFile
-from pathlib import Path
if TYPE_CHECKING:
import bpy.stub_internal.rna_enums as rna_enums
diff --git a/src/bonsai/test/tool/test_drawing.py b/src/bonsai/test/tool/test_drawing.py
index 3fa2e68cae..06091ff8c4 100644
--- a/src/bonsai/test/tool/test_drawing.py
+++ b/src/bonsai/test/tool/test_drawing.py
@@ -21,7 +21,6 @@ import xml.etree.ElementTree as ET
from pathlib import Path
import bpy
-import pytest
import ifcopenshell
import ifcopenshell.api.drawing
import ifcopenshell.api.group
@@ -31,8 +30,9 @@ import ifcopenshell.guid
import ifcopenshell.util.element
import mathutils
import numpy as np
-from mathutils import Vector
+import pytest
from ifcopenshell.util.shape_builder import ShapeBuilder
+from mathutils import Vector
import bonsai.core.tool
import bonsai.tool as tool
diff --git a/src/bonsai/test/tool/test_project.py b/src/bonsai/test/tool/test_project.py
index 43dc61be8e..28ff090be6 100644
--- a/src/bonsai/test/tool/test_project.py
+++ b/src/bonsai/test/tool/test_project.py
@@ -16,10 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import json
import contextlib
+import json
import tempfile
-import numpy as np
from pathlib import Path
from tempfile import NamedTemporaryFile
@@ -30,6 +29,7 @@ import ifcopenshell.api.document
import ifcopenshell.api.root
import ifcopenshell.api.unit
import ifcpatch
+import numpy as np
from ifcpatch.recipes import Ifc2Sql
import bonsai.core.tool
diff --git a/src/ifcopenshell-python/ifcopenshell/util/geolocation.py b/src/ifcopenshell-python/ifcopenshell/util/geolocation.py
index 42aa28ca51..47c8886691 100644
--- a/src/ifcopenshell-python/ifcopenshell/util/geolocation.py
+++ b/src/ifcopenshell-python/ifcopenshell/util/geolocation.py
@@ -18,7 +18,7 @@
import math
from decimal import ROUND_HALF_UP, Decimal
-from typing import NamedTuple, Optional, Union, Any
+from typing import Any, NamedTuple, Optional, Union
import numpy as np
diff --git a/src/ifcpatch/ifcpatch/recipes/MergeProjects.py b/src/ifcpatch/ifcpatch/recipes/MergeProjects.py
index ffb8e2e65b..4a06c3d253 100644
--- a/src/ifcpatch/ifcpatch/recipes/MergeProjects.py
+++ b/src/ifcpatch/ifcpatch/recipes/MergeProjects.py
@@ -25,6 +25,7 @@ import ifcopenshell.util.geolocation
import ifcopenshell.util.unit
import numpy as np
+import ifcpatch
from ifcpatch.recipes.SetFalseOrigin import Patcher as SetFalseOrigin