Repository navigation
Asset CI Link
A server is often two records in FreeITSM. The asset (in Assets) says what the box is: make, model, serial number, where it is, what the inventory agent last saw. The configuration item (in the CMDB) says what it does: what runs on it, what depends on it, and what breaks if it fails.
A link joins the two and says these are the same piece of equipment. Each page then shows the other, so an analyst on either one can reach the other in one click.
Built for issue #201. The design and the decisions behind it are in Linking an asset to its configuration item - design.
| Where | The card | What it shows |
|---|---|---|
| An asset, Key info | Configuration item | The CI's name and class, a link into the CMDB, and what would be affected if it failed |
| A configuration item, under Details | Asset | The asset's name, a link to it, and its details From the asset |
- Press Link on either card.
- Search: from an asset you search configuration items by name; from a configuration item you search assets by name, serial number or asset tag. Only records in the same company are offered. A result already linked to something else says already linked.
- Pick one. The link is made, and both pages show it straight away.
The link doesn't depend on FreeITSM's inventory agent. An asset that came from Intune, a spreadsheet, a REST tool or was typed in by hand links the same way.
An asset has one configuration item, and a configuration item has one asset. If you pick one that is already linked elsewhere, FreeITSM says so and names the other record (or says it is one you cannot open), and offers to Replace it:
- Replace ends the old link and makes the new one, in one step. Both ended links stay in the history.
- If somebody changed the link while you were looking at it, the replace is refused and the card reloads with the new state. A newer link is never overwritten without you seeing it.
Anything else - a cluster and its nodes, the VMs on a host, the applications on a server - is an ordinary CMDB relationship, not this link.
Unlink ends the link. Neither the asset nor the configuration item is deleted, and the link stays in the history.
If the asset has no configuration item yet, it can make one:
- An administrator chooses which CMDB class each asset type becomes: Assets β Settings β Asset types β (a type) β CMDB class - Server for servers, say. Choosing a class never creates anything by itself and changes nothing on existing assets. It only makes the button appear.
- On an unlinked asset of that type, the card offers Create linked CI beside Link.
- If configuration items of that class, in the same company, already have the asset's name (ignoring case) and are not linked to anything, they are listed first with Link this one instead. A matching name is a hint, never proof, so nothing is linked automatically.
- Otherwise - or with Create a new one - give it a name (the asset's, to start with) and fill in anything the class requires. Create makes the configuration item and links it in one step: you get both, or neither.
Nothing hardware-shaped is copied into the new item: its serial number, model and so on are read from the asset through the link.
The Asset card on a configuration item shows, read live from the asset:
- type
- manufacturer and model
- serial number and asset tag
- status and location
- inventory - when the asset was last seen, and whether its inventory sources are current, stale, or failed on their last read
They are labelled From the asset and are never copied into the CI, so there is nothing to keep in step. To change one, open the asset (the card links to it).
CMDB β Settings β Asset card chooses which of these the card shows. All of them are ticked to start with.
When an asset is linked, its card adds a line from the configuration item's own impact analysis:
If this failed, affected: 14 (6 Virtual machine, 3 Application, 2 Service) Show Β· Open as diagram
- Show opens the configuration item at its If this failed panel.
- Open as diagram draws it in Network Mapper (for analysts who can open Network Mapper).
This is exactly what the CMDB says, following its own relationship types and impact settings. The asset itself is never part of the CMDB graph: the link adds no relationship and spreads no impact.
Both cards end with Link history: every link the record has had, with:
- who linked it, when, and how - on the page, or through the REST API with which key
- when it ended, who ended it, and why: Unlinked, Replaced, Configuration item deleted, or Ended when two assets were merged
The asset's own View History also records each change as Configuration item.
| What happens | The link |
|---|---|
| A configuration item is deleted | Its link ends. The asset is kept and shows No configuration item. The history keeps the deleted CI's name. The delete confirmation says the asset is kept |
| Two assets are merged (Asset review) | The link moves to the asset you keep, and its history says which asset it was made on. If both were linked, the merge window shows both links and asks which to keep. Merge stays greyed out until you tick I understand the other link will end. Cancel leaves everything as it was. Neither configuration item, nor any of its relationships, is changed |
Deleting a configuration item also clears any Link to something else β configuration item custom field that pointed at it. Before, those kept showing the deleted item's number.
| You can | You see | You can link |
|---|---|---|
| Open and change both Assets and the CMDB | Both cards in full | Yes |
| Open the CMDB but not Assets | Linked asset - restricted: no name, no number, no details | No - the card says why |
| Open Assets but not the CMDB | Linked configuration item - restricted | No |
The same rule applies to the link history, to the asset's history, to messages about conflicts, and to the REST API. The link never reveals a record you could not otherwise open. On a multi-company install both records always belong to the same company.
Neither module has a Read only access level yet. If either gains one, read-only analysts will be able to see links but not change them, with no further change needed.
A monitor or a mouse will never be a configuration item. In Assets β Settings β Asset types β (a type) β Layout, untick Configuration item to hide the card on that type. The Peripheral and Mobile device starting points already leave it unticked. Hiding is display only: it never removes a link.
GET /assets/{id}/ci-link |
The live link and the history, from the asset |
POST /assets/{id}/ci-link |
Link (or replace) |
DELETE /assets/{id}/ci-link |
Unlink |
POST /assets/{id}/ci-link/create-ci |
Create linked CI (also needs cmdb_objects.create) |
GET /cmdb/objects/{id}/asset-link |
The same, from the configuration item |
GET /assets/{id} also has linked_ci, and GET /cmdb/objects/{id} has linked_asset. The permission is Asset and configuration item links (asset_ci_links), so an integration can keep links up to date without being able to edit assets or configuration items. Details are in REST API - Assets.
A custom asset field of type Link to something else β A configuration item is a separate thing: a fact recorded on the asset, one-way, that the CMDB does not show. It is left exactly as it is. Use the link on this page for the same equipment, and a custom field for anything else you want to record.
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
-
Architecture
- β³ π§Ή Root folder tidy (URL routing)
- β³ π Database Integrity (FKs & constraints)
- β³ π οΈ Database Verification β Developer Guide
- β³ π§© Service Layer (UI + API share code)
- β³ πͺ€ Code traps (the TRAP: comments)
- β³ π Commenting for the Engineering wiki
- β³ π οΈ Engineering wiki scanner - Developer Guide
- β³ π Service-Layer progress
- π€ Contributing (read before a pull request)
- π§ͺ Developer tests
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- π Date & Time Formats
- π± Currencies
- π§ The sidebar (optional module rail)
- π§© Preference templates
- π Display order (modules, Watchtower cards) β Developer Guide
- Theming & Dark Mode
- ποΈ Recent β getting back to what you were doing
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
-
MobileβFriendly
- β³ π« Mobile: Tickets
- β³ π» Mobile: Assets
- β³ π Mobile: Calendar
- β³ π Mobile: Knowledge
- β³ π¦ Mobile: Service Status
- β³ πΌ Mobile: Watchtower
- β³ π§© Mobile: Problem Management
- β³ π Mobile: Change Management
- β³ πΏ Mobile: Software
- β³ β Mobile: Tasks
- β³ π Mobile: Forms
- β³ π Mobile: Contracts
- β³ π Mobile: Domains
- β³ π Mobile: People
- β³ π Mobile: Projects
- β³ ποΈ Mobile: Files
- β³ π Mobile: LMS
- β³ πΊοΈ Mobile: CMDB
- β³ πΊοΈ Mobile: Network Mapper
- β³ π§ Mobile: Process Mapper
- β³ βοΈ Mobile: Workflow
- β³ π₯οΈ Mobile: System
- β³ π Mobile: Reporting
- β³ π Mobile: System Wiki
- β³ π Mobile: Self-Service Portal
- β³ π§° Mobile: Techniques & Tricks
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- β³ π‘οΈ CSRF protection (S4) β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- π CardDAV contact sync
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π Proposal: custom fields, inventory import and change evidence (#194)
- β³ π οΈ Custom fields, evidence + inventory - review (#195-#197)
- β³ π οΈ Long forms in a task's Work view - review (#198)
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π REST API: Domains
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ π·οΈ REST API: Cost centres
- β³ π§βπΌ REST API: Analysts
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ π οΈ Inbox.js map β Developer Guide
- β³ π οΈ Tickets settings β Developer Guide
- β³ π Ticket workspace - design (PR #206)
- β³ π Rota copy and paste β Developer Deep Dive
- β³ β Checklists & SOPs
- β³ βοΈ Mandatory fields
- β³ π§Ύ Custom ticket fields
- β³ π·οΈ Ticket categories
- β³ π₯ Assigning tickets to a team, and escalation
- β³ π’ One board across every company
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ π Attachment size limits and large emails
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
-
β³
βοΈ Telegram channel - β³ β CSAT company scope and filters β Developer Guide
- β³ π₯ Microsoft Teams channel
- β³ π¨οΈ Mattermost channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ β Record previews
- β³ π Ticket notes: internal or shared
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ π¨ Telling the analyst a ticket is theirs
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ π Confidential tickets
- β³ π₯ Portal managers
- β³ π Who has seen a ticket
- β³ π Reading long tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ ποΈ The folder pane
- β³ π½ Just my tickets, or no closed ones
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- β³ π Case reports - a ticket and its work as one PDF
- β³ π Scheduled work in your own calendar
- Problem Management
- Tasks
- π Projects
-
Assets
- β³ π’ Moving an asset between companies
- β³ π Shared asset locations
- β³ π§βπΌ Assigning assets to analysts
- β³ π Warranty and lease alerts
- β³ π Leases
- β³ π Saved table views
- β³ π¨οΈ Recording anything, and importing it
- β³ π§© Asset type layouts
- β³ π Inventory freshness
- β³ π Linked configuration item
- β³ π Connected assets
- β³ π Asset review
- β³ π·οΈ QR asset labels
- β³ π Who holds what, and handover documents
- β³ π₯οΈ The inventory agent (PowerShell)
- β³ ποΈ Proxmox VE servers
- β³ βοΈ VMware Cloud Director servers
- β³ πͺ Hyper-V and Failover Clusters
- β³ π Linking equipment to tickets
- β³ βοΈ Follow-up tasks on a ticket
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
-
Forms
- β³ π¨ The form designer β Developer Guide
- β³ π Layout & the grid β Developer Guide
- β³ ποΈ Collections β grouping submissions
- β³ π Submissions as PDFs
- β³ β‘ What happens next β a form's own actions
- β³ π οΈ Sections & conditional logic β Developer Guide
- β³ π οΈ Lookup fields β Developer Guide
- β³ π‘οΈ Catalogue request approvals
- People
- Domains
- ποΈ Files
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- π‘ Zabbix (monitoring)
- π¬ Microsoft Teams alerts
- π 3CX (phone system)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ π’ One board across every company
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)
- What this is
-
π Bugs resolved
- β³ π³ The Docker image was missing PHP extensions
- β³ π A failed DNS lookup read as a missing record
- β³ π A link could change data
- β³ π Access outlived its removal
- β³ π Knowledge articles could run scripts
- β³ π Knowledge writes ignored permissions
- β³ π Company boundaries (Oct 2026)
- β³ π Smaller gaps (Oct 2026)
- β³ π Escaped text could leave its attribute
- β³ π Task descriptions were not cleaned
- β³ π Task documents ignored company scope
- β³ π Repeating tasks ignored company scope
- β³ π¬ #183 Mailbox checks overlapped
- β³ π #188 Transfer lock shown off when unknown
- β³ β #184 Subtask names and Overdue
- β³ π§© #186 Teams: the buttons did nothing
- β³ π Text in a change could run script
- β³ π AI settings changed without the AI permission
- β³ πͺ #178 Deleting an analyst failed
- β³ π« A team with no departments showed 0 tickets
- β³ π Projects: adding a phase did nothing on Save
- β³ π Leavers could still sign in
- β³ πΌοΈ Logo and courses broke on Apache with PHP-FPM
- β³ π’ Chat tickets ignored your ticket numbering
- β³ π Dates shown as a dash, or in server time
- β³ π Assets β Users showed people from other companies
- β³ π Restricted analysts could read other modules' data
- β³ πΌοΈ Replies with a picture in the thread failed to send
- β³ π Reply attachments never reached the customer
- β³ π οΈ Outbound email attachments β Developer Guide
- β³ π A global SSO provider was missing from the portal
- β³ π Behind a proxy, the SSO redirect said http
- β³ βοΈ The portal tagline moved when you saved it
- β³ π¨ The portal settings screen forgot what you saved
- β³ π‘οΈ The approvals inbox said "Error" and nothing else
- β³ π A table's answers were missing from the PDF
- β³ β A single-select column let you tick every option
- β³ π The portal ignored a form's field widths
- β³ π The tasks board stopped taking clicks
- β³ ποΈ #121 The index list is out of date after upgrading
- β³ π #133 The calendar subscription was empty
- β³ π #131 Tasks always reopened on the board
- β³ π₯ #129 Every page returned HTTP 500 after upgrading
- β³ π³ #127 A PHP warning above the System page
- β³ π #126 Notes stamped with the server's clock
- β³ π Storing every date in UTC
- β³ πͺ The portal was down for everyone signed in
- β³ βοΈ #120 Workflow notes could never be written
- β³ βοΈ #123 Three errors when running Database Verification
- β³ π #122 The description box was a stub in the corner
- β³ π£ Demo data deleted real accounts
- β³ π #117 Sign-in redirected to the wrong address
- β³ π¨ #108 The priority dot was invisible
- β³ β±οΈ #116 Time logged from the right-click menu
- β³ π #114 API keys refused by our own guard
- β³ ποΈ #110 Assigning a task told nobody
- β³ πͺ #107 Signed out while still working
- β³ π #103 "Share with Requester" reached nobody
- β³ π #102 Search found nothing for hyphens
- β³ πͺ #101 Source code editor opened behind
- β³ βοΈ #88 Subtasks could not be ticked off
- β³ π» #84 Asset deep link selected nothing
- β³ π« #79 A new ticket arrived with no status
- β³ π§ #79 A ticket from email did not say so
- β³ π #78 Bell opened to nothing
- β³ π¬ #77 Mail only collected from Inbox
- β³ π #74 The default password could not be changed
- β³ π¦ #70 Renaming an impact level
- β³ π€ #67 App-only mailboxes could not send
- β³ π #45 Verify only ever worked for Microsoft
- β³ π #45 IMAP reported as not authenticated
- β³ βοΈ An email template stopped escaping itself
- β³ π The portal dashboard showed the wrong time
- β³ π’ The folder said 99 and the list showed 96