-
Notifications
You must be signed in to change notification settings - Fork 15
Attached Documents
Attach files β or links to files you keep somewhere else β to contracts, assets, knowledge articles, problems and changes.
Asked for in discussion #76 by dschipfel: "records often require supporting documents, yet users must store files externally or reference them through notes instead of attaching directly."
For how it works underneath, see Attached documents β Developer Guide and Attached documents β permissions and search.
The panel takes either, and treats them the same afterwards:
| A file | Drag it onto the box, or click to choose one. FreeITSM stores it. |
| A link | Paste a URL to the document where it already lives β SharePoint, Google Drive, a network share exposed over the web, whatever you use. FreeITSM stores the address, not the document. |
This is deliberate, and it is the point of the design. You are not being asked to move anything. If you already run a document management system, keep running it β attach links and FreeITSM becomes the index that says which documents matter to this contract. If you do not, attach the files and FreeITSM holds them. Most people end up doing both, and the list looks the same either way.
One thing worth knowing about links: FreeITSM cannot read the far end. A linked document is findable by the name and description you give it and nothing else, so the description is worth writing properly β it is all search has.
| Module | Where |
|---|---|
| Contracts | On the contract form, under Documents |
| Assets | A Documents tab beside Devices, Software and Tickets |
| Knowledge | Below the article |
| Problems | Its own section in the problem detail |
| Changes | Its own section in the change detail |
Tickets are the deliberate exception β they already have attachments, arriving by email, with their own viewer. Giving a ticket two differently-behaved attachment boxes would be worse than giving it one.
This is the part that makes it more than a filing cabinet.
A warranty covering eleven laptops is one document attached eleven times, not eleven copies. Upload it once, then on each of the other assets start typing its name in "Or attach a document already in FreeITSM" and pick it.
Every document carries an β. Click it and you see everywhere that document lives:
morning-checks-2026-02-17.pdf
1.3 MB Β· by Ed Mozley Β· 2026-08-17
Searchable β 638 characters of text indexed.
ATTACHED TO
β’ Asset: ACERLAPTOP
β’ Contract: Hardware Supply Agreement
Which matters because of the next section.
Remove takes the document off this record. If it is attached to anything else, it stays there and stays readable β you have detached it, not deleted it. Only when the last record lets go is the document actually deleted and its file removed.
The panel tells you when that has happened, rather than leaving you to guess which of the two things you just did.
A document has no permissions of its own. It is visible if β and only if β you can see at least one of the things it is attached to.
- Can you see the contract? Then you can read its documents.
- Can you not? Then the document is not in the list, not in search, not in βK, and not available at its own web address either.
Nothing to configure. It follows the access people already have, and it keeps following it: change somebody's access tomorrow and the answer changes with it, because the question is asked when they ask it rather than written down when the file was uploaded.
Attaching a document somewhere widens who can read it.
Attach a confidential contract PDF to a task the whole team can see, and the whole team can now read that PDF. That is not a bug β it is the same rule read forwards, and it is what makes the feature useful. But it means the act of attaching is a decision about access.
So the interface tries to make that visible rather than surprising:
- when you pick an existing document, it tells you where it already lives, in amber, before you click;
- the β lists every record it is on;
- if some of those are records you cannot see, it says "And 2 other records you do not have access to" β a count, never a name, because naming them would leak the very thing the rule protects.
By name β βK (Ctrl-K) matches a document's name, title and description, and shows where each one is attached.
By what is inside it β the text of an attached PDF, Word file or spreadsheet is read in the background and indexed, so searching for a phrase finds the document containing it under a Found inside documents heading. That is the difference between finding the file you already knew the name of, and finding the contract that happens to mention a supplier you are chasing.
Reading PDFs and scanned images needs Apache Tika configured under System β Search. Plain text and Office files are read without it. If Tika is not running, nothing breaks and nothing is lost β those documents are simply findable by name until it is, and then they catch up on their own.
The β tells you which state a document is in, because these are genuinely different and otherwise look identical:
| It says | It means |
|---|---|
| Searchable β 638 characters of text indexed | Its contents are in the index |
| Not searchable yet β the text is still being read | Queued. Nothing is wrong |
| Its contents cannot be read | An image, or a format nothing can extract. Name and description still work |
- File types are the same allow-list as ticket attachments, set at System β Security. You can narrow it; you cannot widen it to anything executable.
- Size is capped at 10 MB per file by default.
- Stored files are never served directly. They are only ever handed over by FreeITSM after it has checked who is asking β see the permissions guide for what that means for your web server.
- Every download is recorded β who, which document, when.
Two jobs want a clock rather than a page load, and both are optional:
php scripts/documents_maintenance.php
It reads the text out of newly attached files, and clears up documents whose records have since been deleted. Every five minutes is plenty.
Without it nothing breaks and nothing leaks β uploading already reads one file, and a document whose record was deleted is invisible immediately. What you get is documents becoming searchable promptly instead of waiting for the next upload, and disk that does not slowly fill with files nobody can reach.
- Attached documents β Developer Guide β the schema, the API and how to add a module
- Attached documents β permissions and search β how visibility is decided and enforced
- Searching inside tickets β the same extraction pipeline, for email attachments
- Security β upload handling and the guarded folders
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- Theming & Dark Mode
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
- MobileβFriendly
-
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
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« 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: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- Problem Management
- Tasks
- Assets
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
- Forms
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ 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)