Releases: netbox-community/netbox
v4.5.0-beta1 - 2025-12-16
Caution
This is a beta release of NetBox intended for testing and evaluation. Do not use this software in production. Also be aware that no upgrade path is provided to future releases.
Breaking Changes
- Python 3.10 and 3.11 are no longer supported. NetBox now requires Python 3.12, 3.13, or 3.14.
- GraphQL API queries which filter by object IDs or enums must now specify a filter lookup similar to other fields. For example,
id: 123becomesid: {exact: 123 }. - Rendering a device or virtual machine configuration is now restricted to users with the
render_configpermission for the applicable object type. - Retrieval of API token plaintexts is no longer supported. The
ALLOW_TOKEN_RETRIEVALconfig parameter has been removed. - API tokens can no longer be reassigned from one user to another.
- A config context assigned to a platform will now also apply to any children of that platform. (Although this is typically desired behavior, it may introduce unanticipated changes for existing deployments.)
- The
/api/dcim/cable-terminations/REST API endpoint is now read-only. Cable terminations must be set on cables directly via the/api/dcim/cables/endpoint. - The UI view dedicated to swapping A/Z circuit terminations has been removed.
- The experimental HTMX navigation feature has been removed.
- The obsolete boolean field
is_staffhas been removed from theUsermodel. - Removal of deprecated behavior
- The
/api/extras/object-types/REST API endpoint has been removed. (Use/api/core/object-types/instead.) - Webhooks no longer specify a
modelin payload data. (Referenceobject_typeinstead, which includes the parent app label.) - The obsolete module
core.models.contenttypeshas been removed (replaced in v4.4 bycore.models.object_types). - The
load_yaml()andload_json()utility methods have been removed from the base class for custom scripts.
- The
New Features
Lookup Modifiers in Filter Forms (#7604)
Most object list filters within the UI have been extended to include optional lookup modifiers to support more complex queries. For instance, filters for numeric values now include a dropdown where a user can select "less than," "greater than," or "not" in addition to the default equivalency match. The specific modifiers available depend on the type of each filter.
(Note that this feature does not introduce any new filters. Rather, it makes available in the UI filters which already exist.)
Improved API Authentication Tokens (#20210)
This release introduces a new version of API token (v2) which implements several security improvements. HMAC hashing with a cryptographic pepper is used to authenticate these tokens, obviating the need to store plaintexts. The new tokens also employ a non-sensitive key which can be shared to identify tokens without divulging their plaintexts. We've also adopted the standard "bearer" HTTP header format, as shown below.
# v1 token header
Authorization: Token <TOKEN>
# v2 token header
Authorization: Bearer nbt_<KEY>.<TOKEN>
Note that v2 token keys are prefixed with the fixed string nbt_, which can be used to aid in secret detection.
Backward compatibility with legacy (v1) tokens is retained in this release. However, users are strongly encouraged to begin using only v2 tokens, as support for legacy tokens will be removed in NetBox v4.7.
Object Ownership (#20304)
An optional owner foreign key field has been added to most models. This enables the assignment of objects to a new Owner model, which represents a set of users and/or groups. Through this relationship, we can now convey ownership of objects within NetBox natively, without needing to rely on the assignment of tags or custom fields.
(Note that ownership differs significantly in function from tenancy. Ownership determines the parties responsible for the maintenance of an object, whereas as tenancy conveys an operational dependency.)
Advanced Port Mappings (#20564)
The previous many-to-one mapping of front to rear ports has been expanded to support bidirectional mappings. The rear_port and rear_port_position fields on the FrontPort model have been replaced with an intermediary PortMapping model, which supports any number of assignments between front port/position pair and a rear port/position pair. This change unlocks the ability to model complex inline devices that swap individual fiber pairs between cables.
Cable Profiles (#20788)
Cables can now be assigned profiles which determine how they are treated for path tracing. A profile indicates the number of discrete parallel channels or lanes carried by the cable among its endpoints. For example, a 1-to-4 breakout cable has four lanes, shared at one end via a common termination and split out at the other end to four separate terminations. Profiles, when assigned, enable NetBox to more accurately trace a specific connection within a cable, rather than the cable as a whole.
The assignment of cable profiles is optional: Cable tracing will continue to operate as before for cables with no profile assigned.
Enhancements
- #16681 - Introduce a
render_configpermission, which is now required to render a device or virtual machine configuration - #18658 - Add a
start_on_bootchoice field for virtual machines - #19095 - Add support for Python 3.13 and 3.14
- #19338 - Enable filter lookups for object IDs and enums in GraphQL API queries
- #19523 - Cache the number of instances for device, module, and rack types, and enable filtering by these counts
- #20417 - Add an optional
colorfield for device type power outlets - #20476 - Once provisioned, the owner of an API token cannot be changed
- #20492 - Completely disabled the means to retrieve legacy API token plaintexts (removed the
ALLOW_TOKEN_RETRIEVALconfig parameter) - #20639 - Apply config contexts to devices/VMs assigned any child platform of the parent platform
- #20834 - Add an
enabledboolean field to API tokens - #20917 - Include usage reference on API token views
- #20925 - Add optional
commentsfield to all subclasses ofOrganizationalModel - #20929 - Require the
render_configpermission to view a rendered device/VM configuration in the UI - #20936 - Introduce the
/api/authentication-check/REST API endpoint for validating authentication tokens - #20959 - Include a count of related module types for a manufacturer in the REST API
Plugins
- #13182 - Added
PrimaryModel,OrganizationalModel, andNestedGroupModelto the plugins API, as well as their respective base classes for various resources
Other Changes
- #16137 - Remove the obsolete boolean field
is_stafffrom theUsermodel - #17571 - Remove the experimental HTMX navigation feature
- #17936 - Introduce a dedicated
GFKSerializerFieldfor representing generic foreign keys in API serializers - #19889 - Drop support for Python 3.10 and 3.11
- #19898 - Remove the obsolete REST API endpoint
/api/extras/object-types/ - #20088 - Remove the non-deterministic
modelkey from webhook payload data - #20095 - Remove the obsolete module
core.models.contenttypes - #20096 - Remove the
load_yaml()andload_json()utility methods from theBaseScriptclass - #20204 - Started migrating object views from custom HTML templates to declarative layouts
- #20295 - Cable terminations may be modified via the REST API only by modifying the cable itself
- #20617 - Introduce
BaseModelas the global base class for models - #20683 - Remove the UI view dedicated to swapping A/Z circuit terminations
- #20926 - Standardize naming of GraphQL filters
v4.4.8 - 2025-12-09
Enhancements
- #20068 - Support the assignment of module type profile attributes via bulk import
- #20914 - Enable filtering device components by tenant assigned to device
Bug Fixes
- #19918 - Fix support for
{module}resolution of components of child modules - #20759 - Improve legibility of object types in permissions form
- #20860 - Ensure user-provided changelog message is recorded when creating device components via the UI
- #20878 - Use the active database connection when executing custom scripts
- #20888 - Resolve warnings about non-decimal values for min/max latitude & longitude fields
v4.4.7 - 2025-11-25
Enhancements
- #20371 - Add Molex Micro-Fit 2x3 for power ports & power outlets
- #20731 - Enable specifying
data_source&data_filewhen bulk import config templates - #20820 - Enable filtering of custom fields by object type
- #20823 - Disallow creation of API tokens with an expiration date in the past
- #20841 - Support advanced filtering for available rack types when creating/editing a rack
Bug Fixes
- #20134 - Prevent out-of-band HTMX content swaps in embedded tables
- #20432 - Fix tracing of cables across multiple circuits in parallel
- #20465 - Ensure that scripts are updated immediately when a new file is uploaded
- #20638 - Correct OpenAPI schema for bulk create operations
- #20649 - Enforce view permissions on REST API endpoint for custom scripts
- #20740 - Ensure permissions constraints are enforced when executing custom scripts via the REST API
- #20743 - Pass request context to custom script when triggered by an event rule
- #20766 - Fix inadvertent translations on server error page
- #20775 - Fix
TypeErrorexception when bulk renaming unnamed devices - #20822 - Add missing
auto_sync_enabledfield in bulk edit forms - #20827 - Fix UI styling issue when toggling between light and dark mode
- #20839 - Fix filtering by object type in UI for custom links and saved filters
- #20840 - Remove extraneous references to airflow for RackType model
- #20844 - Fix object type filter for L2VPN terminations
- #20859 - Prevent dashboard crash due to exception raised by a widget
- #20865 - Enforce proper min/max values for latitude & longitude fields
v4.4.6 - 2025-11-11
Enhancements
- #14171 - Support VLAN assignment for device & VM interfaces being bulk imported
- #20297 - Introduce additional coaxial cable types
Bug Fixes
- #20378 - Prevent exception when attempting to delete a data source utilized by a custom script
- #20645 - CSVChoiceField should defer to model field's default value when CSV field is empty
- #20647 - Improve handling of empty strings during bulk imports
- #20653 - Fix filtering of jobs by object type ID
- #20660 - Optimize loading of custom script modules from remote storage
- #20670 - Improve validation of related objects during bulk import
- #20688 - Suppress non-harmful "No active configuration revision found" warning message
- #20697 - Prevent duplication of signals which increment/decrement related object counts
- #20699 - Ensure proper ordering of changelog entries resulting from cascading deletions
- #20713 - Ensure a pre-change snapshot is recorded on virtual chassis members being added/removed
- #20721 - Fix breadcrumb navigation links in UI for background tasks
- #20738 - Deleting a virtual chassis should nullify the
vc_positionof all former members - #20750 - Fix cloning of permissions when only one action is enabled
- #20755 - Prevent duplicate results under certain conditions when filtering providers
- #20771 - Comments are required when creating a new journal entry
- #20774 - Bulk action button labels should be translated
v4.4.5 - 2025-10-28
Enhancements
- #19751 - Disable occupied module bays in form dropdowns when installing a new module
- #20301 - Add a "dismiss all" option to the notifications dropdown
- #20399 - Add
assignedandprimaryboolean filters for MAC addresses - #20567 - Add contacts column to services table
- #20675 - Enable NetBox Copilot integration
- #20692 - Add contacts column to IP addresses table
- #20700 - Add contacts table column for various additional models
Bug Fixes
- #19872 - Ensure custom script validation failures display error messages
- #20389 - Fix "select all" behavior for bulk rename views
- #20422 - Enable filtering of aggregates and prefixes by family in GraphQL API
- #20459 - Fix validation of
is_oob&is_primaryfields under IP address bulk import - #20466 - Fix querying of devices with a primary IP assigned in GraphQL API
- #20498 - Enforce the validation regex (if set) for custom URL fields
- #20524 - Raise a validation error when attempting to schedule a custom script for a past date/time
- #20541 - Fix resolution of GraphQL object fields which rely on custom filters
- #20551 - Fix automatic slug generation in quick-add UI form
- #20606 - Enable copying of values from table columns rendered as badges
- #20641 - Fix
AttributeErrorexception raised by the object changes REST API endpoint - #20646 - Prevent cables from connecting to objects marked as connected
- #20655 - Fix
FieldErrorexception when attempting to sort permissions list by actions
v4.4.4 - 2025-10-15
Bug Fixes
- #20554 - Fix generic relation filters to accept
<app>.<model>format matching POST requests - #20574 - Fix excessive storage initialization overhead when listing scripts with remote backends
- #20584 - Enforce PoE mode requirement on interface templates when PoE type is set
- #20585 - Fix API schema generation crash for models with single-field UniqueConstraints
- #20587 - Fix upgrade.sh failure when removing stale content types
v4.4.3 - 2025-10-14
Enhancements
- #20426 - Add a copy-to-clipboard button for custom script output
- #20516 - Improve rendering of VLAN ID ranges in VLAN group tables
Bug Fixes
- #19302 - Fix uniqueness validation in REST API for nullable fields
- #19615 - Fix support for static file parameters in templates when external storage is in use
- #19818 - Hide primary IP assignment fields when creating a new virtual machine in the UI
- #19825 - Prevent cache for config revisions from being erroneously overwritten when debugging is enabled
- #20140 - Changing a site's region or group should update any associated circuit terminations
- #20156 - Fix display of rack elevation labels
- #20290 - Fix migration error when upgrading to NetBox v4.4 from releases earlier than v4.3
- #20471 - Saving an unmodified VLAN group should not generate a change record
- #20475 - Collapse singleton VLAN IDs in VLAN group display
- #20494 - Correct OpenAPI schema definition for
IntegerRangeSerializer - #20496 - REST API should always honor
MAX_PAGE_SIZEvalue - #20497 - Fix filtering of VLAN groups by VLAN ID range in GraphQL API
- #20507 - Fix support for fetching ASN contacts via GraphQL API
- #20523 - Hide password change form for users authenticated via SSO
- #20542 - Fix the creation of MAC addresses using the "quick add" form
v4.4.2 - 2025-09-30
Enhancements
- #17010 - Show admin navigation menu items only for staff & superusers
- #19590 - Add columns for device site & location to device component tables
- #19765 - Linkify assigned object types under saved filter view
- #20308 - Add a hotkey (
/) for the global search field - #20332 - Add a "none" option to object tag filters
- #20380 - Introduce the
SENTRY_CONFIGconfiguration parameter - #20412 - Linkify cluster type on virtual machine detail view
- #20438 - Add
facilityfield to bulk edit forms for sites and locations
Bug Fixes
- #18878 - Automatically assign a designated primary MAC address upon creation of a new interface
- #20243 - Prevent scheduled system jobs from re-running multiple times
- #20253 - Fix support for filtering object contact assignments in GraphQL API
- #20365 - Address various inaccuracies in generated OpenAPI schema
- #20375 - Preserve filter parameters when performing bulk operations
- #20390 - Fix styling of page size selection dropdown
- #20392 - Clean up ordering of interface type options
- #20398 - Fix misleading error reporting for min/max custom field values
- #20419 - Correct action buttons for child object views
- #20425 - Fix Markdown preview functionality within "quick add" modal
- #20441 - Fix display of the "groups" column in contact assignments table
v4.4.1 - 2025-09-16
Enhancements
- #15492 - Enable cloning of permissions
- #16381 - Display script result timestamps in system timezone
- #19262 - No longer restrict FHRP group assignment by assigned IP address
- #19408 - Support export templates for circuit terminations and virtual circuit terminations
- #19428 - Add an optional U height field to the devices table
- #19547 - Add individual "sync" buttons in data sources table
- #19865 - Reorganize cable type groupings
- #20222 - Enable the
HttpOnlyflag for CSRF cookie - #20237 - Include VPN tunnel groups in global search results
- #20241 - Record A & B terminations in cable changelog data
- #20277 - Add support for attribute assignment to
deserialize_object()utility - #20321 - Add physical media types for transceiver interfaces
- #20347 - Add Wi-Fi Alliance aliases to 802.11 interface types
Bug Fixes
- #19729 - Restore
kindfilter for interfaces in GraphQL API - #19744 - Plugins list should be orderable by "active" column
- #19851 - Fix
ValueErrorcomplaining of missingscopewhen bulk importing wireless LANs - #19896 - Min/max values for decimal custom fields should accept decimal values
- #20197 - Correct validation for virtual chassis parent interface
- #20215 - All GraphQL filters for config contexts should be optional
- #20217 - Remove "0 VLANs available" row at end of VLAN range table
- #20221 - JSON fields should not coerce empty dictionaries to null
- #20227 - Ensure consistent padding of Markdown content
- #20234 - Fix "add" button link for prerequisite object warning in UI
- #20236 - Strip invalid characters from uploaded image file names
- #20238 - Fix support for outside IP assignment during bulk import of tunnel terminations
- #20242 - Avoid
AttributeErrorexception on background jobs with no request ID - #20252 - Remove generic AddObject from ObjectChildrenView to prevent duplicate "add" buttons
- #20264 - Fix rendering of default icon in plugins list
- #20272 - ConfigContexts assigned to ancestor locations should apply to device/VM
- #20282 - Fix styling of prerequisite objects warning
- #20298 - Display a placeholder when an image thumbnail fails to load
- #20327 - Avoid calling
distinct()on device/VM queryset when fetching config context data
v4.4.0 - 2025-09-02
New Features
Background Jobs for Bulk Operations (#19589, #19891)
Most bulk operations, such as the import, modification, or deletion of objects can now be executed as a background job. This frees the user to continue working in NetBox while the bulk operation is processed. Once completed, the user will be notified of the job's result.
Logging Mechanism for Background Jobs (#19816)
A dedicated logging mechanism has been implemented for background jobs. Jobs can now easily record log messages by calling e.g. self.logger.info("Log message") under the run() method. These messages are displayed along with the job's resulting data. Supported log levels include DEBUG, INFO, WARNING, and ERROR.
Changelog Comments (#19713)
When creating, editing, or deleting objects in NetBox, users now have the option of providing a short message explaining the change. This message will be recorded on the resulting changelog records for all affected objects.
Config Context Data Validation (#19377)
A new ConfigContextProfile model has been introduced to support JSON schema validation for config context data. If a validation schema has been defined for a profile, all config contexts assigned to it will have their data validated against the schema whenever a change is made. (The assignment of a config context to a profile is optional.)
Enhancements
- #17413 - Platforms belonging to different manufacturers may now have identical names
- #18204 - Improved layout of the image attachments view & tables
- #18528 - Introduced the
HOSTNAMEconfiguration parameter to override the system hostname reported by NetBox - #18984 - Added a
statusfield for rack reservations - #18990 - Image attachments now include an optional description field
- #19134 - Interface transmit power now accepts negative values
- #19231 - Bulk renaming support has been implemented in the UI for most object types
- #19591 - Thumbnails for all images attached to an object are now displayed under a dedicated tab
- #19722 - The REST API endpoint for object types has been extended to include additional details
- #19739 - Introduced a user preference for CSV delimiter
- #19740 - Enable nesting of platforms within a hierarchy for improved organization
- #19773 - Extend the system UI view with additional information
- #19893 - The
/api/status/REST API endpoint now includes the system hostname - #19920 - Contacts can now be assigned to ASNs
- #19945 - Introduce a new custom script variable to represent decimal values
- #19965 - Add REST & GraphQL API request counters to the Prometheus metrics exporter
- #20029 - Include complete representation of object type in webhook payload data
Plugins
- #18006 - A Javascript is now triggered when UI is toggled between light and dark mode
- #19735 - Custom individual and bulk operations can now be registered under individual views using
ObjectAction - #20003 - Enable registration of callbacks to provide supplementary webhook payload data
- #20115 - Support the use of ArrayColumn for plugin tables
- #20129 - Enable plugins to register custom model features
Deprecations
- #19738 - The direct assignment of VLANs to sites is now discouraged in favor of VLAN groups
Other Changes
- #18349 - The housekeeping script has been replaced with a system job
- #18588 - The "Service" model has been renamed to "Application Service" for clarity (UI change only)
- #19829 - The REST API endpoint for object types is now available under
/api/core/ - #19924 - ObjectTypes are now tracked as concrete objects in the database (alongside ContentTypes)
- #19973 - Miscellaneous improvements to the
nbshellmanagement command