{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Shelf Product Updates",
  "description": "New features, improvements and platform updates in Shelf.",
  "home_page_url": "https://www.shelf.nu/updates",
  "feed_url": "https://www.shelf.nu/updates/feed.json",
  "icon": "https://www.shelf.nu/apple-icon.png",
  "favicon": "https://www.shelf.nu/icon.png",
  "language": "en",
  "items": [
    {
      "id": "https://www.shelf.nu/updates/exported-cells-that-look-like-formulas-stay-text",
      "url": "https://www.shelf.nu/updates/exported-cells-that-look-like-formulas-stay-text",
      "title": "Exported Values That Look Like Formulas Stay Text",
      "summary": "When a name, tag or field value starts with =, +, - or @, Shelf's CSV exports now put a single quote in front of it, so Excel and Google Sheets show it as text instead of running it as a formula. Negative numbers are left alone.",
      "content_html": "<p>A spreadsheet runs a cell that starts with <code>=</code>, <code>+</code>, <code>-</code> or <code>@</code> as a formula when you open the file, so a value someone typed into Shelf could act as a formula on your computer. Shelf's CSV exports now put a single quote (<code>'</code>) in front of such a value, and Excel and Google Sheets show it as plain text. Negative numbers such as <code>-5</code> or <code>-$5.00</code> keep working as numbers, so totals still add up.</p>\n<p>This covers both asset export formats, Standard and Import-ready, and bookings, report exports, non-registered members and activity notes. Upload an asset export to update or import your assets and Shelf removes the added quote again, so nothing changes in your data. See <a href=\"https://www.shelf.nu/knowledge-base/export-exporting-workspace-data-from-shelf#values-that-look-like-formulas\">Exporting Data from Shelf</a> for the details.</p>",
      "image": "https://www.shelf.nu/images/updates/better-csv-imports.jpg",
      "date_published": "2026-10-23T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "A spreadsheet runs a cell that starts with `=`, `+`, `-` or `@` as a formula when you open the file, so a value someone typed into Shelf could act as a formula on your computer. Shelf's CSV exports now put a single quote (`'`) in front of such a value, and Excel and Google Sheets show it as plain text. Negative numbers such as `-5` or `-$5.00` keep working as numbers, so totals still add up.\n\nThis covers both asset export formats, Standard and Import-ready, and bookings, report exports, non-registered members and activity notes. Upload an asset export to update or import your assets and Shelf removes the added quote again, so nothing changes in your data. See [Exporting Data from Shelf](https://www.shelf.nu/knowledge-base/export-exporting-workspace-data-from-shelf#values-that-look-like-formulas) for the details."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/import-a-spreadsheet-from-any-tool",
      "url": "https://www.shelf.nu/updates/import-a-spreadsheet-from-any-tool",
      "external_url": "https://www.shelf.nu/knowledge-base/importing-assets-to-shelf-csv-guide#checking-how-your-columns-map",
      "title": "Import the Spreadsheet From Your Old Tool As It Is",
      "summary": "Asset import no longer needs Shelf's column names. Upload the CSV export of Sortly, Asset Panda, Snipe-IT or your own spreadsheet under Assets → Import, check where Shelf sends each column, and import. An empty workspace now offers the import on the Assets page and in the Home checklist.",
      "content_html": "<p>You no longer have to rename your columns to Shelf's before importing assets. Under <strong>Assets → Import</strong>, choose the CSV your old tool or spreadsheet exported and click <strong>Continue</strong>. Shelf shows <strong>Check how your columns map</strong>: each column with a few sample values and the Shelf field it proposes, a green dot for a sure match and an amber one for a guess to check. It recognises more than 150 headings from Sortly, Asset Panda, Snipe-IT and hand-made spreadsheets, so <em>Entry Name</em> lands on the name, <em>Primary Folder</em> on the location and <em>Serial No.</em> on a new Serial number custom field. It reuses custom fields you already have, skips the old tool's own ids, and asks whether a file with a quantity column but no type column holds individual assets or stock.</p>\n<p>Change any row, keep a column as a custom field, or skip it, then click <strong>Preview import</strong>. From there the import works as before: the whole file is checked, the preview shows what it will create, and the import runs in the background. The mapping only renames columns, so the value rules, such as dates as <code>YYYY-MM-DD</code>, still apply. A file built from Shelf's template goes through with every row green.</p>\n<p>New workspaces find the import sooner, too. While a workspace has no assets, the <strong>Assets</strong> page offers <strong>Import a spreadsheet</strong> next to <strong>Create your first asset</strong>, and the <strong>Home</strong> checklist has an <strong>Import your assets</strong> item, for members whose role and plan allow importing.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/import-column-mapping.webp",
      "date_published": "2026-10-23T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "You no longer have to rename your columns to Shelf's before importing assets. Under **Assets → Import**, choose the CSV your old tool or spreadsheet exported and click **Continue**. Shelf shows **Check how your columns map**: each column with a few sample values and the Shelf field it proposes, a green dot for a sure match and an amber one for a guess to check. It recognises more than 150 headings from Sortly, Asset Panda, Snipe-IT and hand-made spreadsheets, so *Entry Name* lands on the name, *Primary Folder* on the location and *Serial No.* on a new Serial number custom field. It reuses custom fields you already have, skips the old tool's own ids, and asks whether a file with a quantity column but no type column holds individual assets or stock.\n\nChange any row, keep a column as a custom field, or skip it, then click **Preview import**. From there the import works as before: the whole file is checked, the preview shows what it will create, and the import runs in the background. The mapping only renames columns, so the value rules, such as dates as `YYYY-MM-DD`, still apply. A file built from Shelf's template goes through with every row green.\n\nNew workspaces find the import sooner, too. While a workspace has no assets, the **Assets** page offers **Import a spreadsheet** next to **Create your first asset**, and the **Home** checklist has an **Import your assets** item, for members whose role and plan allow importing."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/new-bookings-say-they-are-drafts",
      "url": "https://www.shelf.nu/updates/new-bookings-say-they-are-drafts",
      "external_url": "https://www.shelf.nu/knowledge-base/how-to-create-a-booking",
      "title": "New Bookings Say They Are Drafts, and Check-Out Asks First",
      "summary": "Creating a booking now says it makes a draft, and that a draft holds nothing until you reserve it. Reserve explains when a draft's start time has passed, and the one-click Check out opens a confirmation, as check-in already did.",
      "content_html": "<p>Some bookings were still <strong>Draft</strong> when people came to pick up their gear: they had been created with their assets and never reserved, so nothing was held. The booking form now says what it makes. Above its buttons it reads <em>\"This creates a draft. You can reserve it from the booking page.\"</em>, the button that creates a booking with its assets already chosen reads <strong>Create draft</strong>, and the confirmation is <strong>Draft created</strong>. On a draft, <strong>Save</strong> and the unsaved changes bar read <strong>Save draft</strong>.</p>\n<p>When a draft's start time has passed, <strong>Reserve</strong> (or <strong>Request reservation</strong>) is greyed out with <em>\"The start time has passed. Move it later to reserve.\"</em>, instead of a small error under the date. Move the start later and the button comes back before you save. Self-service and Base users also see why when the start is inside the workspace's minimum advance notice.</p>\n<p>Checking a booking out in one click now asks first, the way check-in does. <strong>Check out</strong>, and <strong>Check out remaining</strong> on a booking that is already out, open a <strong>Check out booking</strong> dialog that names the booking; <strong>Cancel</strong> leaves it as it was. An early check-out still shows its date question instead, and the scanner and selection flows keep their own confirmation.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/booking-new-draft-hint.webp",
      "date_published": "2026-10-23T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Some bookings were still **Draft** when people came to pick up their gear: they had been created with their assets and never reserved, so nothing was held. The booking form now says what it makes. Above its buttons it reads *\"This creates a draft. You can reserve it from the booking page.\"*, the button that creates a booking with its assets already chosen reads **Create draft**, and the confirmation is **Draft created**. On a draft, **Save** and the unsaved changes bar read **Save draft**.\n\nWhen a draft's start time has passed, **Reserve** (or **Request reservation**) is greyed out with *\"The start time has passed. Move it later to reserve.\"*, instead of a small error under the date. Move the start later and the button comes back before you save. Self-service and Base users also see why when the start is inside the workspace's minimum advance notice.\n\nChecking a booking out in one click now asks first, the way check-in does. **Check out**, and **Check out remaining** on a booking that is already out, open a **Check out booking** dialog that names the booking; **Cancel** leaves it as it was. An early check-out still shows its date question instead, and the scanner and selection flows keep their own confirmation."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/pick-category-and-tag-colors-with-a-preview",
      "url": "https://www.shelf.nu/updates/pick-category-and-tag-colors-with-a-preview",
      "title": "Pick Category and Tag Colors, With a Preview of the Badge",
      "summary": "The category and tag forms have a color swatch that opens your browser's color picker, a live preview of the badge, and accept short names like IT or AV. A form that cannot be saved now says why.",
      "content_html": "<p>Choosing a color for a category or tag no longer means typing a hex code. Click the swatch next to the <strong>Color</strong> field and your browser's color picker opens; the code fills in for you. A <strong>Preview</strong> under the fields shows the badge as it will look, with one line explaining why it is lighter than the color you picked: badges use a light tint with darker text so the name stays readable, and your exact color is still saved.</p>\n<p>The forms are also easier to save. Short names such as <strong>IT</strong> or <strong>AV</strong> are accepted (they used to need three characters), colors typed as <code>#fff</code> or without the <code>#</code> are fine, and when something is wrong the form now shows a message saying what, instead of the <strong>Create</strong> or <strong>Update</strong> button doing nothing. See <a href=\"https://www.shelf.nu/knowledge-base/using-categories-to-organize-your-asset-inventory#creating-an-asset-category\">Using Categories</a>.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/category-color-picker.webp",
      "date_published": "2026-10-23T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Choosing a color for a category or tag no longer means typing a hex code. Click the swatch next to the **Color** field and your browser's color picker opens; the code fills in for you. A **Preview** under the fields shows the badge as it will look, with one line explaining why it is lighter than the color you picked: badges use a light tint with darker text so the name stays readable, and your exact color is still saved.\n\nThe forms are also easier to save. Short names such as **IT** or **AV** are accepted (they used to need three characters), colors typed as `#fff` or without the `#` are fine, and when something is wrong the form now shows a message saying what, instead of the **Create** or **Update** button doing nothing. See [Using Categories](https://www.shelf.nu/knowledge-base/using-categories-to-organize-your-asset-inventory#creating-an-asset-category)."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/asset-imports-run-in-the-background",
      "url": "https://www.shelf.nu/updates/asset-imports-run-in-the-background",
      "external_url": "https://www.shelf.nu/knowledge-base/importing-assets-to-shelf-csv-guide#running-the-import",
      "title": "Asset Imports Run in the Background, up to 10,000 Rows",
      "summary": "Importing assets from a CSV now shows a preview first and then runs in the background, so you can leave the page. Find it under Assets → Import: you get a progress bar, an email when it finishes, and a Resume import button if it ever stops. One file can now hold up to 10,000 assets.",
      "content_html": "<p>Asset imports from a CSV now run in the background. Under <strong>Assets → Import</strong>, choose your file and click <strong>Continue</strong>, check where each of your columns goes, then click <strong>Preview import</strong>. Shelf checks every row and shows what the file will do before anything is created: how many assets it holds, the new categories, locations, tags, kits, custodians and custom fields it will add, and a grid of the rows.</p>\n<p>Click <strong>Import N assets</strong> and confirm, and the import runs in the background. You can leave the page: a progress card follows you around Shelf, the assets list shows your team that an import is running, and you get an email when it is complete.</p>\n<p>What changes for you:</p>\n<ul>\n<li><strong>Bigger files.</strong> One file can hold up to <strong>10,000 assets</strong> (up from 1,000), so most inventories go in as a single file.</li>\n<li><strong>Resume instead of re-upload.</strong> If an import stops, <strong>Resume import</strong> continues it without duplicates.</li>\n<li><strong>Warnings, not failures.</strong> If something changes between the preview and the import, for example a QR code from the file gets linked to another asset, that row is still imported with the value left out, and the import page lists it.</li>\n</ul>\n<p>Updating existing assets by CSV works as before, up to 1,000 assets per file.</p>",
      "image": "https://www.shelf.nu/images/updates/better-csv-imports.jpg",
      "date_published": "2026-10-22T00:00:00.000Z",
      "_shelf": {
        "inApp": true,
        "appRoles": [
          "ADMIN",
          "OWNER"
        ],
        "markdown": "Asset imports from a CSV now run in the background. Under **Assets → Import**, choose your file and click **Continue**, check where each of your columns goes, then click **Preview import**. Shelf checks every row and shows what the file will do before anything is created: how many assets it holds, the new categories, locations, tags, kits, custodians and custom fields it will add, and a grid of the rows.\n\nClick **Import N assets** and confirm, and the import runs in the background. You can leave the page: a progress card follows you around Shelf, the assets list shows your team that an import is running, and you get an email when it is complete.\n\nWhat changes for you:\n\n- **Bigger files.** One file can hold up to **10,000 assets** (up from 1,000), so most inventories go in as a single file.\n- **Resume instead of re-upload.** If an import stops, **Resume import** continues it without duplicates.\n- **Warnings, not failures.** If something changes between the preview and the import, for example a QR code from the file gets linked to another asset, that row is still imported with the value left out, and the import page lists it.\n\nUpdating existing assets by CSV works as before, up to 1,000 assets per file."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/companion-1-6-0-ipad-extend-bookings-and-stock",
      "url": "https://www.shelf.nu/updates/companion-1-6-0-ipad-extend-bookings-and-stock",
      "external_url": "https://www.shelf.nu/knowledge-base/shelf-ios-companion-getting-started",
      "title": "Shelf Companion 1.6.0: iPad and Tablets, Extend a Booking, Book Units of Stock",
      "summary": "Shelf Companion now runs as a real iPad app and fits Android tablets, with a sidebar on a larger tablet held sideways. On every phone you can also extend a running booking from More actions, book a number of units of stock, see what an asset is booked for, and add a closing note when you complete an audit.",
      "content_html": "<p><strong>Shelf Companion 1.6.0</strong> is live on the App Store and Google Play. It is the first version built for tablets: on an iPad it runs as a real iPad app instead of an enlarged iPhone one, and on an Android tablet it fills the screen and rotates. On a larger tablet held sideways (and a 13-inch iPad either way), the tab bar becomes a sidebar on the left. Phones look the same as before.</p>\n<p>The updates of 20 and 21 October also reached every phone, on 1.6.0 and on 1.5.0, without a trip to the store:</p>\n<ul>\n<li><strong>Extend a running booking.</strong> On an Ongoing or Overdue booking, <strong>More actions → Extend booking</strong> moves the end later, with <strong>+1 hour</strong>, <strong>+4 hours</strong> and <strong>+1 day</strong> buttons for one-tap use on site.</li>\n<li><strong>Book units of stock.</strong> A quantity-tracked asset is booked by count, from the picker or by scanning, capped at what is free for the booking's dates. Until units go out, the pencil on the row changes the number.</li>\n<li><strong>What an asset is booked for.</strong> The asset screen has a <strong>Bookings</strong> section, with the booking it is out on now first.</li>\n<li><strong>Close an audit with a note.</strong> <strong>Complete audit</strong> says how many unscanned assets will be marked missing and takes an optional closing note.</li>\n<li><strong>Set the value on New asset</strong>, in your workspace currency.</li>\n<li><strong>Search in long dropdowns.</strong> Dropdown fields with more than eight options get a search box.</li>\n</ul>\n<p>The app picks up an update in the background when you open it and uses it from the next time you open it.</p>",
      "image": "https://www.shelf.nu/images/updates/shelf-mobile-app.jpg",
      "date_published": "2026-10-22T00:00:00.000Z",
      "_shelf": {
        "inApp": true,
        "appRoles": [],
        "markdown": "**Shelf Companion 1.6.0** is live on the App Store and Google Play. It is the first version built for tablets: on an iPad it runs as a real iPad app instead of an enlarged iPhone one, and on an Android tablet it fills the screen and rotates. On a larger tablet held sideways (and a 13-inch iPad either way), the tab bar becomes a sidebar on the left. Phones look the same as before.\n\nThe updates of 20 and 21 October also reached every phone, on 1.6.0 and on 1.5.0, without a trip to the store:\n\n- **Extend a running booking.** On an Ongoing or Overdue booking, **More actions → Extend booking** moves the end later, with **+1 hour**, **+4 hours** and **+1 day** buttons for one-tap use on site.\n- **Book units of stock.** A quantity-tracked asset is booked by count, from the picker or by scanning, capped at what is free for the booking's dates. Until units go out, the pencil on the row changes the number.\n- **What an asset is booked for.** The asset screen has a **Bookings** section, with the booking it is out on now first.\n- **Close an audit with a note.** **Complete audit** says how many unscanned assets will be marked missing and takes an optional closing note.\n- **Set the value on New asset**, in your workspace currency.\n- **Search in long dropdowns.** Dropdown fields with more than eight options get a search box.\n\nThe app picks up an update in the background when you open it and uses it from the next time you open it."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/free-now-and-stock-status-on-the-asset-list",
      "url": "https://www.shelf.nu/updates/free-now-and-stock-status-on-the-asset-list",
      "external_url": "https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables#stock-columns-on-the-asset-list",
      "title": "Free Now and Stock Status on the Asset List",
      "summary": "The advanced asset list now shows each quantity-tracked pool's stock: Free now (14 of 20 pcs) and a Stock status of Short, None free, Running low or Enough, right after Status. Reserved, Total quantity, Unit of measure and Min quantity are one switch away under Columns. Select several pools and use Set min quantity to give them a threshold at once.",
      "content_html": "<p>The advanced asset list now shows each pool's stock right after Status.</p>\n<ul>\n<li><strong>Free now</strong> reads like <em>14 of 20 pcs</em>: the units you could hand over today, after custody, kits and units out on bookings. Units promised to a future booking are still on the shelf, so they are not subtracted.</li>\n<li><strong>Stock status</strong> gives one verdict per pool. <strong>Short by N</strong> means bookings, custody and kits need more than you own at the busiest point ahead. <strong>None free</strong>, <strong>Running low</strong> (at or below your min quantity) and <strong>Enough</strong> cover the rest. Without a min quantity it can still read <strong>Short by N</strong> or <strong>None free</strong>; otherwise it shows a dash. Hover for the figures, and for a shortfall, a link to the booking that causes it.</li>\n<li><strong>Reserved</strong> (in the column picker) counts the units promised to upcoming bookings, and an over-committed pool reads like <em>12 · 2 short</em>.</li>\n<li><strong>Unit of measure</strong> has its own column. <strong>Total quantity</strong> is now the bare number, and the Standard CSV export writes it that way too, so the column adds up in a spreadsheet.</li>\n</ul>\n<p>Status on the list now uses the same figures, so a pool with units out says so instead of reading Available. All three new columns can be filtered and sorted, and <strong>Set min quantity</strong> in the bulk actions gives many pools a threshold in one step. The <strong>Needs reordering</strong> filter (formerly <em>Low stock only</em>) compares Free now with each pool's min quantity.</p>\n<p>On the asset page and in the Shelf Companion app the same figure is now called <strong>Free now</strong> as well.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/stock-columns.webp",
      "date_published": "2026-10-22T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "The advanced asset list now shows each pool's stock right after Status.\n\n- **Free now** reads like *14 of 20 pcs*: the units you could hand over today, after custody, kits and units out on bookings. Units promised to a future booking are still on the shelf, so they are not subtracted.\n- **Stock status** gives one verdict per pool. **Short by N** means bookings, custody and kits need more than you own at the busiest point ahead. **None free**, **Running low** (at or below your min quantity) and **Enough** cover the rest. Without a min quantity it can still read **Short by N** or **None free**; otherwise it shows a dash. Hover for the figures, and for a shortfall, a link to the booking that causes it.\n- **Reserved** (in the column picker) counts the units promised to upcoming bookings, and an over-committed pool reads like *12 · 2 short*.\n- **Unit of measure** has its own column. **Total quantity** is now the bare number, and the Standard CSV export writes it that way too, so the column adds up in a spreadsheet.\n\nStatus on the list now uses the same figures, so a pool with units out says so instead of reading Available. All three new columns can be filtered and sorted, and **Set min quantity** in the bulk actions gives many pools a threshold in one step. The **Needs reordering** filter (formerly *Low stock only*) compares Free now with each pool's min quantity.\n\nOn the asset page and in the Shelf Companion app the same figure is now called **Free now** as well."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/qr-urls-for-label-printers",
      "url": "https://www.shelf.nu/updates/qr-urls-for-label-printers",
      "external_url": "https://www.shelf.nu/knowledge-base/how-to-print-custom-branded-qr-code-labels-with-shelf#printing-labels-for-assets-you-already-have",
      "title": "QR Code URLs for Your Own Label Printer",
      "summary": "The bulk QR download now includes a labels.csv with each asset's QR URL, and the Standard asset export and Asset Inventory report carry the URL too, so label software like Brady Workstation, P-touch Editor or Dymo Connect can print Shelf codes on your own labels.",
      "content_html": "<p>Label printer software builds a QR code from a column of URLs. Shelf gave you the QR images and the QR ID, but not the URL each code encodes, so printing Shelf codes on your own label stock meant asking support for a file. Now the URL comes with your data:</p>\n<ul>\n<li><strong>Bulk QR download.</strong> Select assets, then <strong>Actions → Download QR Codes</strong>. The zip now holds a <code>labels.csv</code> next to the images, one row per asset: asset name, SAM ID, QR ID, QR URL, category and location.</li>\n<li><strong>Asset export.</strong> A <strong>Standard</strong> export from the advanced asset index has a <strong>QR URL</strong> column right after <strong>QR ID</strong>.</li>\n<li><strong>Asset Inventory report.</strong> Its CSV carries a <strong>QR Code URL</strong> column.</li>\n</ul>\n<p>Each URL reads <code>https://eam.sh/&#x3C;QR ID></code>, the same link the Shelf QR code encodes, so your printed label scans exactly like the original.</p>",
      "image": "https://www.shelf.nu/images/updates/order-qr-labels.jpg",
      "date_published": "2026-10-22T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Label printer software builds a QR code from a column of URLs. Shelf gave you the QR images and the QR ID, but not the URL each code encodes, so printing Shelf codes on your own label stock meant asking support for a file. Now the URL comes with your data:\n\n- **Bulk QR download.** Select assets, then **Actions → Download QR Codes**. The zip now holds a `labels.csv` next to the images, one row per asset: asset name, SAM ID, QR ID, QR URL, category and location.\n- **Asset export.** A **Standard** export from the advanced asset index has a **QR URL** column right after **QR ID**.\n- **Asset Inventory report.** Its CSV carries a **QR Code URL** column.\n\nEach URL reads `https://eam.sh/<QR ID>`, the same link the Shelf QR code encodes, so your printed label scans exactly like the original."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/report-filter-bar-and-plans",
      "url": "https://www.shelf.nu/updates/report-filter-bar-and-plans",
      "external_url": "https://www.shelf.nu/knowledge-base/getting-started-with-reports#apply-filters",
      "title": "A Filter Bar for Reports, and Reports on Plus and Team",
      "summary": "Booking, asset and custody reports now have a filter bar, with new Asset model and Custom field filters, and their CSV and PDF exports follow the same filters. Reports are part of the Plus and Team plans.",
      "content_html": "<p>Some reports could already be filtered, but only by typing parameters into the address bar. Every booking, asset and custody report except <strong>Top Booked Kits</strong> can now be filtered from a <strong>filter bar</strong> with dropdowns for the filters it supports: Category, Location, Status and Custodian where they apply, and two new ones on every asset-based report:</p>\n<ul>\n<li><strong>Custom field</strong>: pick a field, then one of the values it holds, for example <em>Condition is Good</em>. Text, dropdown and yes/no fields; several combine so a row must match all of them.</li>\n<li><strong>Asset model</strong>: narrow a report to the units of one or more models. <strong>Asset Distribution</strong> also gains a <strong>By Asset Model</strong> breakdown.</li>\n</ul>\n<p>Applied filters show as chips you can remove one by one, and the headline numbers, the CSV and the PDF follow exactly what the page shows. <strong>Monthly Booking Trends</strong> now applies its category and location filters, which it used to accept and ignore. Filtered reports are still a link you can bookmark and share.</p>\n<p>Since 20 October 2026, <strong>Reports</strong> is part of the <strong>Plus and Team</strong> plans. On a Free workspace it stays in the sidebar and shows which plans include it; the plan is the workspace's, so an Administrator in a Team workspace keeps reports whatever their own plan.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/features/reports-filter-bar.webp",
      "date_published": "2026-10-22T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Some reports could already be filtered, but only by typing parameters into the address bar. Every booking, asset and custody report except **Top Booked Kits** can now be filtered from a **filter bar** with dropdowns for the filters it supports: Category, Location, Status and Custodian where they apply, and two new ones on every asset-based report:\n\n- **Custom field**: pick a field, then one of the values it holds, for example *Condition is Good*. Text, dropdown and yes/no fields; several combine so a row must match all of them.\n- **Asset model**: narrow a report to the units of one or more models. **Asset Distribution** also gains a **By Asset Model** breakdown.\n\nApplied filters show as chips you can remove one by one, and the headline numbers, the CSV and the PDF follow exactly what the page shows. **Monthly Booking Trends** now applies its category and location filters, which it used to accept and ignore. Filtered reports are still a link you can bookmark and share.\n\nSince 20 October 2026, **Reports** is part of the **Plus and Team** plans. On a Free workspace it stays in the sidebar and shows which plans include it; the plan is the workspace's, so an Administrator in a Team workspace keeps reports whatever their own plan."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/sort-rename-and-merge-dropdown-options",
      "url": "https://www.shelf.nu/updates/sort-rename-and-merge-dropdown-options",
      "external_url": "https://www.shelf.nu/knowledge-base/custom-field-types-in-shelf#managing-an-option-fields-choices",
      "title": "Sort, Rename and Merge Dropdown Options",
      "summary": "Option custom fields can now be reordered by drag, sorted A-Z, renamed in place and cleared of duplicates, and every asset follows the change when you save.",
      "content_html": "<p>Under <strong>Settings → Custom fields</strong>, an Option field's choices can now be managed in place:</p>\n<ul>\n<li><strong>Drag to reorder</strong>, or press <strong>Alt+Up</strong> / <strong>Alt+Down</strong>, and <strong>Sort A-Z</strong> in one click, with <strong>Undo sort</strong>.</li>\n<li><strong>Rename</strong> an option, and every asset holding it moves to the new spelling when you save.</li>\n<li><strong>Merge duplicates</strong> that differ only in capitals or spaces (<code>Sony</code>, <code>sony </code>), keeping the first spelling.</li>\n<li>Each option that is in use shows <strong>Used on N assets</strong>, and removing one that is in use asks you to confirm first.</li>\n</ul>\n<p>Long dropdowns also get a search box above eight options, in the advanced index filters and in the Shelf Companion app.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/dropdown-options-editor.webp",
      "date_published": "2026-10-22T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Under **Settings → Custom fields**, an Option field's choices can now be managed in place:\n\n- **Drag to reorder**, or press **Alt+Up** / **Alt+Down**, and **Sort A-Z** in one click, with **Undo sort**.\n- **Rename** an option, and every asset holding it moves to the new spelling when you save.\n- **Merge duplicates** that differ only in capitals or spaces (`Sony`, `sony `), keeping the first spelling.\n- Each option that is in use shows **Used on N assets**, and removing one that is in use asks you to confirm first.\n\nLong dropdowns also get a search box above eight options, in the advanced index filters and in the Shelf Companion app."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/last-audit-date-on-the-asset-index",
      "url": "https://www.shelf.nu/updates/last-audit-date-on-the-asset-index",
      "external_url": "https://www.shelf.nu/knowledge-base/advanced-asset-index-complete-guide#last-audit-date",
      "title": "See When Each Asset Was Last Audited",
      "summary": "The advanced asset index has a Last audit date column: when the asset was last counted in a completed audit, or Never audited. Hover it for the asset's recent and upcoming audits, filter on it, sort by it and export it. The asset page gets a matching Last audit card. Open Assets, switch to the advanced index, and look for the column.",
      "content_html": "<p>The advanced asset index now has a <strong>Last audit date</strong> column, on by default, so teams that run <a href=\"https://www.shelf.nu/features/audits\">audits</a> can see at a glance which assets have not been counted lately. It holds the completion date of the most recent completed or archived audit the asset was in, or <em>Never audited</em>. An asset reported missing in that audit still counts, because it was on the list that was checked. Hover a date for up to three recent audits with the asset's result in each, up to three upcoming ones, and <strong>View all audits</strong>, which opens the audits list filtered to that asset. Filter the column with the usual date operators or <strong>Never audited</strong>, sort it (never-audited assets go last), and take it along in a Standard export; the Import-ready export leaves it out.</p>\n<p>The asset page shows the same history on a <strong>Last audit</strong> card in its right column: the last audit, up to three earlier and three upcoming ones, and <strong>View all audits</strong>.</p>\n<p>Both appear for Owners, Administrators and Managers in a workspace with the Audits add-on. Without the add-on the column reads <strong>Unlock audits</strong> and there is no card; Self-service and Base users do not see the column or the card.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/last-audit-date-column.webp",
      "date_published": "2026-10-20T00:00:00.000Z",
      "_shelf": {
        "inApp": true,
        "appRoles": [
          "ADMIN",
          "OWNER"
        ],
        "markdown": "The advanced asset index now has a **Last audit date** column, on by default, so teams that run [audits](https://www.shelf.nu/features/audits) can see at a glance which assets have not been counted lately. It holds the completion date of the most recent completed or archived audit the asset was in, or *Never audited*. An asset reported missing in that audit still counts, because it was on the list that was checked. Hover a date for up to three recent audits with the asset's result in each, up to three upcoming ones, and **View all audits**, which opens the audits list filtered to that asset. Filter the column with the usual date operators or **Never audited**, sort it (never-audited assets go last), and take it along in a Standard export; the Import-ready export leaves it out.\n\nThe asset page shows the same history on a **Last audit** card in its right column: the last audit, up to three earlier and three upcoming ones, and **View all audits**.\n\nBoth appear for Owners, Administrators and Managers in a workspace with the Audits add-on. Without the add-on the column reads **Unlock audits** and there is no card; Self-service and Base users do not see the column or the card."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/scan-history-on-every-asset-and-kit",
      "url": "https://www.shelf.nu/updates/scan-history-on-every-asset-and-kit",
      "external_url": "https://www.shelf.nu/knowledge-base/where-an-asset-was-last-scanned#the-full-scan-history",
      "title": "Every Asset and Kit Has a Scan History",
      "summary": "View all scans, under the Last scan card on an asset or kit, opens the full list of its scans, newest first: what was scanned, where it was recorded, when, by whom, the device, and the location when the scan carried one.",
      "content_html": "<p>Every scan of an asset or kit is recorded, whatever code was on the label and wherever the scan happened. The <strong>Last scan</strong> card shows the newest one, and under it a <strong>View all scans</strong> button that opens a panel with the asset's or kit's whole scan history, newest first, 25 at a time with <strong>Load more</strong>. Each scan says what was scanned (<em>QR code</em>, <em>Barcode</em> with its value, or <em>SAM ID</em> with the ID), where it was recorded (<em>QR link</em>, <em>Web scanner</em>, <em>Scanner list</em>, <em>Companion app</em>, <em>Audit</em> or <em>GPS update</em>; scans from before 16 October read <em>Not recorded</em>), when, who scanned it, the device, and the coordinates as a Google Maps link when the scan carried a location (a scan without one reads <em>No location</em>; web barcode and SAM ID scans carry none). The card's own <strong>Source</strong> row uses the same words.</p>\n<p>The history is visible to the same people as the card: Owners, Administrators and Managers. Self-service and Base users do not see either.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/scan-history-sheet.webp",
      "date_published": "2026-10-19T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Every scan of an asset or kit is recorded, whatever code was on the label and wherever the scan happened. The **Last scan** card shows the newest one, and under it a **View all scans** button that opens a panel with the asset's or kit's whole scan history, newest first, 25 at a time with **Load more**. Each scan says what was scanned (*QR code*, *Barcode* with its value, or *SAM ID* with the ID), where it was recorded (*QR link*, *Web scanner*, *Scanner list*, *Companion app*, *Audit* or *GPS update*; scans from before 16 October read *Not recorded*), when, who scanned it, the device, and the coordinates as a Google Maps link when the scan carried a location (a scan without one reads *No location*; web barcode and SAM ID scans carry none). The card's own **Source** row uses the same words.\n\nThe history is visible to the same people as the card: Owners, Administrators and Managers. Self-service and Base users do not see either."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/unsaved-changes-bar",
      "url": "https://www.shelf.nu/updates/unsaved-changes-bar",
      "title": "An Unsaved Changes Bar on Asset, Kit, Location and Booking Forms",
      "summary": "The asset, kit and location forms and the booking edit form show an Unsaved changes bar with Discard and Save the moment something changes, and ask before you leave the page with unsaved work.",
      "content_html": "<p>The asset, kit and location forms (new and edit) and the form that edits an existing booking watch for changes.</p>\n<p>As soon as a field differs from what is saved, an <strong>Unsaved changes</strong> bar appears, at the top of the page on a wide screen and along the bottom on smaller screens, with <strong>Discard</strong> and <strong>Save</strong>. <strong>Discard</strong> puts every field back to its saved value, including a category, tag or location you picked. <strong>Save</strong> saves as the form's own button does, and a refused save, for example for an empty name, keeps the bar. Leaving the page with unsaved work, by a link, the breadcrumb or the back button, asks <em>\"You have changes that are not saved. Leave this page and lose them?\"</em> with <strong>Leave page</strong> and <strong>Stay</strong>, and closing or reloading the tab asks too. Opening a dialog on the same page, such as <strong>Manage assets</strong> on a booking, is not leaving and asks nothing. See <a href=\"https://www.shelf.nu/knowledge-base/adding-new-assets#unsaved-changes\">Adding New Assets</a>.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/unsaved-changes-bar.webp",
      "date_published": "2026-10-19T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "The asset, kit and location forms (new and edit) and the form that edits an existing booking watch for changes.\n\nAs soon as a field differs from what is saved, an **Unsaved changes** bar appears, at the top of the page on a wide screen and along the bottom on smaller screens, with **Discard** and **Save**. **Discard** puts every field back to its saved value, including a category, tag or location you picked. **Save** saves as the form's own button does, and a refused save, for example for an empty name, keeps the bar. Leaving the page with unsaved work, by a link, the breadcrumb or the back button, asks *\"You have changes that are not saved. Leave this page and lose them?\"* with **Leave page** and **Stay**, and closing or reloading the tab asks too. Opening a dialog on the same page, such as **Manage assets** on a booking, is not leaving and asks nothing. See [Adding New Assets](https://www.shelf.nu/knowledge-base/adding-new-assets#unsaved-changes)."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/audit-completion-report",
      "url": "https://www.shelf.nu/updates/audit-completion-report",
      "external_url": "https://www.shelf.nu/knowledge-base/getting-started-with-reports#how-audit-completion-counts",
      "title": "Audit Completion: One Report for All Your Audits",
      "summary": "Open Reports → Audit Completion to see every audit created in a timeframe with its completion rate, the overdue audits and the assets found missing. Each row lists the audit's expected, found, missing and unexpected counts and an accuracy figure, and opens the audit. Export the rows to CSV.",
      "content_html": "<p>The <strong>Audits</strong> category on the Reports page has its first report. <strong>Audit Completion</strong> answers \"are audits getting done, how accurate are they, and what did they find?\" for every audit created in the timeframe you pick. The headline is the completion rate, with the number of overdue audits and the assets found missing beside it. Underneath, one row per audit carries its status, the expected, found, missing and unexpected counts, an accuracy bar, who created it and its started, due and completed dates. Click a row to open the audit, or <strong>Export CSV</strong> to take the rows with you.</p>\n<p>The counting is careful about history. An audit belongs to the period it was created in; a completed audit stays completed after it is archived; cancelled audits are left out of the rate; and the assets-missing total only adds up audits that were completed, because a running audit's missing counter is still moving. Reports are for Owners and Administrators, and the report fills up for workspaces using the <a href=\"https://www.shelf.nu/features/audits\">Audits</a> add-on.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/features/reports-audit-completion.webp",
      "date_published": "2026-10-16T00:00:00.000Z",
      "_shelf": {
        "inApp": true,
        "appRoles": [
          "ADMIN",
          "OWNER"
        ],
        "markdown": "The **Audits** category on the Reports page has its first report. **Audit Completion** answers \"are audits getting done, how accurate are they, and what did they find?\" for every audit created in the timeframe you pick. The headline is the completion rate, with the number of overdue audits and the assets found missing beside it. Underneath, one row per audit carries its status, the expected, found, missing and unexpected counts, an accuracy bar, who created it and its started, due and completed dates. Click a row to open the audit, or **Export CSV** to take the rows with you.\n\nThe counting is careful about history. An audit belongs to the period it was created in; a completed audit stays completed after it is archived; cancelled audits are left out of the rate; and the assets-missing total only adds up audits that were completed, because a running audit's missing counter is still moving. Reports are for Owners and Administrators, and the report fills up for workspaces using the [Audits](https://www.shelf.nu/features/audits) add-on."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/barcodes-add-on-says-what-is-included",
      "url": "https://www.shelf.nu/updates/barcodes-add-on-says-what-is-included",
      "title": "The Barcodes Add-on Now Says What Is Already Included",
      "summary": "The Alternative Barcodes unlock dialog, the banners on the asset form and the trial welcome email now say first that Shelf QR codes, their labels and scanning them are in every plan, and that the add-on is for other formats or codes already on your gear.",
      "content_html": "<p>The <strong>Unlock Alternative Barcodes</strong> dialog used to list \"QR codes\", \"Print barcode labels\" and a \"Built-in barcode scanner\" as things the add-on gives you, which read as though Shelf's own QR codes were a paid feature. They are not, and never were: every plan generates a QR code for each asset and kit, prints labels for them and scans them. A prospect buying unassigned QR stickers from the Shelf store asked whether that meant buying the add-on too, and the honest answer was no.</p>\n<p>The copy now says so. The dialog, the banners on the asset form and asset page, the plan picker card and the barcode trial welcome email all open with \"Shelf QR codes are included in every plan\", and describe the add-on as what it is: adding Code128, Code39, EAN-13 and DataMatrix barcodes to assets and kits, keeping the barcodes already on your gear (including QR codes from another system), and printing and scanning those. The disabled <strong>Add code to asset</strong> tooltip starts with the same sentence. Nothing about what the add-on unlocks has changed; see <a href=\"https://www.shelf.nu/knowledge-base/alternative-barcodes\">Alternative Barcodes</a>.</p>",
      "date_published": "2026-10-16T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "The **Unlock Alternative Barcodes** dialog used to list \"QR codes\", \"Print barcode labels\" and a \"Built-in barcode scanner\" as things the add-on gives you, which read as though Shelf's own QR codes were a paid feature. They are not, and never were: every plan generates a QR code for each asset and kit, prints labels for them and scans them. A prospect buying unassigned QR stickers from the Shelf store asked whether that meant buying the add-on too, and the honest answer was no.\n\nThe copy now says so. The dialog, the banners on the asset form and asset page, the plan picker card and the barcode trial welcome email all open with \"Shelf QR codes are included in every plan\", and describe the add-on as what it is: adding Code128, Code39, EAN-13 and DataMatrix barcodes to assets and kits, keeping the barcodes already on your gear (including QR codes from another system), and printing and scanning those. The disabled **Add code to asset** tooltip starts with the same sentence. Nothing about what the add-on unlocks has changed; see [Alternative Barcodes](https://www.shelf.nu/knowledge-base/alternative-barcodes)."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/booking-picker-includes-child-locations",
      "url": "https://www.shelf.nu/updates/booking-picker-includes-child-locations",
      "external_url": "https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#assets-kept-in-sub-locations",
      "title": "Add Assets to a Booking From a Location and Its Sub-Locations",
      "summary": "In a booking's Add assets dialog, ticking a location that has child locations now offers an Include assets from child locations checkbox. Tick it and the list, and Select all, include every asset kept below it.",
      "content_html": "<p>On a booking's <strong>Add assets</strong> dialog, ticking a parent location whose assets sit in its sub-locations showed an empty list, with no hint why: the <strong>Locations</strong> filter matched the ticked location exactly. Now, when a ticked location has <a href=\"https://www.shelf.nu/knowledge-base/sublocations-organize-locations-into-hierarchies\">child locations</a>, a checkbox <strong>Include assets from child locations</strong> appears under the filter. Tick it and the list adds every asset kept below the ticked locations, and <strong>Select all</strong> picks the same set, so a whole building can go on a booking in one pass.</p>\n<p>The checkbox is off by default, hidden for a location without children, and works the same way as the one the <strong>Start audit</strong> dialog already offers for a location. The kit page's and the location page's asset pickers keep exact matching.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/booking-picker-child-locations.webp",
      "date_published": "2026-10-16T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "On a booking's **Add assets** dialog, ticking a parent location whose assets sit in its sub-locations showed an empty list, with no hint why: the **Locations** filter matched the ticked location exactly. Now, when a ticked location has [child locations](https://www.shelf.nu/knowledge-base/sublocations-organize-locations-into-hierarchies), a checkbox **Include assets from child locations** appears under the filter. Tick it and the list adds every asset kept below the ticked locations, and **Select all** picks the same set, so a whole building can go on a booking in one pass.\n\nThe checkbox is off by default, hidden for a location without children, and works the same way as the one the **Start audit** dialog already offers for a location. The kit page's and the location page's asset pickers keep exact matching."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/companion-manager-role-show-more-and-linked-records",
      "url": "https://www.shelf.nu/updates/companion-manager-role-show-more-and-linked-records",
      "external_url": "https://www.shelf.nu/knowledge-base/shelf-ios-companion-getting-started",
      "title": "Shelf Companion: The Manager Role, Show More on Descriptions, and Links That Open the Right Record",
      "summary": "An over-the-air update on 15 October 2026: Managers get their web reach on the phone, long booking and audit descriptions open in full with Show more, asset descriptions show a 5,000-character count, and a link to a second booking or audit opens that one instead of the one already on screen.",
      "content_html": "<p>An over-the-air update went out to <strong>Shelf Companion</strong> on iPhone and Android on 15 October 2026. The version number stays <strong>1.5.0</strong>. The app picks up an update like this in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.</p>\n<h2>The Manager role, on the phone</h2>\n<p>The <a href=\"https://www.shelf.nu/knowledge-base/user-roles-and-their-permissions#manager\">Manager</a> role arrived on the web the same morning. On the phone a Manager now gets the same reach: every booking in the workspace, with check-out, check-in and the whole team in the custodian picker; custody hand-offs to anyone; any audit, assigned or not; and the whole catalogue to read, without the edit controls an Administrator has. Before this update the app did not know the role and showed a Manager what a Base user sees.</p>\n<h2>Read the whole description</h2>\n<p>A booking or audit description longer than three lines ends in <strong>Show more</strong>. Tap it to read the rest, and <strong>Show less</strong> to fold it back. Until now the text was cut off on the phone with no way to open it.</p>\n<h2>A link opens the record it names</h2>\n<p>With a booking open, following a link to a second booking kept showing the first one; the audit screen had the same bug. Each now opens the record the link names, with its own selection, search and open sheets.</p>\n<h2>A character count on asset descriptions</h2>\n<p><strong>New asset</strong> and <strong>Edit</strong> show how many characters the description holds and its limit of 5,000, the same limit the web applies.</p>\n<p>The iPad layout and Android tablet rotation that were merged this week are native changes and wait for the 1.6.0 store build; they are not part of this update.</p>",
      "image": "https://www.shelf.nu/images/updates/shelf-mobile-app.jpg",
      "date_published": "2026-10-16T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "An over-the-air update went out to **Shelf Companion** on iPhone and Android on 15 October 2026. The version number stays **1.5.0**. The app picks up an update like this in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.\n\n## The Manager role, on the phone\n\nThe [Manager](https://www.shelf.nu/knowledge-base/user-roles-and-their-permissions#manager) role arrived on the web the same morning. On the phone a Manager now gets the same reach: every booking in the workspace, with check-out, check-in and the whole team in the custodian picker; custody hand-offs to anyone; any audit, assigned or not; and the whole catalogue to read, without the edit controls an Administrator has. Before this update the app did not know the role and showed a Manager what a Base user sees.\n\n## Read the whole description\n\nA booking or audit description longer than three lines ends in **Show more**. Tap it to read the rest, and **Show less** to fold it back. Until now the text was cut off on the phone with no way to open it.\n\n## A link opens the record it names\n\nWith a booking open, following a link to a second booking kept showing the first one; the audit screen had the same bug. Each now opens the record the link names, with its own selection, search and open sheets.\n\n## A character count on asset descriptions\n\n**New asset** and **Edit** show how many characters the description holds and its limit of 5,000, the same limit the web applies.\n\nThe iPad layout and Android tablet rotation that were merged this week are native changes and wait for the 1.6.0 store build; they are not part of this update."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/workspace-backup-export-retired",
      "url": "https://www.shelf.nu/updates/workspace-backup-export-retired",
      "external_url": "https://www.shelf.nu/knowledge-base/export-exporting-workspace-data-from-shelf#choosing-an-export-format",
      "title": "The Workspace Backup Export Is Retired",
      "summary": "The Asset backup card under Settings → General is gone. The Assets index export does everything it did: select all, Export selection, Import-ready with All columns, and the file re-imports into any workspace.",
      "content_html": "<p>The <strong>Asset backup</strong> card under <strong>Settings → General</strong>, with its <strong>Download CSV</strong> button, has been removed, and so has the restore tool Shelf support used on those files. The backup format was older than the Assets index export and could not be re-imported by you: its category, tag and asset model cells held raw stored data rather than names.</p>\n<p>The Assets index export now covers everything the backup did. Select all assets, click <strong>Export selection</strong>, choose <strong>Import-ready</strong> and <strong>All columns</strong>, and the file carries every asset with its category, tags, location, custodian, asset model, barcodes and custom field values, written the way the importer reads them. Keep it as your copy, or upload it into another workspace through <strong>Assets → Import</strong> to recreate the assets there.</p>\n<p>Old backup files you still have cannot be uploaded: the import page says to use the template or an Import-ready export, and the <strong>Update existing</strong> flow recognizes a legacy backup file and stops with an explanation. Export again from the Assets index instead.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/export-format-options.webp",
      "date_published": "2026-10-16T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "The **Asset backup** card under **Settings → General**, with its **Download CSV** button, has been removed, and so has the restore tool Shelf support used on those files. The backup format was older than the Assets index export and could not be re-imported by you: its category, tag and asset model cells held raw stored data rather than names.\n\nThe Assets index export now covers everything the backup did. Select all assets, click **Export selection**, choose **Import-ready** and **All columns**, and the file carries every asset with its category, tags, location, custodian, asset model, barcodes and custom field values, written the way the importer reads them. Keep it as your copy, or upload it into another workspace through **Assets → Import** to recreate the assets there.\n\nOld backup files you still have cannot be uploaded: the import page says to use the template or an Import-ready export, and the **Update existing** flow recognizes a legacy backup file and stops with an explanation. Export again from the Assets index instead."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/manager-role",
      "url": "https://www.shelf.nu/updates/manager-role",
      "external_url": "https://www.shelf.nu/knowledge-base/user-roles-and-their-permissions#manager",
      "title": "A Manager Role for the People Who Run the Equipment Counter",
      "summary": "A new workspace role, Manager, sits between Administrator and Self service. Managers run every booking, custody assignment and audit in the workspace without being able to change assets, settings, billing or the team. Grant it from Settings → Team → Users → Invite a user or Change role, by CSV import, or through an SSO group.",
      "content_html": "<p>Until now, anyone who had to hand gear out to other people, take it back, or count stock for the whole workspace needed the Administrator role, and with it the power to edit every asset, change settings and manage the team. Many workspaces gave front-desk staff more than they needed because the role in between did not exist.</p>\n<p>You can now make someone a <strong>Manager</strong>. A Manager:</p>\n<ul>\n<li>sees every booking and can create, edit, check out, check in, extend, cancel and delete any of them, name anyone as custodian, and use the bookings list's bulk actions;</li>\n<li>sees every custodian and assigns or releases custody of assets and kits to anyone;</li>\n<li>sees every audit and can create, run, edit, complete, cancel, archive and delete any audit;</li>\n<li>reads the whole catalogue, including assets marked unavailable for bookings and archived assets, adds asset notes and reminders, and can add or edit non-registered members.</li>\n</ul>\n<p>A Manager cannot create, edit, import, export, archive or delete assets, kits, locations, categories, tags, custom fields or asset models; cannot invite, remove or re-role users; and does not see the workspace settings, billing, the dashboard or Reports. Signing in lands a Manager on <strong>Bookings</strong>.</p>\n<p>Owners and Administrators grant the role from <strong>Settings → Team → Users</strong>, through <strong>Invite a user</strong> or <strong>Change role</strong>, or from a <a href=\"https://www.shelf.nu/knowledge-base/inviting-users-via-csv-upload\">CSV user import</a> (<code>MANAGER</code>, or the label <code>Manager</code>). The workspace Owner can also map an identity-provider group to it in the new <strong>Manager role group</strong> field of the <a href=\"https://www.shelf.nu/knowledge-base/sso-with-google-workspace#step-9-map-google-workspace-groups-inside-shelf\">SSO settings</a>. Changing an Administrator to Manager moves nothing: the records they created stay in their name.</p>\n<p>A few labels moved with the role. The switches on <strong>Settings → Bookings</strong> that require each item to be scanned or selected now read <strong>Admins and Managers</strong>, because a Manager follows the same rule as an Administrator. The reservation broadcast is now called <strong>Notify all owners, administrators and managers on new booking requests</strong>, and Managers can be picked as booking notification recipients.</p>\n<p>The <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> app knows the role too, since its over-the-air update of the same day: a Manager on the phone runs every booking, custody hand-off and audit exactly as on the web.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/invite-role-list-manager.webp",
      "date_published": "2026-10-15T00:00:00.000Z",
      "_shelf": {
        "inApp": true,
        "appRoles": [
          "ADMIN",
          "OWNER"
        ],
        "markdown": "Until now, anyone who had to hand gear out to other people, take it back, or count stock for the whole workspace needed the Administrator role, and with it the power to edit every asset, change settings and manage the team. Many workspaces gave front-desk staff more than they needed because the role in between did not exist.\n\nYou can now make someone a **Manager**. A Manager:\n\n- sees every booking and can create, edit, check out, check in, extend, cancel and delete any of them, name anyone as custodian, and use the bookings list's bulk actions;\n- sees every custodian and assigns or releases custody of assets and kits to anyone;\n- sees every audit and can create, run, edit, complete, cancel, archive and delete any audit;\n- reads the whole catalogue, including assets marked unavailable for bookings and archived assets, adds asset notes and reminders, and can add or edit non-registered members.\n\nA Manager cannot create, edit, import, export, archive or delete assets, kits, locations, categories, tags, custom fields or asset models; cannot invite, remove or re-role users; and does not see the workspace settings, billing, the dashboard or Reports. Signing in lands a Manager on **Bookings**.\n\nOwners and Administrators grant the role from **Settings → Team → Users**, through **Invite a user** or **Change role**, or from a [CSV user import](https://www.shelf.nu/knowledge-base/inviting-users-via-csv-upload) (`MANAGER`, or the label `Manager`). The workspace Owner can also map an identity-provider group to it in the new **Manager role group** field of the [SSO settings](https://www.shelf.nu/knowledge-base/sso-with-google-workspace#step-9-map-google-workspace-groups-inside-shelf). Changing an Administrator to Manager moves nothing: the records they created stay in their name.\n\nA few labels moved with the role. The switches on **Settings → Bookings** that require each item to be scanned or selected now read **Admins and Managers**, because a Manager follows the same rule as an Administrator. The reservation broadcast is now called **Notify all owners, administrators and managers on new booking requests**, and Managers can be picked as booking notification recipients.\n\nThe [Shelf Companion](https://www.shelf.nu/mobile-app) app knows the role too, since its over-the-air update of the same day: a Manager on the phone runs every booking, custody hand-off and audit exactly as on the web."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/asset-descriptions-up-to-5000-characters",
      "url": "https://www.shelf.nu/updates/asset-descriptions-up-to-5000-characters",
      "title": "Asset Descriptions Can Now Run to 5,000 Characters",
      "summary": "The asset description limit goes from 1,000 to 5,000 characters, the same as notes and multi-line custom fields. A live counter shows where you stand, and a description that is too long is refused with a message instead of silently losing keystrokes.",
      "content_html": "<p>An asset's <strong>Description</strong> now holds up to <strong>5,000 characters</strong>, up from 1,000. The limit is the same wherever a description is written: the new-asset and edit forms, the inline editor on the asset page, a CSV import or bulk update, and the Companion app's API. A line break counts as one character, so what the counter shows is what the server checks.</p>\n<p>Two things used to go wrong, and both are fixed. A description that was already longer than 1,000 characters, which happens after a CSV import, could not be edited at all: every keystroke was silently dropped. And a description that ran past the limit was simply cut off by the field. Now the editor shows a counter, <strong>1,510 / 5,000</strong> for example, that turns red over the limit, and saving over it is refused with <em>Description must be 5,000 characters or fewer</em>. Your text stays in the field so you can shorten it.</p>\n<p>The same rule reaches the CSV paths. An import file with a description over 5,000 characters is refused before anything is saved, with the asset name and the count for each one, and nothing is cut. A bulk update only measures a description the file changes, so a stored description over the limit that you leave alone never blocks its row.</p>\n<p>Two places now shorten a long description on purpose. The description tooltip on the asset index shows the first 600 characters and ends with <em>Open the asset to read the full description</em>. The booking checklist PDF prints at most 300 characters per asset, so a long description does not take over the sheet.</p>\n<p>The <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> app's new-asset and edit-asset screens have the same 5,000-character limit and counter, from the 15 October 2026 update.</p>",
      "image": "https://www.shelf.nu/images/updates/text-editor-v2.jpg",
      "date_published": "2026-10-14T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "An asset's **Description** now holds up to **5,000 characters**, up from 1,000. The limit is the same wherever a description is written: the new-asset and edit forms, the inline editor on the asset page, a CSV import or bulk update, and the Companion app's API. A line break counts as one character, so what the counter shows is what the server checks.\n\nTwo things used to go wrong, and both are fixed. A description that was already longer than 1,000 characters, which happens after a CSV import, could not be edited at all: every keystroke was silently dropped. And a description that ran past the limit was simply cut off by the field. Now the editor shows a counter, **1,510 / 5,000** for example, that turns red over the limit, and saving over it is refused with *Description must be 5,000 characters or fewer*. Your text stays in the field so you can shorten it.\n\nThe same rule reaches the CSV paths. An import file with a description over 5,000 characters is refused before anything is saved, with the asset name and the count for each one, and nothing is cut. A bulk update only measures a description the file changes, so a stored description over the limit that you leave alone never blocks its row.\n\nTwo places now shorten a long description on purpose. The description tooltip on the asset index shows the first 600 characters and ends with *Open the asset to read the full description*. The booking checklist PDF prints at most 300 characters per asset, so a long description does not take over the sheet.\n\nThe [Shelf Companion](https://www.shelf.nu/mobile-app) app's new-asset and edit-asset screens have the same 5,000-character limit and counter, from the 15 October 2026 update."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/type-the-name-before-you-delete",
      "url": "https://www.shelf.nu/updates/type-the-name-before-you-delete",
      "external_url": "https://www.shelf.nu/knowledge-base/deleting-items-in-shelf",
      "title": "Type the Name Before You Delete",
      "summary": "Every permanent delete in Shelf now says what it removes and asks you to type the item's name, or the number of items selected, before it runs. Select all on locations, categories and asset models now deletes only what the list shows.",
      "content_html": "<p>One click on <strong>Delete</strong> used to remove an asset, or 200 of them, for good, and the dialog did not say what went with them. A customer asked us to make it harder to do by accident, so we did it for every delete in Shelf, on the web and in the Shelf Companion app.</p>\n<p>Now every permanent delete tells you what it takes with it, and <strong>Delete</strong> stays greyed out until you type the item's name. For a bulk delete you type the number of items selected. Shelf checks what you typed on the server too, and if a <strong>Select all</strong> selection has grown since you opened the dialog, it deletes nothing and asks for the new number. This covers assets, kits, locations, bookings, asset models, custom fields, archived audits, and categories and tags that are in use.</p>\n<p>We also fixed <strong>Select all</strong> on searched lists of locations, categories and asset models: deleting now removes exactly what the list shows, where before it could remove every one in the workspace. The same fix covers bookings: <strong>Select all</strong> on the Bookings list, or on a kit's or an asset's Bookings tab, now deletes, archives or cancels only the bookings that list shows. And on the web, an item with no name asks you to type <strong>delete</strong> instead of its name.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/delete-asset-confirm.webp",
      "date_published": "2026-10-12T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "One click on **Delete** used to remove an asset, or 200 of them, for good, and the dialog did not say what went with them. A customer asked us to make it harder to do by accident, so we did it for every delete in Shelf, on the web and in the Shelf Companion app.\n\nNow every permanent delete tells you what it takes with it, and **Delete** stays greyed out until you type the item's name. For a bulk delete you type the number of items selected. Shelf checks what you typed on the server too, and if a **Select all** selection has grown since you opened the dialog, it deletes nothing and asks for the new number. This covers assets, kits, locations, bookings, asset models, custom fields, archived audits, and categories and tags that are in use.\n\nWe also fixed **Select all** on searched lists of locations, categories and asset models: deleting now removes exactly what the list shows, where before it could remove every one in the workspace. The same fix covers bookings: **Select all** on the Bookings list, or on a kit's or an asset's Bookings tab, now deletes, archives or cancels only the bookings that list shows. And on the web, an item with no name asks you to type **delete** instead of its name."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/archive-and-reinstate-assets",
      "url": "https://www.shelf.nu/updates/archive-and-reinstate-assets",
      "external_url": "https://www.shelf.nu/knowledge-base/archive-and-reinstate-assets",
      "title": "Archive Assets Instead of Deleting Them",
      "summary": "Owners and Administrators can now archive an asset to take it out of asset lists, the booking picker and current-inventory reports while keeping its history, ID and QR code, and reinstate it at any time.",
      "content_html": "<p>Until now, the only way to get retired equipment out of your lists was to delete it, and a deleted asset takes its history with it. You can now <strong>archive</strong> an asset instead. Choose <strong>Archive</strong> from the asset's <strong>Actions</strong> menu, or archive a selection from the asset index. An archived asset leaves your asset lists, the booking picker, the dashboard's asset totals, value, status split and top locations, and the Asset Inventory, Asset Distribution and Idle Assets reports, but the record stays, with its history, SAM ID and QR code. <strong>Reinstate</strong> brings it back exactly as it was.</p>\n<p>To find archived assets, click the list title on the <strong>Assets</strong> page and choose <strong>Archived</strong> or <strong>All</strong>; the same menu is on a kit's and a location's asset lists. An archived asset's details are read-only, though you can still add a note on its <strong>Activity</strong> tab, reinstate it or delete it. It carries an <strong>Archived</strong> badge everywhere it still appears, including bookings that already held it and the page its QR label opens. History reports such as Activity, Asset Utilization and Top Booked keep counting it.</p>\n<p>Archiving is careful with everything around the asset. The asset's <strong>Activity</strong> tab records who archived and reinstated it, its reminders pause instead of emailing, and a kit whose assets are all archived can't be booked or put in custody until one comes back. A Draft booking that holds an archived asset names it and keeps <strong>Reserve</strong> greyed out until you take it off or reinstate it. Asset counts on the locations, kits, categories and asset models lists leave archived assets out.</p>\n<p>In the <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> app, an archived asset you open or scan reads <strong>Archived</strong> rather than <strong>Available</strong>, its custody, move and edit actions are turned off, and Owners and Administrators can reinstate it from the phone.</p>\n<p>Archiving itself is available to Owners and Administrators, on the web. For now it covers individually tracked assets that are not checked out, in custody or in a reserved or checked-out booking.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/archive-view-menu.webp",
      "date_published": "2026-10-09T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Until now, the only way to get retired equipment out of your lists was to delete it, and a deleted asset takes its history with it. You can now **archive** an asset instead. Choose **Archive** from the asset's **Actions** menu, or archive a selection from the asset index. An archived asset leaves your asset lists, the booking picker, the dashboard's asset totals, value, status split and top locations, and the Asset Inventory, Asset Distribution and Idle Assets reports, but the record stays, with its history, SAM ID and QR code. **Reinstate** brings it back exactly as it was.\n\nTo find archived assets, click the list title on the **Assets** page and choose **Archived** or **All**; the same menu is on a kit's and a location's asset lists. An archived asset's details are read-only, though you can still add a note on its **Activity** tab, reinstate it or delete it. It carries an **Archived** badge everywhere it still appears, including bookings that already held it and the page its QR label opens. History reports such as Activity, Asset Utilization and Top Booked keep counting it.\n\nArchiving is careful with everything around the asset. The asset's **Activity** tab records who archived and reinstated it, its reminders pause instead of emailing, and a kit whose assets are all archived can't be booked or put in custody until one comes back. A Draft booking that holds an archived asset names it and keeps **Reserve** greyed out until you take it off or reinstate it. Asset counts on the locations, kits, categories and asset models lists leave archived assets out.\n\nIn the [Shelf Companion](https://www.shelf.nu/mobile-app) app, an archived asset you open or scan reads **Archived** rather than **Available**, its custody, move and edit actions are turned off, and Owners and Administrators can reinstate it from the phone.\n\nArchiving itself is available to Owners and Administrators, on the web. For now it covers individually tracked assets that are not checked out, in custody or in a reserved or checked-out booking."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/feedback-sends-you-a-copy",
      "url": "https://www.shelf.nu/updates/feedback-sends-you-a-copy",
      "title": "Feedback You Send Now Comes Back to You by Email",
      "summary": "When you send an issue or idea through Questions/Feedback, Shelf now emails you a copy of what you wrote, and replying to it reaches our support team.",
      "content_html": "<p>When you send feedback through <strong>Questions/Feedback</strong> in the sidebar, or with <strong>Report this issue</strong> from an error screen, you now get a short thank-you email with a copy of what you sent: whether it was an issue or an idea, your message, and the link to your screenshot if you attached one. That gives you a record of what you reported. If you want to add something, reply to that email and it reaches our support team.</p>\n<p>The copy contains only what you wrote. The technical details we collect to reproduce a problem, such as the page you were on and your app version, stay with our team.</p>",
      "date_published": "2026-10-09T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "When you send feedback through **Questions/Feedback** in the sidebar, or with **Report this issue** from an error screen, you now get a short thank-you email with a copy of what you sent: whether it was an issue or an idea, your message, and the link to your screenshot if you attached one. That gives you a record of what you reported. If you want to add something, reply to that email and it reaches our support team.\n\nThe copy contains only what you wrote. The technical details we collect to reproduce a problem, such as the page you were on and your app version, stay with our team."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/a-kit-members-custody-comes-from-its-kit",
      "url": "https://www.shelf.nu/updates/a-kit-members-custody-comes-from-its-kit",
      "title": "A Kit Member's Custody Comes From Its Kit",
      "summary": "An individually tracked asset that sits in a kit can no longer be given custody on its own, from the asset page, the bulk action or the app. Assign custody to the kit, or take the asset out of the kit first.",
      "content_html": "<p>An individually tracked asset that belonged to a <a href=\"https://www.shelf.nu/knowledge-base/kits\">kit</a> could be put into someone's custody on its own from the asset page, the bulk <strong>Assign custody</strong> action on the assets index and the <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> app, while the batch scanner already refused it. The kit then read <strong>Available</strong> while one of its parts was with someone.</p>\n<p>Now every path refuses it with the same reason: <em>\"Tripod\" is part of kit \"Interview Kit\". Assign custody to the kit, or remove the asset from the kit first.</em> The menus and the phone's <strong>Assign Custody</strong> button are greyed out with that reason before you click. Assign custody to the kit, or take the asset out of the kit and then assign it.</p>\n<p>Quantity-tracked stock is not affected: a kit holds only its slice of a pool, so the free units can still go to someone directly. Custody that was already assigned to a kit member stays where it is, and kit custody works as before. See <a href=\"https://www.shelf.nu/knowledge-base/custody-feature-for-long-term-equipment-lend-outs#custody-a-kit-put-there-belongs-to-the-kit\">Custody a kit put there belongs to the kit</a>.</p>",
      "image": "https://www.shelf.nu/images/updates/enhanced-user-permissions.jpg",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "An individually tracked asset that belonged to a [kit](https://www.shelf.nu/knowledge-base/kits) could be put into someone's custody on its own from the asset page, the bulk **Assign custody** action on the assets index and the [Shelf Companion](https://www.shelf.nu/mobile-app) app, while the batch scanner already refused it. The kit then read **Available** while one of its parts was with someone.\n\nNow every path refuses it with the same reason: *\"Tripod\" is part of kit \"Interview Kit\". Assign custody to the kit, or remove the asset from the kit first.* The menus and the phone's **Assign Custody** button are greyed out with that reason before you click. Assign custody to the kit, or take the asset out of the kit and then assign it.\n\nQuantity-tracked stock is not affected: a kit holds only its slice of a pool, so the free units can still go to someone directly. Custody that was already assigned to a kit member stays where it is, and kit custody works as before. See [Custody a kit put there belongs to the kit](https://www.shelf.nu/knowledge-base/custody-feature-for-long-term-equipment-lend-outs#custody-a-kit-put-there-belongs-to-the-kit)."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/companion-from-location-and-audit-rows-open-the-asset",
      "url": "https://www.shelf.nu/updates/companion-from-location-and-audit-rows-open-the-asset",
      "external_url": "https://www.shelf.nu/knowledge-base/shelf-ios-companion-getting-started",
      "title": "Shelf Companion: Pick Where Pooled Units Come From, Open Assets From an Audit",
      "summary": "Three phone updates on 8 October 2026: the app asks which location a pool's units leave from, an audit row opens its asset with Back returning to the audit, a kit member takes custody through its kit, and a hidden one-tap check-out says why.",
      "content_html": "<p>Three over-the-air updates went out to <strong>Shelf Companion</strong> on iPhone and Android on 8 October 2026. The version number stays <strong>1.5.0</strong>. The app picks up an update like this in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.</p>\n<h2>Where pooled units come from</h2>\n<p>The web started recording which location a <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">quantity-tracked</a> pool's units leave from on 7 October. The phone now asks the same question. On a pool kept at two or more locations:</p>\n<ul>\n<li>The <strong>Assign</strong> sheet shows a <strong>From location</strong> list, one row per location with what sits there and what is already committed, plus <strong>Unplaced</strong> when the pool has unplaced units. It starts on the location with the most units left, and the quantity is capped at what the picked row has.</li>\n<li>Each holder's row says where their units came from, for example <em>1 from Camera Room · 1 from Studio</em>, and the release sheet says where they go back to.</li>\n<li><strong>Check Out All Assets</strong>, <strong>Select to Check Out</strong> and the booking scanner ask <strong>Where do the units come from?</strong> before the units go out, and the booking row then reads <em>From Studio</em>.</li>\n</ul>\n<p>A pool kept at one location asks nothing, and individually tracked assets work as before. Assigning custody to a batch from the <strong>Scan</strong> tab still records no location; that hold reads <em>location not recorded</em> on the web.</p>\n<h2>Open the asset from an audit row</h2>\n<p>Tapping a row on an audit's asset list now opens that asset, so a missing or unexpected item can be fixed on the spot. Back, the iOS edge swipe and the Android back button return to the same audit with its filter and scroll kept, and the audit reloads to show the change. The note and photo chip on a row still opens its evidence.</p>\n<h2>Also in these updates</h2>\n<ul>\n<li><strong>Assign Custody</strong> is greyed out on an individually tracked asset that sits in a kit, with the reason under it. Custody of a kit member comes from its kit. See <a href=\"https://www.shelf.nu/updates/a-kit-members-custody-comes-from-its-kit\">A kit member's custody comes from its kit</a>.</li>\n<li>Where your workspace has <a href=\"https://www.shelf.nu/knowledge-base/require-explicit-check-in-and-check-out\">removed the one-tap check-out or check-in</a> for your role, the booking screen now says so: <em>\"Your workspace requires each item to be scanned or selected to check out.\"</em> Each check-out and check-in from the phone is also recorded with how it was made, scanned or selected.</li>\n</ul>",
      "image": "https://www.shelf.nu/images/updates/shelf-mobile-app.jpg",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Three over-the-air updates went out to **Shelf Companion** on iPhone and Android on 8 October 2026. The version number stays **1.5.0**. The app picks up an update like this in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.\n\n## Where pooled units come from\n\nThe web started recording which location a [quantity-tracked](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables) pool's units leave from on 7 October. The phone now asks the same question. On a pool kept at two or more locations:\n\n- The **Assign** sheet shows a **From location** list, one row per location with what sits there and what is already committed, plus **Unplaced** when the pool has unplaced units. It starts on the location with the most units left, and the quantity is capped at what the picked row has.\n- Each holder's row says where their units came from, for example *1 from Camera Room · 1 from Studio*, and the release sheet says where they go back to.\n- **Check Out All Assets**, **Select to Check Out** and the booking scanner ask **Where do the units come from?** before the units go out, and the booking row then reads *From Studio*.\n\nA pool kept at one location asks nothing, and individually tracked assets work as before. Assigning custody to a batch from the **Scan** tab still records no location; that hold reads *location not recorded* on the web.\n\n## Open the asset from an audit row\n\nTapping a row on an audit's asset list now opens that asset, so a missing or unexpected item can be fixed on the spot. Back, the iOS edge swipe and the Android back button return to the same audit with its filter and scroll kept, and the audit reloads to show the change. The note and photo chip on a row still opens its evidence.\n\n## Also in these updates\n\n- **Assign Custody** is greyed out on an individually tracked asset that sits in a kit, with the reason under it. Custody of a kit member comes from its kit. See [A kit member's custody comes from its kit](https://www.shelf.nu/updates/a-kit-members-custody-comes-from-its-kit).\n- Where your workspace has [removed the one-tap check-out or check-in](https://www.shelf.nu/knowledge-base/require-explicit-check-in-and-check-out) for your role, the booking screen now says so: *\"Your workspace requires each item to be scanned or selected to check out.\"* Each check-out and check-in from the phone is also recorded with how it was made, scanned or selected."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/every-check-out-says-how-it-was-made",
      "url": "https://www.shelf.nu/updates/every-check-out-says-how-it-was-made",
      "external_url": "https://www.shelf.nu/knowledge-base/require-explicit-check-in-and-check-out",
      "title": "Every Check-out and Check-in Says How It Was Made",
      "summary": "Booking activity and the check-in receipt now say whether items were scanned, selected or handed over in one click, on the web or the phone. The two settings that remove the one-click action are renamed and say who they never reach.",
      "content_html": "<p>Every booking check-out and check-in now records how it was made and where. The booking's activity line ends with it, for example <em>checked-out the booking (selected on the phone)</em> or <em>performed a partial check-in: Tripod (scanned on the web)</em>. A one-click action reads <em>in one click on the web</em> or <em>in one tap on the phone</em>. The <a href=\"https://www.shelf.nu/knowledge-base/print-a-check-in-receipt-for-a-booking\">check-in receipt</a> prints a <strong>Check-in method</strong> line when every item came back the same way, and the method under each row when they did not. Check-outs and check-ins from before 8 October 2026 carry no method.</p>\n<p>The two settings under <strong>Settings ▸ Workspace settings ▸ Bookings</strong> that <a href=\"https://www.shelf.nu/knowledge-base/require-explicit-check-in-and-check-out\">remove the one-click check-out or check-in</a> for a role have new names and clearer words: <strong>Check-in needs each item scanned or selected</strong> and <strong>Check-out needs each item scanned or selected</strong>, with one switch for <strong>Admins</strong> and one for <strong>Self Service users</strong>. Each card now says, always visible, <em>\"The workspace owner is never restricted. Base users cannot check out.\"</em> The switches and what they do are unchanged.</p>\n<p>In the <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> app, where that rule hides <strong>Check Out All Assets</strong> or <strong>Check In All</strong>, the booking screen now says why: <em>\"Your workspace requires each item to be scanned or selected to check out.\"</em></p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/explicit-requirement-cards-v2.webp",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Every booking check-out and check-in now records how it was made and where. The booking's activity line ends with it, for example *checked-out the booking (selected on the phone)* or *performed a partial check-in: Tripod (scanned on the web)*. A one-click action reads *in one click on the web* or *in one tap on the phone*. The [check-in receipt](https://www.shelf.nu/knowledge-base/print-a-check-in-receipt-for-a-booking) prints a **Check-in method** line when every item came back the same way, and the method under each row when they did not. Check-outs and check-ins from before 8 October 2026 carry no method.\n\nThe two settings under **Settings ▸ Workspace settings ▸ Bookings** that [remove the one-click check-out or check-in](https://www.shelf.nu/knowledge-base/require-explicit-check-in-and-check-out) for a role have new names and clearer words: **Check-in needs each item scanned or selected** and **Check-out needs each item scanned or selected**, with one switch for **Admins** and one for **Self Service users**. Each card now says, always visible, *\"The workspace owner is never restricted. Base users cannot check out.\"* The switches and what they do are unchanged.\n\nIn the [Shelf Companion](https://www.shelf.nu/mobile-app) app, where that rule hides **Check Out All Assets** or **Check In All**, the booking screen now says why: *\"Your workspace requires each item to be scanned or selected to check out.\"*"
      }
    },
    {
      "id": "https://www.shelf.nu/updates/only-the-owner-makes-administrators",
      "url": "https://www.shelf.nu/updates/only-the-owner-makes-administrators",
      "external_url": "https://www.shelf.nu/knowledge-base/user-roles-and-their-permissions#full-permissions-reference",
      "title": "Only the workspace owner makes Administrators, and Self-service and Base change only their own drafts",
      "summary": "Inviting or promoting an Administrator is now the owner's alone on every path. Self-service and Base users add items to, and delete, their own bookings only while they are drafts.",
      "content_html": "<p>Shelf now decides every role question in one place, and a few rules got stricter along the way. The ones you will notice:</p>\n<ul>\n<li><strong>Administrators come from the owner.</strong> Only the workspace owner can invite someone as an Administrator or promote a member to Administrator, on every path: the invite dialog, a resent invite, the <strong>Change role</strong> dialog and a CSV user import. Administrators still invite and manage Self-service and Base users. A CSV file from an Administrator that contains an <code>ADMIN</code> row is refused as a whole.</li>\n<li><strong>Demotions hand records to an Administrator.</strong> When you lower someone's role, the records they owned can go to the owner or another Administrator, not to a Self-service or Base member. An Administrator lowered by your identity provider's group mapping hands over the same way as one lowered by hand.</li>\n<li><strong>Self-service and Base change only their own drafts.</strong> They can add items to their own booking, and delete it, only while it is a <strong>Draft</strong>. Self-service users can still take items off a <strong>Reserved</strong> booking and cancel it. Base users cannot cancel or archive a booking on any path.</li>\n<li><strong>Audit details belong to Administrators.</strong> Editing an audit's details or changing who it is assigned to needs the Owner or an Administrator, and the assignee must be a member of the workspace.</li>\n</ul>\n<p>The <a href=\"https://www.shelf.nu/knowledge-base/user-roles-and-their-permissions\">roles and permissions guide</a> has the full table.</p>",
      "image": "https://www.shelf.nu/images/updates/enhanced-user-permissions.jpg",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Shelf now decides every role question in one place, and a few rules got stricter along the way. The ones you will notice:\n\n- **Administrators come from the owner.** Only the workspace owner can invite someone as an Administrator or promote a member to Administrator, on every path: the invite dialog, a resent invite, the **Change role** dialog and a CSV user import. Administrators still invite and manage Self-service and Base users. A CSV file from an Administrator that contains an `ADMIN` row is refused as a whole.\n- **Demotions hand records to an Administrator.** When you lower someone's role, the records they owned can go to the owner or another Administrator, not to a Self-service or Base member. An Administrator lowered by your identity provider's group mapping hands over the same way as one lowered by hand.\n- **Self-service and Base change only their own drafts.** They can add items to their own booking, and delete it, only while it is a **Draft**. Self-service users can still take items off a **Reserved** booking and cancel it. Base users cannot cancel or archive a booking on any path.\n- **Audit details belong to Administrators.** Editing an audit's details or changing who it is assigned to needs the Owner or an Administrator, and the assignee must be a member of the workspace.\n\nThe [roles and permissions guide](https://www.shelf.nu/knowledge-base/user-roles-and-their-permissions) has the full table."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/printed-sheets-print-each-code-as-that-code",
      "url": "https://www.shelf.nu/updates/printed-sheets-print-each-code-as-that-code",
      "external_url": "https://www.shelf.nu/knowledge-base/how-to-generate-a-pdf-overview-of-your-reserved-assets-bookings#the-code-column",
      "title": "Printed sheets show each code as a picture of that code, at full size",
      "summary": "The booking checklist and the audit receipt now print a barcode workspace's own barcodes, not a Shelf QR, and both sheets print at 100% with rows that never split across a page.",
      "content_html": "<p>In a workspace that uses barcodes, the booking checklist and the audit receipt used to print a Shelf QR above the barcode value, so scanning the sheet read a different code from the one printed next to it. The picture in the <strong>Code</strong> column is now the code printed under it: a Code 128 row prints a Code 128 barcode, a DataMatrix row a DataMatrix, and an External QR row that QR. QR Code ID and SAM ID workspaces keep the Shelf QR. A barcode value too long to print at a scannable size prints as text only.</p>\n<p>The sheets also print properly now. They used to be wider than the page, so browsers shrank them (one booking printed at 88%) and wide tables ran off the edge. The booking checklist, the check-in receipt and the audit receipt now print at 100% with the table inside the page. A row never splits across a page break and the headers repeat on every page. Photos far down a long booking print as photos instead of grey loading boxes, and the checklist no longer prints an empty Description row.</p>\n<p>The workspace switch that turns the pictures off is renamed to match: <strong>Settings → General ▸ Code images on PDFs ▸ Print code images on PDFs</strong>. It works as before and is on by default.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/code-images-on-pdfs-setting.webp",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "In a workspace that uses barcodes, the booking checklist and the audit receipt used to print a Shelf QR above the barcode value, so scanning the sheet read a different code from the one printed next to it. The picture in the **Code** column is now the code printed under it: a Code 128 row prints a Code 128 barcode, a DataMatrix row a DataMatrix, and an External QR row that QR. QR Code ID and SAM ID workspaces keep the Shelf QR. A barcode value too long to print at a scannable size prints as text only.\n\nThe sheets also print properly now. They used to be wider than the page, so browsers shrank them (one booking printed at 88%) and wide tables ran off the edge. The booking checklist, the check-in receipt and the audit receipt now print at 100% with the table inside the page. A row never splits across a page break and the headers repeat on every page. Photos far down a long booking print as photos instead of grey loading boxes, and the checklist no longer prints an empty Description row.\n\nThe workspace switch that turns the pictures off is renamed to match: **Settings → General ▸ Code images on PDFs ▸ Print code images on PDFs**. It works as before and is on by default."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/scanner-drawers-one-needs-attention-card",
      "url": "https://www.shelf.nu/updates/scanner-drawers-one-needs-attention-card",
      "external_url": "https://www.shelf.nu/knowledge-base/batch-scanning-actions#handling-conflicts",
      "title": "Scanner Drawers: One Needs Attention Card, and a Fulfil List That Survives a Reload",
      "summary": "Every web scanner drawer now lists problems in one Needs attention card with Resolve all, keeps scanned rows in foldable cards, and takes less space. The Fulfil reservations & check out list is kept for twelve hours through a reload or a closed tab.",
      "content_html": "<p>The drawers of every web scanner, from booking check-out and check-in to custody, location, kits and audits, have been tidied so more scanned rows fit on screen. The header is one row, the drawer sits right under the code field, and rows are grouped in cards such as <strong>Scanned this session</strong> that fold open and closed.</p>\n<p>Anything that blocks the action now sits in one <strong>Needs attention</strong> card at the top of the list. Each line has <strong>Remove from list</strong>, the card has <strong>Resolve all</strong>, and a note above the button says how many issues are left. <strong>Resolve all</strong> removes exactly what the card lists. On <strong>Scan to add</strong> it used to also drop valid scans you were never warned about. Audits now flag a scanned kit and an unknown code in the same card, and opening <strong>Add comment</strong> or <strong>Add image</strong> on an audit row no longer empties the list.</p>\n<p>The <strong>Fulfil reservations &#x26; check out</strong> scanner also keeps its list for twelve hours in your browser. Reload the page, close the tab or let the device sleep, open the scanner on the same booking again, and the list comes back, each row looked up fresh. A check-out that goes through clears it; one that is refused keeps it. See <a href=\"https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#your-fulfil-scan-list-survives-a-reload\">Your fulfil scan list survives a reload</a>.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/scanner-needs-attention.webp?v=2",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "The drawers of every web scanner, from booking check-out and check-in to custody, location, kits and audits, have been tidied so more scanned rows fit on screen. The header is one row, the drawer sits right under the code field, and rows are grouped in cards such as **Scanned this session** that fold open and closed.\n\nAnything that blocks the action now sits in one **Needs attention** card at the top of the list. Each line has **Remove from list**, the card has **Resolve all**, and a note above the button says how many issues are left. **Resolve all** removes exactly what the card lists. On **Scan to add** it used to also drop valid scans you were never warned about. Audits now flag a scanned kit and an unknown code in the same card, and opening **Add comment** or **Add image** on an audit row no longer empties the list.\n\nThe **Fulfil reservations & check out** scanner also keeps its list for twelve hours in your browser. Reload the page, close the tab or let the device sleep, open the scanner on the same booking again, and the list comes back, each row looked up fresh. A check-out that goes through clears it; one that is refused keeps it. See [Your fulfil scan list survives a reload](https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#your-fulfil-scan-list-survives-a-reload)."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/search-finds-assets-by-their-model-name",
      "url": "https://www.shelf.nu/updates/search-finds-assets-by-their-model-name",
      "external_url": "https://www.shelf.nu/knowledge-base/advanced-asset-index-complete-guide#asset-model-view",
      "title": "Search finds assets by their model name, and booking by model shows what is free",
      "summary": "Typing an asset model's name now finds its units everywhere you search. Creating a booking from the asset model view shows how many units are free once the dates are set.",
      "content_html": "<p>Typing a model's name into the asset search, for example <code>Dell Latitude 5550</code>, used to find nothing unless the name also appeared in each asset's own title, and the asset model view then showed every model with 0 assets. Search now matches the <a href=\"https://www.shelf.nu/glossary/asset-models\">asset model</a> an asset belongs to, in both index modes and in the Shelf Companion app's asset search, which runs on the same server search.</p>\n<p>Booking by model from the asset model view got a few improvements too:</p>\n<ul>\n<li><strong>Create new booking</strong> shows how many units of each model are free once both dates are set, for example <em>\"adding 2 → 2 of 8 available\"</em>, the same hint <strong>Add to existing</strong> already gave.</li>\n<li>Asking for more units than a model can give in that window is refused under a clear <strong>Not enough units</strong> title instead of a generic error.</li>\n<li>The <strong>Add to existing</strong> booking pickers open on bookings that have not ended yet, soonest first, and list finished bookings after them, most recent first.</li>\n<li>The panel that lists a model's assets keeps its column headers in view while you scroll, and when no asset matches your filters it says how many sit outside them.</li>\n</ul>",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Typing a model's name into the asset search, for example `Dell Latitude 5550`, used to find nothing unless the name also appeared in each asset's own title, and the asset model view then showed every model with 0 assets. Search now matches the [asset model](https://www.shelf.nu/glossary/asset-models) an asset belongs to, in both index modes and in the Shelf Companion app's asset search, which runs on the same server search.\n\nBooking by model from the asset model view got a few improvements too:\n\n- **Create new booking** shows how many units of each model are free once both dates are set, for example *\"adding 2 → 2 of 8 available\"*, the same hint **Add to existing** already gave.\n- Asking for more units than a model can give in that window is refused under a clear **Not enough units** title instead of a generic error.\n- The **Add to existing** booking pickers open on bookings that have not ended yet, soonest first, and list finished bookings after them, most recent first.\n- The panel that lists a model's assets keeps its column headers in view while you scroll, and when no asset matches your filters it says how many sit outside them."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/shelf-asks-before-revoking-access",
      "url": "https://www.shelf.nu/updates/shelf-asks-before-revoking-access",
      "title": "Shelf Asks Before It Revokes a Team Member's Access",
      "summary": "Revoke access now opens a confirmation that names the person and says what happens, with an extra warning for people who sign in with SSO.",
      "content_html": "<p><strong>Revoke access</strong> in a team member's <strong>Actions</strong> menu used to take effect the moment you clicked it. It now opens a confirmation first, on the <strong>Team ▸ Users</strong> list and on the person's own page. The dialog names the person and their email and says what will happen: they can no longer open the workspace and are told by email, their team member record and history are kept, and you can invite them again later. <strong>Cancel</strong> leaves everything as it was.</p>\n<p>If Shelf refuses the revoke, for example because only the workspace owner may revoke an Administrator, the reason now shows inside the dialog instead of nowhere. For someone who signs in with SSO, the dialog also warns that group-based SSO gives them access back at their next sign-in unless you remove them from the mapped group in your identity provider. See <a href=\"https://www.shelf.nu/knowledge-base/changing-user-roles-in-shelf#revoking-access-instead\">Changing User Roles in Shelf</a>.</p>",
      "image": "https://www.shelf.nu/images/updates/enhanced-user-permissions.jpg",
      "date_published": "2026-10-08T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "**Revoke access** in a team member's **Actions** menu used to take effect the moment you clicked it. It now opens a confirmation first, on the **Team ▸ Users** list and on the person's own page. The dialog names the person and their email and says what will happen: they can no longer open the workspace and are told by email, their team member record and history are kept, and you can invite them again later. **Cancel** leaves everything as it was.\n\nIf Shelf refuses the revoke, for example because only the workspace owner may revoke an Administrator, the reason now shows inside the dialog instead of nowhere. For someone who signs in with SSO, the dialog also warns that group-based SSO gives them access back at their next sign-in unless you remove them from the mapped group in your identity provider. See [Changing User Roles in Shelf](https://www.shelf.nu/knowledge-base/changing-user-roles-in-shelf#revoking-access-instead)."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/a-kit-in-custody-does-not-go-out-on-a-booking",
      "url": "https://www.shelf.nu/updates/a-kit-in-custody-does-not-go-out-on-a-booking",
      "external_url": "https://www.shelf.nu/knowledge-base/kits#a-kit-in-custody-stays-home",
      "title": "A Kit in Custody Does Not Go Out on a Booking",
      "summary": "A kit is one unit with one holder: a kit in someone's custody is refused at check-out, a checked-out kit cannot be given a custodian, a kit sharing pooled stock with another kit that is out is released when its own booking comes back, and a kit still out on an overdue booking is held for every date.",
      "content_html": "<p>Corrections to how a <a href=\"https://www.shelf.nu/knowledge-base/kits\">kit</a> is held and released.</p>\n<h2>Custody and bookings never overlap on a kit</h2>\n<p>A kit is one physical unit with one holder. From now on a kit in someone's <strong>custody</strong> cannot be checked out on a booking, and a kit that is <strong>checked out</strong> cannot be given a custodian, whatever the kit is made of. The <strong>Check out</strong> button on a booking holding such a kit is disabled with <em>\"Some kits in this booking are currently in custody. Release their custody before you can check-out\"</em>, the <strong>Scan to check out</strong> drawer lists the kit under a blocker, and the server refuses a request that gets through anyway, from the web or from the <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion app</a>: <em>\"Cannot check out booking. Some kits are in custody: Camera Kit A. Release their custody first or remove them from the booking.\"</em> Adding the kit to a booking and reserving it stay allowed, because the kit is assumed back by the time the booking goes out.</p>\n<p>Before this, check-out looked at the member assets rather than the kit. A quantity-tracked member reading <strong>In custody</strong> only means some of its units are held, so a kit built only from pooled stock could go out on a booking while its custodian still held it, and then read <strong>Checked out</strong> with its custody row still attached.</p>\n<h2>A kit sharing pooled stock is released with its own booking</h2>\n<p>When a quantity-tracked asset sits in several kits, say one pool of tripods spread across camera kits, and another kit holding units of it was out on its own booking, checking this kit's booking in used to release everything except the kit: the shared tripod still read <strong>Checked out</strong> through the other kit, and the release took that as this kit still being out. The booking completed and the kit stayed <strong>Checked Out</strong> with nothing to clear it. The release now judges a kit by its own slices on the booking, so a shared pooled member never holds a kit back. A kit left stuck this way heals itself the next time it goes out and comes back, since a <strong>Checked Out</strong> kit can still be added to a draft or reserved booking.</p>\n<h2>Which kits another booking can take</h2>\n<p>Three more corrections to the same rule, shipped on 7 October:</p>\n<ul>\n<li><strong>A kit still out on an overdue booking is held for every date.</strong> Whether another booking held a kit used to be decided by date overlap alone, so once an overdue booking's due date had passed, a kit that never came back looked free for any later booking. It could be reserved and even checked out on two bookings at once. It is now held for every date until it is checked in, the same way overdue pooled stock already was. See <a href=\"https://www.shelf.nu/knowledge-base/kits#one-booking-at-a-time\">One Booking at a Time</a>.</li>\n<li><strong>Scan to check out warns before you submit.</strong> A scanned kit that another booking holds is now listed under a blocker while you scan, and <strong>Check out assets</strong> stays disabled until you remove it, instead of the refusal arriving only at submit.</li>\n<li><strong>Kits sharing pooled stock are no longer hidden from each other.</strong> When two kits each take units of the same pool and one of them was reserved, the kit picker's <strong>Hide unavailable</strong> filter hid the other one too, even with most of the pool free; adding it by scan or from the Shelf Companion app was refused the same way. A kit is now judged by its own units, so the second kit is offered and can be added.</li>\n</ul>",
      "image": "https://www.shelf.nu/images/updates/compact-kits-bookings.jpg",
      "date_published": "2026-10-07T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Corrections to how a [kit](https://www.shelf.nu/knowledge-base/kits) is held and released.\n\n## Custody and bookings never overlap on a kit\n\nA kit is one physical unit with one holder. From now on a kit in someone's **custody** cannot be checked out on a booking, and a kit that is **checked out** cannot be given a custodian, whatever the kit is made of. The **Check out** button on a booking holding such a kit is disabled with *\"Some kits in this booking are currently in custody. Release their custody before you can check-out\"*, the **Scan to check out** drawer lists the kit under a blocker, and the server refuses a request that gets through anyway, from the web or from the [Shelf Companion app](https://www.shelf.nu/mobile-app): *\"Cannot check out booking. Some kits are in custody: Camera Kit A. Release their custody first or remove them from the booking.\"* Adding the kit to a booking and reserving it stay allowed, because the kit is assumed back by the time the booking goes out.\n\nBefore this, check-out looked at the member assets rather than the kit. A quantity-tracked member reading **In custody** only means some of its units are held, so a kit built only from pooled stock could go out on a booking while its custodian still held it, and then read **Checked out** with its custody row still attached.\n\n## A kit sharing pooled stock is released with its own booking\n\nWhen a quantity-tracked asset sits in several kits, say one pool of tripods spread across camera kits, and another kit holding units of it was out on its own booking, checking this kit's booking in used to release everything except the kit: the shared tripod still read **Checked out** through the other kit, and the release took that as this kit still being out. The booking completed and the kit stayed **Checked Out** with nothing to clear it. The release now judges a kit by its own slices on the booking, so a shared pooled member never holds a kit back. A kit left stuck this way heals itself the next time it goes out and comes back, since a **Checked Out** kit can still be added to a draft or reserved booking.\n\n## Which kits another booking can take\n\nThree more corrections to the same rule, shipped on 7 October:\n\n- **A kit still out on an overdue booking is held for every date.** Whether another booking held a kit used to be decided by date overlap alone, so once an overdue booking's due date had passed, a kit that never came back looked free for any later booking. It could be reserved and even checked out on two bookings at once. It is now held for every date until it is checked in, the same way overdue pooled stock already was. See [One Booking at a Time](https://www.shelf.nu/knowledge-base/kits#one-booking-at-a-time).\n- **Scan to check out warns before you submit.** A scanned kit that another booking holds is now listed under a blocker while you scan, and **Check out assets** stays disabled until you remove it, instead of the refusal arriving only at submit.\n- **Kits sharing pooled stock are no longer hidden from each other.** When two kits each take units of the same pool and one of them was reserved, the kit picker's **Hide unavailable** filter hid the other one too, even with most of the pool free; adding it by scan or from the Shelf Companion app was refused the same way. A kit is now judged by its own units, so the second kit is offered and can be added."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/check-in-settles-only-what-went-out-in-kits-too",
      "url": "https://www.shelf.nu/updates/check-in-settles-only-what-went-out-in-kits-too",
      "title": "Check-In Settles Only What Went Out, in Kits Too",
      "summary": "Units of a quantity-tracked asset marked consumed, lost or damaged at check-in now leave the kit that carried them, and the one-click check-in no longer consumes units of a used-up line that never left the shelf.",
      "content_html": "<p>Two corrections to how a booking check-in settles <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">quantity-tracked stock</a>.</p>\n<p><strong>Units used up out of a kit leave the kit.</strong> A pool can sit inside a <a href=\"https://www.shelf.nu/knowledge-base/kits#quantity-tracked-stock-in-kits\">kit</a>, and the kit's slice goes out and comes back with the kit's bookings. When units of that slice came back marked consumed, lost or damaged, the stock dropped but the kit kept claiming them, and so did the kit's location. The next edit of that membership was then refused with <em>\"You're trying to assign more of this asset than are available.\"</em> Now those units leave the kit's membership in the same check-in, the kit's placement of them goes with them, and bookings that have not started yet are capped at what the kit now holds, with a note on each. A membership that reaches zero is removed the way a member is removed.</p>\n<p><strong>The one-click check-in consumes only what is still out.</strong> Closing a booking with the <strong>Check in</strong> button used to apply a used-up (one-way) line's default to its whole booked quantity, including units that never left the shelf on a booking that was only partly handed over. It now consumes only the units still out, and nothing from a line that never left. A scan check-in of a used-up pool with none of its units out is refused: <em>Cannot check in \"Gaffer tape\": none of its units are out on this booking.</em></p>\n<p>Both apply to check-ins from the web and from the <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion app</a>, since the rule lives on the server.</p>",
      "image": "https://www.shelf.nu/images/updates/compact-kits-bookings.jpg",
      "date_published": "2026-10-07T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Two corrections to how a booking check-in settles [quantity-tracked stock](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables).\n\n**Units used up out of a kit leave the kit.** A pool can sit inside a [kit](https://www.shelf.nu/knowledge-base/kits#quantity-tracked-stock-in-kits), and the kit's slice goes out and comes back with the kit's bookings. When units of that slice came back marked consumed, lost or damaged, the stock dropped but the kit kept claiming them, and so did the kit's location. The next edit of that membership was then refused with *\"You're trying to assign more of this asset than are available.\"* Now those units leave the kit's membership in the same check-in, the kit's placement of them goes with them, and bookings that have not started yet are capped at what the kit now holds, with a note on each. A membership that reaches zero is removed the way a member is removed.\n\n**The one-click check-in consumes only what is still out.** Closing a booking with the **Check in** button used to apply a used-up (one-way) line's default to its whole booked quantity, including units that never left the shelf on a booking that was only partly handed over. It now consumes only the units still out, and nothing from a line that never left. A scan check-in of a used-up pool with none of its units out is refused: *Cannot check in \"Gaffer tape\": none of its units are out on this booking.*\n\nBoth apply to check-ins from the web and from the [Shelf Companion app](https://www.shelf.nu/mobile-app), since the rule lives on the server."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/pooled-stock-records-which-location-its-units-left-from",
      "url": "https://www.shelf.nu/updates/pooled-stock-records-which-location-its-units-left-from",
      "external_url": "https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables#which-location-the-units-come-from",
      "title": "Pooled Stock Records Which Location Its Units Left From",
      "summary": "For a quantity-tracked asset kept at two or more locations, assigning custody, checking out on a booking and adjusting stock now ask which location the units come from, so used-up units come off the right place and placements stop drifting.",
      "content_html": "<p>A <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">quantity-tracked asset</a> can be kept at several locations at once: 60 cables in the stockroom, 40 in the van. Until now, nothing recorded which of those locations a unit came from when it went into someone's custody or out on a booking. When units were used up, Shelf could not tell which location had lost them, so the placements drifted above the total, and a later loss was refused with <em>\"Lower the placements first.\"</em></p>\n<p>Now, for a pool kept at <strong>two or more locations</strong>, Shelf asks once where the units come from and remembers the answer:</p>\n<ul>\n<li><strong>Assign custody</strong> gains a <strong>From location</strong> field, pre-filled with the location that has the most units left. The quantity is capped at what that location has, and asking for more is refused with the numbers: <em>\"Debriefing Room has only 2 pcs.\"</em> The web scanner's <strong>Assign custody</strong> action asks on each such row too.</li>\n<li><strong>Check out</strong> on a booking asks the same question, in a short confirmation on the one-click button or on the pool's row in <strong>Check out selected items</strong> and <strong>Scan to check out</strong>. The booking row then reads <em>from Studio</em> beside its status.</li>\n<li><strong>Adjust</strong> gains an <strong>At location</strong> field: a restock lands there, a loss comes off there.</li>\n<li>The custody list shows the location after each person's quantity, the placements card shows <strong>N in custody</strong> under a location, and a location's <strong>Assets</strong> tab reads <em>· 40 pcs at this location · 10 on a booking</em>.</li>\n<li><strong>Release</strong>, <strong>Mark as consumed</strong> and check-in take used-up units off the location they came from, so the counts stay true without a correction afterwards. Returned units change no placement.</li>\n</ul>\n<p>A pool kept at one location, with or without unplaced units, and every individually tracked asset look and behave exactly as before. Holds recorded before this read <em>location not recorded</em> on the custody list.</p>\n<p>The <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion app</a> does not ask yet. A check-out from the phone records the location with the most units left, and a custody assignment from the phone is recorded without a location.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/custody-source-assign-dialog.webp",
      "date_published": "2026-10-07T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "A [quantity-tracked asset](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables) can be kept at several locations at once: 60 cables in the stockroom, 40 in the van. Until now, nothing recorded which of those locations a unit came from when it went into someone's custody or out on a booking. When units were used up, Shelf could not tell which location had lost them, so the placements drifted above the total, and a later loss was refused with *\"Lower the placements first.\"*\n\nNow, for a pool kept at **two or more locations**, Shelf asks once where the units come from and remembers the answer:\n\n- **Assign custody** gains a **From location** field, pre-filled with the location that has the most units left. The quantity is capped at what that location has, and asking for more is refused with the numbers: *\"Debriefing Room has only 2 pcs.\"* The web scanner's **Assign custody** action asks on each such row too.\n- **Check out** on a booking asks the same question, in a short confirmation on the one-click button or on the pool's row in **Check out selected items** and **Scan to check out**. The booking row then reads *from Studio* beside its status.\n- **Adjust** gains an **At location** field: a restock lands there, a loss comes off there.\n- The custody list shows the location after each person's quantity, the placements card shows **N in custody** under a location, and a location's **Assets** tab reads *· 40 pcs at this location · 10 on a booking*.\n- **Release**, **Mark as consumed** and check-in take used-up units off the location they came from, so the counts stay true without a correction afterwards. Returned units change no placement.\n\nA pool kept at one location, with or without unplaced units, and every individually tracked asset look and behave exactly as before. Holds recorded before this read *location not recorded* on the custody list.\n\nThe [Shelf Companion app](https://www.shelf.nu/mobile-app) does not ask yet. A check-out from the phone records the location with the most units left, and a custody assignment from the phone is recorded without a location."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/existing-accounts-move-to-sso",
      "url": "https://www.shelf.nu/updates/existing-accounts-move-to-sso",
      "external_url": "https://www.shelf.nu/knowledge-base/sso-with-google-workspace#moving-existing-accounts-to-sso",
      "title": "Existing Accounts Move to SSO Without Losing Anything",
      "summary": "A team that adopts single sign-on no longer has to delete and recreate the Shelf accounts it already has. Each account is converted and keeps its custody, bookings and history. Once SSO is live on a domain, password and one-time code login are refused there.",
      "content_html": "<p>Until now, a team that already used Shelf with email and password accounts had an unpleasant step on the way to single sign-on: those accounts had to be removed, and an existing account that tried SSO was refused and sent to support. Deleting an account meant losing what it held, including its custody records, bookings, notes and report history.</p>\n<p>That step is gone. Shelf staff now <strong>convert</strong> existing standard accounts to SSO, one at a time or every eligible account on the domain at once. A converted account keeps its identity and its workspace memberships; only the login method changes. The person is signed out everywhere, and their first SSO sign-in lands in the account they already had. Nothing changes in your identity provider.</p>\n<p>Two rules come with it:</p>\n<ul>\n<li><strong>Once SSO is live for your domain, password, one-time code and password reset login are refused there</strong>, in the web app and in the Shelf Companion app. The login screens point to <strong>Login with SSO</strong>, and someone still signed in with a password is signed out on their next page load. Those hints depend only on the domain, so they never reveal whether a particular account exists.</li>\n<li><strong>The owner of the workspace that uses SSO can keep password login</strong> as the administrative fallback for a day your identity provider is unavailable. Converting the owner is optional and done on request. An owner who signs in with SSO keeps the Owner role whatever their groups say.</li>\n</ul>\n<p>If you want to pilot SSO with a few users before everyone is converted, Shelf can relax SSO-only login for the domain during setup. Keeping password and SSO users side by side for good, apart from the owner, is still not supported.</p>",
      "image": "https://www.shelf.nu/images/updates/improved-team-management.jpg",
      "date_published": "2026-10-06T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Until now, a team that already used Shelf with email and password accounts had an unpleasant step on the way to single sign-on: those accounts had to be removed, and an existing account that tried SSO was refused and sent to support. Deleting an account meant losing what it held, including its custody records, bookings, notes and report history.\n\nThat step is gone. Shelf staff now **convert** existing standard accounts to SSO, one at a time or every eligible account on the domain at once. A converted account keeps its identity and its workspace memberships; only the login method changes. The person is signed out everywhere, and their first SSO sign-in lands in the account they already had. Nothing changes in your identity provider.\n\nTwo rules come with it:\n\n- **Once SSO is live for your domain, password, one-time code and password reset login are refused there**, in the web app and in the Shelf Companion app. The login screens point to **Login with SSO**, and someone still signed in with a password is signed out on their next page load. Those hints depend only on the domain, so they never reveal whether a particular account exists.\n- **The owner of the workspace that uses SSO can keep password login** as the administrative fallback for a day your identity provider is unavailable. Converting the owner is optional and done on request. An owner who signs in with SSO keeps the Owner role whatever their groups say.\n\nIf you want to pilot SSO with a few users before everyone is converted, Shelf can relax SSO-only login for the domain during setup. Keeping password and SSO users side by side for good, apart from the owner, is still not supported."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/companion-scan-units-into-custody-and-check-in-what-went-out",
      "url": "https://www.shelf.nu/updates/companion-scan-units-into-custody-and-check-in-what-went-out",
      "external_url": "https://www.shelf.nu/knowledge-base/shelf-ios-companion-getting-started",
      "title": "Shelf Companion: Scan Units Into Custody, Check In What Went Out",
      "summary": "A phone update lets the custody scanner hand out and take back units of quantity-tracked assets, offers check-in only for units that actually left, keeps model reservations editable within their limits, and names the phone behind each scan.",
      "content_html": "<p>An over-the-air update went out to <strong>Shelf Companion</strong> on iPhone and Android on 2 October 2026. The version number stays <strong>1.5.0</strong>. The app picks up an update like this in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.</p>\n<h2>Units in the custody scan</h2>\n<p>The scanner's <strong>Assign custody</strong> and <strong>Release custody</strong> actions now take <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">quantity-tracked assets</a>. Each one gets a unit count on its row, for example <code>3 / 10 pcs</code>. Tap it to change the number. Assign starts at 1 unit and stops at the units that are free. Release starts at every unit held. Individually tracked assets, quantity rows and kits go together with one tap, as on the web scanner.</p>\n<p>Before, the app refused a scan made only of quantity-tracked assets and skipped them in a mixed one. A release scan still works while one person holds units of that asset. If several people do, the row tells you to release it from the asset page. Releasing units of a one-way asset records them as used up, and the confirm says so before you commit. See <a href=\"https://www.shelf.nu/knowledge-base/batch-scanning-actions#assign-custody\">Batch Scanning Actions</a>.</p>\n<h2>Check-in offers only what went out</h2>\n<p>On an ongoing booking, the app used to offer check-in on a kit whose units had never left the shelf. Confirming came back with <em>\"Cannot check in assets that were never checked out\"</em>. It also proposed every booked unit on a line that was only partly out. Now the app offers check-in only for units this booking sent out and has not had back. A kit with 2 of its 4 units out offers 2, and a kit that never left has no tick box and reads <strong>Reserved</strong>.</p>\n<h2>Model reservations on a booking that is out</h2>\n<p>The booking's <strong>Models</strong> tab lets you change a reservation's count after the booking has gone out. The count cannot go below the units already assigned to it. Set it to exactly that number to release everything still unassigned.</p>\n<h2>Which phone made the scan</h2>\n<p>The scan panel on the web asset page used to say <strong>Unknown device</strong> for every scan made in the app. It now names the phone, the app version and the system, for example <strong>Apple - iPhone</strong>, <strong>Shelf app 1.5.0</strong> and <strong>iOS</strong>. Scans from an app that has not taken the update still read <strong>Unknown device</strong>.</p>",
      "image": "https://www.shelf.nu/images/updates/shelf-mobile-app.jpg",
      "date_published": "2026-10-05T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "An over-the-air update went out to **Shelf Companion** on iPhone and Android on 2 October 2026. The version number stays **1.5.0**. The app picks up an update like this in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.\n\n## Units in the custody scan\n\nThe scanner's **Assign custody** and **Release custody** actions now take [quantity-tracked assets](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables). Each one gets a unit count on its row, for example `3 / 10 pcs`. Tap it to change the number. Assign starts at 1 unit and stops at the units that are free. Release starts at every unit held. Individually tracked assets, quantity rows and kits go together with one tap, as on the web scanner.\n\nBefore, the app refused a scan made only of quantity-tracked assets and skipped them in a mixed one. A release scan still works while one person holds units of that asset. If several people do, the row tells you to release it from the asset page. Releasing units of a one-way asset records them as used up, and the confirm says so before you commit. See [Batch Scanning Actions](https://www.shelf.nu/knowledge-base/batch-scanning-actions#assign-custody).\n\n## Check-in offers only what went out\n\nOn an ongoing booking, the app used to offer check-in on a kit whose units had never left the shelf. Confirming came back with *\"Cannot check in assets that were never checked out\"*. It also proposed every booked unit on a line that was only partly out. Now the app offers check-in only for units this booking sent out and has not had back. A kit with 2 of its 4 units out offers 2, and a kit that never left has no tick box and reads **Reserved**.\n\n## Model reservations on a booking that is out\n\nThe booking's **Models** tab lets you change a reservation's count after the booking has gone out. The count cannot go below the units already assigned to it. Set it to exactly that number to release everything still unassigned.\n\n## Which phone made the scan\n\nThe scan panel on the web asset page used to say **Unknown device** for every scan made in the app. It now names the phone, the app version and the system, for example **Apple - iPhone**, **Shelf app 1.5.0** and **iOS**. Scans from an app that has not taken the update still read **Unknown device**."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/duplicating-a-quantity-tracked-asset-keeps-its-stock",
      "url": "https://www.shelf.nu/updates/duplicating-a-quantity-tracked-asset-keeps-its-stock",
      "external_url": "https://www.shelf.nu/knowledge-base/duplicating-assets-in-shelf",
      "title": "Duplicating a Quantity-Tracked Asset Keeps Its Stock",
      "summary": "A copy of a quantity-tracked asset is now quantity-tracked too, with the same quantity, unit and behaviour, and every copy keeps the original's booking availability.",
      "content_html": "<p>Duplicating a <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">quantity-tracked asset</a> used to create an individually tracked asset with a single unit. Now the copy is quantity-tracked too. It keeps the original's quantity, unit of measure, behaviour (one-way or two-way) and low-stock threshold, and it starts unplaced so you can put its units where they belong with <strong>Place them</strong>.</p>\n<p>Every copy now also keeps whether the original is available for booking, and a copy of an individually tracked asset keeps its asset model. A quantity-tracked asset with no units in stock cannot be copied, and the dialog says so before you submit. If one of several copies fails, Shelf removes the copies it already made. Several copies are named \"(copy 1)\", \"(copy 2)\" and so on. A single copy is named \"(copy)\".</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/duplicate-asset-2.webp",
      "date_published": "2026-10-05T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Duplicating a [quantity-tracked asset](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables) used to create an individually tracked asset with a single unit. Now the copy is quantity-tracked too. It keeps the original's quantity, unit of measure, behaviour (one-way or two-way) and low-stock threshold, and it starts unplaced so you can put its units where they belong with **Place them**.\n\nEvery copy now also keeps whether the original is available for booking, and a copy of an individually tracked asset keeps its asset model. A quantity-tracked asset with no units in stock cannot be copied, and the dialog says so before you submit. If one of several copies fails, Shelf removes the copies it already made. Several copies are named \"(copy 1)\", \"(copy 2)\" and so on. A single copy is named \"(copy)\"."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/asset-model-view",
      "url": "https://www.shelf.nu/updates/asset-model-view",
      "external_url": "https://www.shelf.nu/knowledge-base/advanced-asset-index-complete-guide#asset-model-view",
      "title": "See Your Assets by Model, and Book From There",
      "summary": "The advanced asset index has a third view that lists asset models instead of assets, counted over your current filters, with each model's units one click away and a Book selection button that reserves models on a new or open booking.",
      "content_html": "<p>The advanced asset index now has an <strong>Asset model view</strong>, next to the list and availability views. It lists your <a href=\"https://www.shelf.nu/glossary/asset-models\">asset models</a> instead of individual assets: for each model, how many of the assets matching your filters carry it, where they are right now (in, out, in custody, plus how many are not bookable) and their total value. Your filters, saved filters and search all apply (except <strong>Low stock only</strong>, which the view clears), so filtering to one location tells you which models you have there and how many. Assets without a model sit together in a <strong>No model</strong> row at the bottom, which is a handy place to start grouping a fleet.</p>\n<p>Click a model's count to open a side panel with the assets behind it, in the columns you have set up for the list. Tick one or more models and use <strong>Book selection</strong> to create a booking that reserves units of them, or to add them to an open booking, with the number still free for that booking's dates shown beside each model.</p>\n<p>The view counts individually tracked assets only, because asset models do not cover quantity-tracked stock.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/asset-model-view.webp",
      "date_published": "2026-09-30T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "The advanced asset index now has an **Asset model view**, next to the list and availability views. It lists your [asset models](https://www.shelf.nu/glossary/asset-models) instead of individual assets: for each model, how many of the assets matching your filters carry it, where they are right now (in, out, in custody, plus how many are not bookable) and their total value. Your filters, saved filters and search all apply (except **Low stock only**, which the view clears), so filtering to one location tells you which models you have there and how many. Assets without a model sit together in a **No model** row at the bottom, which is a handy place to start grouping a fleet.\n\nClick a model's count to open a side panel with the assets behind it, in the columns you have set up for the list. Tick one or more models and use **Book selection** to create a booking that reserves units of them, or to add them to an open booking, with the number still free for that booking's dates shown beside each model.\n\nThe view counts individually tracked assets only, because asset models do not cover quantity-tracked stock."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/scan-to-assign-shows-what-is-left-to-pull",
      "url": "https://www.shelf.nu/updates/scan-to-assign-shows-what-is-left-to-pull",
      "external_url": "https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#scan-to-assign-shows-what-is-left-to-pull",
      "title": "Scan to Assign Shows What Is Left to Pull",
      "summary": "The booking scanner behind Scan to assign now shows each reserved model's progress and a Pending row for every unit still to pull, so you can work through a model reservation without keeping the numbers in your head.",
      "content_html": "<p>When a booking reserves gear by <a href=\"https://www.shelf.nu/glossary/asset-models\">asset model</a>, <strong>Scan to assign</strong> used to open a scanner that said nothing about the reservation: you scanned, and kept track of what was still missing yourself. It now shows the same progress as the check-out scanner. A summary line such as <strong>2 models reserved</strong>, with a <strong>3 / 6</strong> count and a progress bar, folds out into one bar per model. Underneath, every unit still to pull has its own <strong>Pending</strong> row, named after its model, and each matching scan moves the count and clears a row.</p>\n<p>You can stop part way. Submitting a scan that covers only some of the reservation saves what you scanned and leaves the rest open, and the counts pick up from there next time. A unit that was already on the booking, without answering a reservation, can also be scanned here to count toward its model.</p>",
      "image": "https://www.shelf.nu/images/updates/add-assets-to-bookings.jpg",
      "date_published": "2026-09-30T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "When a booking reserves gear by [asset model](https://www.shelf.nu/glossary/asset-models), **Scan to assign** used to open a scanner that said nothing about the reservation: you scanned, and kept track of what was still missing yourself. It now shows the same progress as the check-out scanner. A summary line such as **2 models reserved**, with a **3 / 6** count and a progress bar, folds out into one bar per model. Underneath, every unit still to pull has its own **Pending** row, named after its model, and each matching scan moves the count and clears a row.\n\nYou can stop part way. Submitting a scan that covers only some of the reservation saves what you scanned and leaves the rest open, and the counts pick up from there next time. A unit that was already on the booking, without answering a reservation, can also be scanned here to count toward its model."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/importing-users-checks-the-whole-file-first",
      "url": "https://www.shelf.nu/updates/importing-users-checks-the-whole-file-first",
      "external_url": "https://www.shelf.nu/knowledge-base/inviting-users-via-csv-upload#the-whole-file-is-checked-first",
      "title": "Importing Users Checks the Whole File First",
      "summary": "A users CSV is now checked row by row before anyone is invited. A file with a problem invites nobody and lists the problem rows, and roles no longer have to be typed in capitals.",
      "content_html": "<p><strong>Settings → Team → Import Users</strong> now works the same way as the asset import: Shelf reads the whole file before it invites anyone. If any row has a problem, <strong>nobody is invited</strong>, and the dialog lists the problems in a <strong>Row / Problem</strong> table with your spreadsheet's row numbers, up to 100 at a time. Fix the rows and upload the file again, with nothing to clean up first.</p>\n<p>The check covers roles, email addresses, an address that appears twice (in any capitals), a <code>teamMemberId</code> that appears twice or does not belong to this workspace, and addresses that SSO does not allow inviting. A typo in an email column no longer turns into an invite that can never arrive.</p>\n<p>Two smaller changes come with it:</p>\n<ul>\n<li><strong>Roles are not case-sensitive any more.</strong> <code>admin</code>, <code>Admin</code> and <code>ADMIN</code> all work.</li>\n<li><strong>A file takes up to 1,000 users.</strong> Split a larger list and import the parts one at a time.</li>\n</ul>\n<p>People who are already members, or already have a pending invite, are still skipped rather than invited twice, and the rest of the file goes ahead.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/users-csv-import-dialog.webp",
      "date_published": "2026-09-29T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "**Settings → Team → Import Users** now works the same way as the asset import: Shelf reads the whole file before it invites anyone. If any row has a problem, **nobody is invited**, and the dialog lists the problems in a **Row / Problem** table with your spreadsheet's row numbers, up to 100 at a time. Fix the rows and upload the file again, with nothing to clean up first.\n\nThe check covers roles, email addresses, an address that appears twice (in any capitals), a `teamMemberId` that appears twice or does not belong to this workspace, and addresses that SSO does not allow inviting. A typo in an email column no longer turns into an invite that can never arrive.\n\nTwo smaller changes come with it:\n\n- **Roles are not case-sensitive any more.** `admin`, `Admin` and `ADMIN` all work.\n- **A file takes up to 1,000 users.** Split a larger list and import the parts one at a time.\n\nPeople who are already members, or already have a pending invite, are still skipped rather than invited twice, and the rest of the file goes ahead."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/team-trial-from-the-pricing-page-and-who-pays-for-each-workspace",
      "url": "https://www.shelf.nu/updates/team-trial-from-the-pricing-page-and-who-pays-for-each-workspace",
      "external_url": "https://www.shelf.nu/knowledge-base/free-trial",
      "title": "Start a Team Trial From the Pricing Page, and See Who Pays for Each Workspace",
      "summary": "The Team trial button on the pricing page now carries your choice through signup, and the Subscriptions page lists every workspace you belong to with its plan and who pays for it.",
      "content_html": "<p>Two changes to how plans show up in Shelf, one for new accounts and one for everyone.</p>\n<h2>The Team trial you picked is the Team trial you get</h2>\n<p>Clicking <strong>Start Free Trial</strong> on the Team plan on the <a href=\"https://www.shelf.nu/pricing\">pricing page</a> used to take you to a plain signup form. Once your account was ready, Shelf asked again whether you wanted a Personal or a Team workspace, as if you had never chosen.</p>\n<p>Now the signup page confirms the choice in one line under the heading: <em>\"You're starting a Team trial. 7 days, no credit card.\"</em> After you enter the code from your email and finish onboarding, Shelf skips the second question and opens the plan page with the Team trial first. If you change your mind, the link under the plans, <strong>Continue with a free Personal workspace instead</strong>, does the same as choosing Personal.</p>\n<p>A signup without a plan in the link works exactly as before. People who join through a workspace invitation still land in that workspace.</p>\n<h2>Every workspace's plan, in one table</h2>\n<p>The <strong>Subscriptions</strong> page (open it from the menu under your name) now starts with <strong>Your workspaces' plans</strong>. It has one row for each workspace you belong to, with its <strong>Plan</strong>, <strong>Your role</strong>, and <strong>Paid by</strong>.</p>\n<p>A workspace's plan comes from its owner's subscription. So an Administrator in a paid Team workspace used to open this page and read that they were on the free version. The table now shows the Team plan and the owner who pays for it. For other people's workspaces, it shows only the plan name and the owner's name. Their prices, invoices, and add-ons stay private. A free workspace reads <strong>No one</strong> under <strong>Paid by</strong>.</p>\n<p>Below the table, <strong>Billed to you</strong> lists only what you pay for yourself. If you work in someone else's paid workspace and pay for nothing, it offers two options: <strong>Start your own Team workspace</strong> and <strong>Upgrade your personal workspace</strong>. If you sign in through SSO, you have no personal workspace in Shelf, so only the first option appears.</p>",
      "image": "https://www.shelf.nu/images/updates/team-workspaces.jpg",
      "date_published": "2026-09-28T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Two changes to how plans show up in Shelf, one for new accounts and one for everyone.\n\n## The Team trial you picked is the Team trial you get\n\nClicking **Start Free Trial** on the Team plan on the [pricing page](https://www.shelf.nu/pricing) used to take you to a plain signup form. Once your account was ready, Shelf asked again whether you wanted a Personal or a Team workspace, as if you had never chosen.\n\nNow the signup page confirms the choice in one line under the heading: *\"You're starting a Team trial. 7 days, no credit card.\"* After you enter the code from your email and finish onboarding, Shelf skips the second question and opens the plan page with the Team trial first. If you change your mind, the link under the plans, **Continue with a free Personal workspace instead**, does the same as choosing Personal.\n\nA signup without a plan in the link works exactly as before. People who join through a workspace invitation still land in that workspace.\n\n## Every workspace's plan, in one table\n\nThe **Subscriptions** page (open it from the menu under your name) now starts with **Your workspaces' plans**. It has one row for each workspace you belong to, with its **Plan**, **Your role**, and **Paid by**.\n\nA workspace's plan comes from its owner's subscription. So an Administrator in a paid Team workspace used to open this page and read that they were on the free version. The table now shows the Team plan and the owner who pays for it. For other people's workspaces, it shows only the plan name and the owner's name. Their prices, invoices, and add-ons stay private. A free workspace reads **No one** under **Paid by**.\n\nBelow the table, **Billed to you** lists only what you pay for yourself. If you work in someone else's paid workspace and pay for nothing, it offers two options: **Start your own Team workspace** and **Upgrade your personal workspace**. If you sign in through SSO, you have no personal workspace in Shelf, so only the first option appears."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/imports-check-the-whole-file-first",
      "url": "https://www.shelf.nu/updates/imports-check-the-whole-file-first",
      "external_url": "https://www.shelf.nu/knowledge-base/importing-assets-to-shelf-csv-guide#pre-import-validation",
      "title": "Imports Check the Whole File First",
      "summary": "A CSV import now checks every row before it creates anything. A file with problems imports nothing and lists the problems it found, by spreadsheet row.",
      "content_html": "<p>When you import assets from a CSV, Shelf now reads the whole file before it writes anything. If a row has a problem, <strong>nothing is imported</strong>, and the import page lists the problems it found in a <strong>Row / Problem</strong> table, numbered the way your spreadsheet numbers them.</p>\n<p>That changes two things you can rely on:</p>\n<ul>\n<li><strong>Most problems show up in one upload.</strong> A file with a bad quantity on row 4 and an invalid custom field value on row 19 reports both, not just the first. Messages about quantity-tracked rows also name every column such a row needs, so you are not taught the format one upload at a time. The table shows up to 100 problems at a time. QR codes, barcodes and kit custody are checked after that and report one problem at a time, so a file with more than 100 problems, or with problems in those columns, can take another upload.</li>\n<li><strong>A rejected file leaves nothing behind.</strong> No assets, categories, tags, locations, kits, custom fields or asset models are created from it, so you can fix the file and upload it again without cleaning up or creating duplicates.</li>\n</ul>\n<p>Import now takes up to <strong>1,000 assets per file</strong>, the same limit as updating assets by CSV. Split a larger file and import the parts one at a time.</p>",
      "image": "https://www.shelf.nu/images/updates/better-csv-imports.jpg",
      "date_published": "2026-09-25T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "When you import assets from a CSV, Shelf now reads the whole file before it writes anything. If a row has a problem, **nothing is imported**, and the import page lists the problems it found in a **Row / Problem** table, numbered the way your spreadsheet numbers them.\n\nThat changes two things you can rely on:\n\n- **Most problems show up in one upload.** A file with a bad quantity on row 4 and an invalid custom field value on row 19 reports both, not just the first. Messages about quantity-tracked rows also name every column such a row needs, so you are not taught the format one upload at a time. The table shows up to 100 problems at a time. QR codes, barcodes and kit custody are checked after that and report one problem at a time, so a file with more than 100 problems, or with problems in those columns, can take another upload.\n- **A rejected file leaves nothing behind.** No assets, categories, tags, locations, kits, custom fields or asset models are created from it, so you can fix the file and upload it again without cleaning up or creating duplicates.\n\nImport now takes up to **1,000 assets per file**, the same limit as updating assets by CSV. Split a larger file and import the parts one at a time."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/scan-quantity-tracked-assets-into-custody",
      "url": "https://www.shelf.nu/updates/scan-quantity-tracked-assets-into-custody",
      "external_url": "https://www.shelf.nu/knowledge-base/batch-scanning-actions#assign-custody",
      "title": "Scan Quantity-Tracked Assets Into and Out of Custody",
      "summary": "The scanner's Assign custody and Release custody actions now take quantity-tracked assets, with a quantity field on each scanned row.",
      "content_html": "<p>You can now scan <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">quantity-tracked assets</a> with the scanner's <strong>Assign custody</strong> and <strong>Release custody</strong> actions, alongside individually tracked ones.</p>\n<p>Each scanned pool gets a <strong>Qty</strong> field. When assigning, it goes up to the units that are free to hand over, so units already with someone, in a kit or out on a booking are never offered twice. When releasing, it goes up to the units held in custody, so you can take back part of a hold.</p>\n<p>A pool with some units out no longer blocks the scan. Before, scanning one refused it as \"checked out\" or \"in custody\" as soon as a single unit was, even with most of the stock on the shelf. Now a pool is only blocked when it has nothing to give: no free units to assign, or no units in custody to release.</p>\n<p>A release scan takes units back from whoever holds them, so it works while one person holds units of that asset. If several people do, release from the asset's custody list, where each holder has a row.</p>\n<p>The quantity field is in the scanner on the web. The Shelf Companion app's batch custody scanner does not ask for a quantity yet.</p>",
      "image": "https://www.shelf.nu/images/updates/improved-qr-scanner.jpg",
      "date_published": "2026-09-25T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "You can now scan [quantity-tracked assets](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables) with the scanner's **Assign custody** and **Release custody** actions, alongside individually tracked ones.\n\nEach scanned pool gets a **Qty** field. When assigning, it goes up to the units that are free to hand over, so units already with someone, in a kit or out on a booking are never offered twice. When releasing, it goes up to the units held in custody, so you can take back part of a hold.\n\nA pool with some units out no longer blocks the scan. Before, scanning one refused it as \"checked out\" or \"in custody\" as soon as a single unit was, even with most of the stock on the shelf. Now a pool is only blocked when it has nothing to give: no free units to assign, or no units in custody to release.\n\nA release scan takes units back from whoever holds them, so it works while one person holds units of that asset. If several people do, release from the asset's custody list, where each holder has a row.\n\nThe quantity field is in the scanner on the web. The Shelf Companion app's batch custody scanner does not ask for a quantity yet."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/a-kit-can-answer-a-model-reservation",
      "url": "https://www.shelf.nu/updates/a-kit-can-answer-a-model-reservation",
      "external_url": "https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#a-unit-inside-a-kit-counts-too",
      "title": "A Kit Can Answer a Model Reservation",
      "summary": "A unit that arrives inside a kit now settles a reserved model unit, just as a loose one does — and the Fulfil reservations & check out scanner takes kit scans.",
      "content_html": "<p>A booking can reserve a count of an <a href=\"https://www.shelf.nu/glossary/asset-models\">Asset Model</a> — \"4 × Canon EOS R5\" — without naming units, and those reserved units are settled by putting matching assets on the booking. Until now only a unit picked on its own counted. Anything that arrived inside a <a href=\"https://www.shelf.nu/knowledge-base/kits\">kit</a> settled nothing.</p>\n<p>That read wrong on both sides of the calendar. Your own booking said <em>\"2 of 3 units still to assign\"</em> with the third camera physically on it, inside a case. And every other booking on those dates saw one fewer unit of that model than the workspace owns, because the kit's camera was already held against them while your reservation went on demanding a replacement for it.</p>\n<h2>A camera in a case is the same camera</h2>\n<p>A unit answers a reservation whichever way it arrives: picked loose, or carried in by a kit you added from the <strong>Kits</strong> tab in <strong>Manage assets</strong>, the kit page's <strong>Add to booking</strong>, the kit picker on a new booking, or a scan. Each physical unit answers <strong>at most one reserved unit per booking</strong>, so nothing is counted twice.</p>\n<p>Rows that answered a reservation now say which one. A booking asset row that discharged a reserved unit carries a blue <strong>Fulfils <em>model name</em></strong> chip — the piece that was missing when the unit arrived inside a kit and a number moved somewhere else on the page with nothing to connect it to.</p>\n<h2>Kits in the fulfil scanner</h2>\n<p>A <strong>Reserved</strong> booking with units still to assign opens <strong>Check out</strong> into the <strong>Fulfil reservations &#x26; check out</strong> scanner. That scanner used to turn every kit away. It takes them now: a scanned kit goes on the booking whole, its matching members assign outstanding reserved units on the way, and the kit's row says how many it settles, for example <strong>Assigns 2 reserved units</strong>. The rule is the server's, so it reaches the <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> app on your phone at the same time, with nothing to install.</p>\n<p>What that scanner does refuse is a loose scan of a unit that belongs to a kit nobody scanned — <em>\"Canon EOS R5 #0042\" belongs to a kit, so it can't go out on its own.</em> Sending one member of a case into the field on its own is almost never what the operator meant. Scan the kit to take all of it, or scan another unit of the same model.</p>\n<h2>One thing to know</h2>\n<p>Kits that were <strong>already on a booking</strong> are not settled retroactively — only a kit that arrives from now on answers a reservation. If a booking has been sitting with a kit on it and a reservation still open, take the kit off and add it again.</p>",
      "image": "https://www.shelf.nu/images/updates/kits-bookings-integration.jpg",
      "date_published": "2026-09-23T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "A booking can reserve a count of an [Asset Model](https://www.shelf.nu/glossary/asset-models) — \"4 × Canon EOS R5\" — without naming units, and those reserved units are settled by putting matching assets on the booking. Until now only a unit picked on its own counted. Anything that arrived inside a [kit](https://www.shelf.nu/knowledge-base/kits) settled nothing.\n\nThat read wrong on both sides of the calendar. Your own booking said *\"2 of 3 units still to assign\"* with the third camera physically on it, inside a case. And every other booking on those dates saw one fewer unit of that model than the workspace owns, because the kit's camera was already held against them while your reservation went on demanding a replacement for it.\n\n## A camera in a case is the same camera\n\nA unit answers a reservation whichever way it arrives: picked loose, or carried in by a kit you added from the **Kits** tab in **Manage assets**, the kit page's **Add to booking**, the kit picker on a new booking, or a scan. Each physical unit answers **at most one reserved unit per booking**, so nothing is counted twice.\n\nRows that answered a reservation now say which one. A booking asset row that discharged a reserved unit carries a blue **Fulfils _model name_** chip — the piece that was missing when the unit arrived inside a kit and a number moved somewhere else on the page with nothing to connect it to.\n\n## Kits in the fulfil scanner\n\nA **Reserved** booking with units still to assign opens **Check out** into the **Fulfil reservations & check out** scanner. That scanner used to turn every kit away. It takes them now: a scanned kit goes on the booking whole, its matching members assign outstanding reserved units on the way, and the kit's row says how many it settles, for example **Assigns 2 reserved units**. The rule is the server's, so it reaches the [Shelf Companion](https://www.shelf.nu/mobile-app) app on your phone at the same time, with nothing to install.\n\nWhat that scanner does refuse is a loose scan of a unit that belongs to a kit nobody scanned — *\"Canon EOS R5 #0042\" belongs to a kit, so it can't go out on its own.* Sending one member of a case into the field on its own is almost never what the operator meant. Scan the kit to take all of it, or scan another unit of the same model.\n\n## One thing to know\n\nKits that were **already on a booking** are not settled retroactively — only a kit that arrives from now on answers a reservation. If a booking has been sitting with a kit on it and a reservation still open, take the kit off and add it again."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/check-out-what-is-ready-when-units-are-unassigned",
      "url": "https://www.shelf.nu/updates/check-out-what-is-ready-when-units-are-unassigned",
      "external_url": "https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#checking-out-while-units-are-still-unassigned",
      "title": "Check Out What Is Ready, Whatever Is Still Unassigned",
      "summary": "A booking that reserves gear by Asset Model can now be checked out with reserved units still unassigned, and a reservation can be adjusted or released for as long as the booking is live.",
      "content_html": "<p>If your team reserves gear by <a href=\"https://www.shelf.nu/glossary/asset-models\">Asset Model</a>, one unit you cannot find used to stop the whole booking. A reservation for four projectors that only found three refused the check-out, and the only way through was to delete a reservation the operator had correctly made.</p>\n<p>Two changes fix that, and they are two halves of the same job.</p>\n<h2>A check-out needs one item to go out, and nothing more</h2>\n<p>Reserved units nobody has assigned yet no longer block a check-out. Shelf names them before it acts:</p>\n<blockquote>\n<p><strong>Some reserved units aren't assigned</strong></p>\n<p>2 × Dell Latitude and 1 × HP LaserJet are not assigned yet. They stay on the booking so you can scan them later or release them.</p>\n</blockquote>\n<p>Confirm, and the booking goes <strong>Ongoing</strong> with the items that are ready. The open reservations stay on the booking, to be scanned in later or handed back. The same confirmation covers <strong>Actions → Check out selected items</strong>, and when the check-out is also early, both questions are asked in one dialog rather than two stacked ones.</p>\n<p>A booking made entirely of reservations still cannot go Ongoing, because nothing would leave.</p>\n<p>The rule now reads the same on the web, in the mobile API, and in the <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> app, where <strong>Check Out All</strong>, <strong>Select to Check Out</strong> and both scanners confirm the unassigned units instead of refusing them.</p>\n<h2>A reservation stays adjustable while the booking is out</h2>\n<p>Reserved quantities could previously only be changed while the booking was Draft or Reserved, and only from the <strong>Models</strong> tab inside <strong>Manage assets</strong>. Once the booking was checked out, the quantity was frozen — so a unit that turned out to be damaged, lost, or was never collected stayed reserved for the rest of the booking and kept counting against every other booking whose window overlapped.</p>\n<p>Now the reservation row's menu carries <strong>Adjust quantity</strong> on <strong>Draft, Reserved, Ongoing and Overdue</strong> bookings, with a one-click <strong>Release the N units still unassigned</strong>. Two limits hold at every status: a reservation never drops below the units already assigned to it, and a reservation with assigned units is reduced rather than removed, so the record of how those assets reached the booking survives.</p>\n<p>Lowering a reservation is no longer measured against availability. Giving units back cannot need headroom, and checking anyway refused the case that mattered most: a booking holding more units than the pool still contains could not release anything at all.</p>\n<p>The row menu's first item now reads <strong>Assign from list</strong>, so all three actions fit on one line.</p>\n<h2>Also in this release</h2>\n<p>Under the workspace's <a href=\"https://www.shelf.nu/knowledge-base/require-explicit-check-in-and-check-out\">explicit check-out requirement</a>, scanning an item that is already on the booking checks that item out. It used to be turned away as a duplicate and dropped from the payload, which left covered roles with no way to send those items out from the fulfil screen.</p>\n<p>On the phone, the app's model manager was already offered on Ongoing and Overdue bookings while the server refused every edit made there. It starts working with this change, on the copy of the app you already have, because the rule is enforced on the server. The matching floor on the phone's quantity stepper, which stops you typing a number below the units already assigned, arrives with the next phone update; until then the server is what refuses it.</p>",
      "image": "https://www.shelf.nu/images/updates/add-assets-to-bookings.jpg",
      "date_published": "2026-09-22T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "If your team reserves gear by [Asset Model](https://www.shelf.nu/glossary/asset-models), one unit you cannot find used to stop the whole booking. A reservation for four projectors that only found three refused the check-out, and the only way through was to delete a reservation the operator had correctly made.\n\nTwo changes fix that, and they are two halves of the same job.\n\n## A check-out needs one item to go out, and nothing more\n\nReserved units nobody has assigned yet no longer block a check-out. Shelf names them before it acts:\n\n> **Some reserved units aren't assigned**\n>\n> 2 × Dell Latitude and 1 × HP LaserJet are not assigned yet. They stay on the booking so you can scan them later or release them.\n\nConfirm, and the booking goes **Ongoing** with the items that are ready. The open reservations stay on the booking, to be scanned in later or handed back. The same confirmation covers **Actions → Check out selected items**, and when the check-out is also early, both questions are asked in one dialog rather than two stacked ones.\n\nA booking made entirely of reservations still cannot go Ongoing, because nothing would leave.\n\nThe rule now reads the same on the web, in the mobile API, and in the [Shelf Companion](https://www.shelf.nu/mobile-app) app, where **Check Out All**, **Select to Check Out** and both scanners confirm the unassigned units instead of refusing them.\n\n## A reservation stays adjustable while the booking is out\n\nReserved quantities could previously only be changed while the booking was Draft or Reserved, and only from the **Models** tab inside **Manage assets**. Once the booking was checked out, the quantity was frozen — so a unit that turned out to be damaged, lost, or was never collected stayed reserved for the rest of the booking and kept counting against every other booking whose window overlapped.\n\nNow the reservation row's menu carries **Adjust quantity** on **Draft, Reserved, Ongoing and Overdue** bookings, with a one-click **Release the N units still unassigned**. Two limits hold at every status: a reservation never drops below the units already assigned to it, and a reservation with assigned units is reduced rather than removed, so the record of how those assets reached the booking survives.\n\nLowering a reservation is no longer measured against availability. Giving units back cannot need headroom, and checking anyway refused the case that mattered most: a booking holding more units than the pool still contains could not release anything at all.\n\nThe row menu's first item now reads **Assign from list**, so all three actions fit on one line.\n\n## Also in this release\n\nUnder the workspace's [explicit check-out requirement](https://www.shelf.nu/knowledge-base/require-explicit-check-in-and-check-out), scanning an item that is already on the booking checks that item out. It used to be turned away as a duplicate and dropped from the payload, which left covered roles with no way to send those items out from the fulfil screen.\n\nOn the phone, the app's model manager was already offered on Ongoing and Overdue bookings while the server refused every edit made there. It starts working with this change, on the copy of the app you already have, because the rule is enforced on the server. The matching floor on the phone's quantity stepper, which stops you typing a number below the units already assigned, arrives with the next phone update; until then the server is what refuses it."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/companion-your-code-your-holder-and-a-camera-that-wakes-up",
      "url": "https://www.shelf.nu/updates/companion-your-code-your-holder-and-a-camera-that-wakes-up",
      "external_url": "https://www.shelf.nu/knowledge-base/shelf-ios-companion-getting-started",
      "title": "Shelf Companion: Your Code, Your Holder, and a Camera That Wakes Up",
      "summary": "A phone update brings the workspace's own code to asset and kit screens, names who holds an asset through a booking, wakes the paused camera on any tap, and stops a failed save from throwing your numbers away.",
      "content_html": "<p>An over-the-air update went out to <strong>Shelf Companion</strong> on iPhone and Android on 21 September 2026. The version number stays <strong>1.5.0</strong> — the app picks an update like this up in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.</p>\n<h2>The code your workspace actually labels things with</h2>\n<p>Asset and kit screens now carry a <strong>Codes</strong> card that leads with the identifier your workspace chose in its code display preference — the Shelf QR, the SAM ID, or one of the item's registered barcodes — instead of always leading with the Shelf QR. An item that overrides the workspace choice for itself wins over it, and when there is more than one code the card's selector switches between them.</p>\n<p>If the preferred code cannot be shown because the item does not carry one, the card says so plainly: <em>\"Your workspace prefers Code 128 but this item has no Code 128.\"</em> The app never words that itself; the server, which knows the preference, sends the sentence.</p>\n<p>Asset list rows print the same resolved code under the name, so a row can be matched against a physical label without opening it. Registered barcodes need the <a href=\"https://www.shelf.nu/knowledge-base/alternative-barcodes\">barcodes add-on</a>.</p>\n<h2>Who is holding it, and through what</h2>\n<p>An individually tracked asset that is out on a booking now names its holder on the detail screen: an <strong>In Custody Of</strong> row, a <strong>Via Booking</strong> row, and a <strong>Since</strong> row. It is the phone's form of the custody card the web asset page has always shown. Tap the booking row to open it, where your role may open that booking. Who sees these rows follows the workspace's <a href=\"https://www.shelf.nu/knowledge-base/configure-what-self-service-and-base-users-can-see\">custody visibility</a> rules.</p>\n<h2>A camera that wakes on any tap</h2>\n<p>The scanner pauses itself after about thirty seconds without a scan. Waking it used to take a tap on the small play button, because the strips across the top and bottom of the view swallowed everything else. Now a tap anywhere that is not a control brings the camera straight back.</p>\n<p><strong>Enter code</strong> moved with it. The manual-entry field opens in the strip at the top of the camera view with the keyboard already up, so one tap is enough to start typing. It used to open at the bottom, where the keyboard covered it.</p>\n<h2>A failed save no longer costs you the numbers</h2>\n<p>The sheets that take numbers — adjust quantity, the check-in disposition split, and Manage Placements — closed the moment you tapped save. A save the server then refused took your numbers with it. They now stay open with the error and everything you entered still in place, ready to correct and send again.</p>\n<h2>Kits counted as kits</h2>\n<p>The button on a booking's selection has always counted a wholly picked kit as one thing — <strong>Check Out 1 Kit &#x26; 1 Asset</strong>. The question underneath it counted the kit's members, so the same pick asked <em>\"Check out 4 selected assets?\"</em>. Both now speak the same language: <em>\"Check out 1 kit and 1 asset?\"</em>, then <em>\"1 kit and 1 asset checked out. The rest is still reserved.\"</em> This holds on the booking screen and in the scanner's check-out and check-in drawers.</p>\n<p>A kit the current mode cannot act on now shows <strong>no tick box at all</strong>, the way an asset in that state already did — a kit that is already out while you Select to Check Out, or one that is not out yet while you Select to Check In. The row keeps its place, so the list stays lined up, and tapping it still opens the kit.</p>\n<h2>Smaller things</h2>\n<ul>\n<li><strong>Check out what is ready.</strong> Reserved model units nobody has assigned yet no longer refuse a check-out on the phone. Check Out All, Select to Check Out and both scanners name the open units and ask you to confirm, then send out what is ready and leave the reservations open. This matches <a href=\"https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#checking-out-while-units-are-still-unassigned\">the same change on the web</a>.</li>\n<li><strong>A readable date picker on iPhone.</strong> The inline picker follows the app's own <strong>Settings ▸ Appearance</strong> rather than the phone's, so a mismatched pair is no longer dark-on-dark or white-on-white. Android was already readable and is unchanged.</li>\n</ul>",
      "image": "https://www.shelf.nu/images/updates/shelf-mobile-app.jpg",
      "date_published": "2026-09-22T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "An over-the-air update went out to **Shelf Companion** on iPhone and Android on 21 September 2026. The version number stays **1.5.0** — the app picks an update like this up in the background when you open it and uses it the next time you open it, so there is nothing to fetch from the store.\n\n## The code your workspace actually labels things with\n\nAsset and kit screens now carry a **Codes** card that leads with the identifier your workspace chose in its code display preference — the Shelf QR, the SAM ID, or one of the item's registered barcodes — instead of always leading with the Shelf QR. An item that overrides the workspace choice for itself wins over it, and when there is more than one code the card's selector switches between them.\n\nIf the preferred code cannot be shown because the item does not carry one, the card says so plainly: *\"Your workspace prefers Code 128 but this item has no Code 128.\"* The app never words that itself; the server, which knows the preference, sends the sentence.\n\nAsset list rows print the same resolved code under the name, so a row can be matched against a physical label without opening it. Registered barcodes need the [barcodes add-on](https://www.shelf.nu/knowledge-base/alternative-barcodes).\n\n## Who is holding it, and through what\n\nAn individually tracked asset that is out on a booking now names its holder on the detail screen: an **In Custody Of** row, a **Via Booking** row, and a **Since** row. It is the phone's form of the custody card the web asset page has always shown. Tap the booking row to open it, where your role may open that booking. Who sees these rows follows the workspace's [custody visibility](https://www.shelf.nu/knowledge-base/configure-what-self-service-and-base-users-can-see) rules.\n\n## A camera that wakes on any tap\n\nThe scanner pauses itself after about thirty seconds without a scan. Waking it used to take a tap on the small play button, because the strips across the top and bottom of the view swallowed everything else. Now a tap anywhere that is not a control brings the camera straight back.\n\n**Enter code** moved with it. The manual-entry field opens in the strip at the top of the camera view with the keyboard already up, so one tap is enough to start typing. It used to open at the bottom, where the keyboard covered it.\n\n## A failed save no longer costs you the numbers\n\nThe sheets that take numbers — adjust quantity, the check-in disposition split, and Manage Placements — closed the moment you tapped save. A save the server then refused took your numbers with it. They now stay open with the error and everything you entered still in place, ready to correct and send again.\n\n## Kits counted as kits\n\nThe button on a booking's selection has always counted a wholly picked kit as one thing — **Check Out 1 Kit & 1 Asset**. The question underneath it counted the kit's members, so the same pick asked *\"Check out 4 selected assets?\"*. Both now speak the same language: *\"Check out 1 kit and 1 asset?\"*, then *\"1 kit and 1 asset checked out. The rest is still reserved.\"* This holds on the booking screen and in the scanner's check-out and check-in drawers.\n\nA kit the current mode cannot act on now shows **no tick box at all**, the way an asset in that state already did — a kit that is already out while you Select to Check Out, or one that is not out yet while you Select to Check In. The row keeps its place, so the list stays lined up, and tapping it still opens the kit.\n\n## Smaller things\n\n- **Check out what is ready.** Reserved model units nobody has assigned yet no longer refuse a check-out on the phone. Check Out All, Select to Check Out and both scanners name the open units and ask you to confirm, then send out what is ready and leave the reservations open. This matches [the same change on the web](https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#checking-out-while-units-are-still-unassigned).\n- **A readable date picker on iPhone.** The inline picker follows the app's own **Settings ▸ Appearance** rather than the phone's, so a mismatched pair is no longer dark-on-dark or white-on-white. Android was already readable and is unchanged."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/invite-emails-match-whatever-the-capitals-are",
      "url": "https://www.shelf.nu/updates/invite-emails-match-whatever-the-capitals-are",
      "external_url": "https://www.shelf.nu/knowledge-base/inviting-users-via-csv-upload",
      "title": "Invite Emails Match Whatever the Capitals Are",
      "summary": "An invite made by CSV import no longer refuses the person it was sent to. Email addresses are compared without regard to letter case everywhere an invite is created, found, accepted, resent or cancelled.",
      "content_html": "<p>An email address means the same person however it is typed. Shelf now treats it that way throughout the invite flow.</p>\n<h2>The bug people actually hit</h2>\n<p>The <a href=\"https://www.shelf.nu/knowledge-base/inviting-users-via-csv-upload\">CSV user import</a> stored an address exactly as the spreadsheet had it, capitals and all — <code>First.Last@company.com</code>. Accounts are stored in lower case. So when the invited person opened their link while signed in, Shelf compared the two, found them different, and refused with <strong>\"Wrong user\"</strong>. Opening the link signed out gave an error page rather than joining, for anyone who already had a Shelf account.</p>\n<p>The single \"Invite a user\" dialog already lowercased the address, so only invites made by CSV import carried capitals. That is a large share of the invites big teams send.</p>\n<h2>What changed</h2>\n<p>The import stores addresses in lower case, trimmed of stray spaces. And every place an invite email is compared — the member check, the earlier-invite lookup, the pending-invite check, the account found on acceptance, cancel, and resend — now ignores letter case.</p>\n<p>Three side effects go with it:</p>\n<ul>\n<li>A new invite for someone whose earlier invite carried capitals <strong>reuses their existing team member</strong> instead of creating a second one, so the person keeps the record that holds their history.</li>\n<li>A CSV that lists <strong>one address twice in different capitals</strong> creates one invite, not two.</li>\n<li>A CSV row for someone <strong>already in the workspace</strong> under different capitals is skipped, rather than inviting them again.</li>\n</ul>\n<p>A re-send now closes every earlier invite for that person <strong>before</strong> it issues the new one. The two steps used to run at the same time, so a slow invalidation could close the invite that had just been created.</p>\n<h2>Nothing to do on your side</h2>\n<p>Invites already stored with capital letters work as they are. There is no data change, no backfill, and nothing to re-send. If someone was stuck on \"Wrong user\", ask them to open their existing link again.</p>\n<p>The team member's <strong>name</strong> still comes from the address exactly as you typed it in the CSV, because that name becomes the first name of the account created when the person accepts.</p>",
      "image": "https://www.shelf.nu/images/updates/enhanced-user-permissions.jpg",
      "date_published": "2026-09-22T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "An email address means the same person however it is typed. Shelf now treats it that way throughout the invite flow.\n\n## The bug people actually hit\n\nThe [CSV user import](https://www.shelf.nu/knowledge-base/inviting-users-via-csv-upload) stored an address exactly as the spreadsheet had it, capitals and all — `First.Last@company.com`. Accounts are stored in lower case. So when the invited person opened their link while signed in, Shelf compared the two, found them different, and refused with **\"Wrong user\"**. Opening the link signed out gave an error page rather than joining, for anyone who already had a Shelf account.\n\nThe single \"Invite a user\" dialog already lowercased the address, so only invites made by CSV import carried capitals. That is a large share of the invites big teams send.\n\n## What changed\n\nThe import stores addresses in lower case, trimmed of stray spaces. And every place an invite email is compared — the member check, the earlier-invite lookup, the pending-invite check, the account found on acceptance, cancel, and resend — now ignores letter case.\n\nThree side effects go with it:\n\n- A new invite for someone whose earlier invite carried capitals **reuses their existing team member** instead of creating a second one, so the person keeps the record that holds their history.\n- A CSV that lists **one address twice in different capitals** creates one invite, not two.\n- A CSV row for someone **already in the workspace** under different capitals is skipped, rather than inviting them again.\n\nA re-send now closes every earlier invite for that person **before** it issues the new one. The two steps used to run at the same time, so a slow invalidation could close the invite that had just been created.\n\n## Nothing to do on your side\n\nInvites already stored with capital letters work as they are. There is no data change, no backfill, and nothing to re-send. If someone was stuck on \"Wrong user\", ask them to open their existing link again.\n\nThe team member's **name** still comes from the address exactly as you typed it in the CSV, because that name becomes the first name of the account created when the person accepts."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/bulk-actions-name-the-rows-they-touched",
      "url": "https://www.shelf.nu/updates/bulk-actions-name-the-rows-they-touched",
      "external_url": "https://www.shelf.nu/knowledge-base/using-batch-actions-in-shelf",
      "title": "A bulk action's record now names exactly what it touched",
      "summary": "A location's activity feed lists only the assets a bulk move really brought in, and releasing several kits at once records each kit's own custodian instead of the first one's.",
      "content_html": "<p>Two bulk actions did the right thing to your data and then described it wrongly in the history. Nothing was ever moved or released incorrectly — but the record of it was, and a record you cannot trust is not much of a record.</p>\n<p><strong>A location no longer claims stock that never arrived.</strong> <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">Quantity-tracked assets</a> are skipped by the bulk <strong>Update location</strong> action, because a placement needs a count as well as a place. The move itself always honoured that; the note written on the destination location's activity feed did not, and listed every asset you had selected. Move a tripod and a roll of gaffer tape together and the location's history said both had been added, when only the tripod had. The note now names only the assets the action actually moved — which also means an asset already at the location you picked is no longer written up as having arrived there.</p>\n<p><strong>Releasing several kits at once names the right person.</strong> Select kits on the Kits index and use <strong>Release custody</strong>, and each asset's note and each <code>CUSTODY_RELEASED</code> event now carries the custodian of the kit <em>that asset</em> came through. Until now the whole batch borrowed the first selected kit's custodian, so releasing Sarah's kit and Tom's kit together left every asset in the batch recorded against Sarah — a false statement in a permanent asset history, and a wrong grouping in any report built on the released custodian.</p>\n<p>Records written before 18 September 2026 still carry the old values. If you have run either of these batches and something in an asset's or a location's history looks off, that is the likely reason. Everything from here on is written from what the action really did.</p>",
      "image": "https://qliecghuzfchfjwaisyx.supabase.co/storage/v1/object/public/website-images/knowledgebase/batch-actions-1.webp",
      "date_published": "2026-09-18T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Two bulk actions did the right thing to your data and then described it wrongly in the history. Nothing was ever moved or released incorrectly — but the record of it was, and a record you cannot trust is not much of a record.\n\n**A location no longer claims stock that never arrived.** [Quantity-tracked assets](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables) are skipped by the bulk **Update location** action, because a placement needs a count as well as a place. The move itself always honoured that; the note written on the destination location's activity feed did not, and listed every asset you had selected. Move a tripod and a roll of gaffer tape together and the location's history said both had been added, when only the tripod had. The note now names only the assets the action actually moved — which also means an asset already at the location you picked is no longer written up as having arrived there.\n\n**Releasing several kits at once names the right person.** Select kits on the Kits index and use **Release custody**, and each asset's note and each `CUSTODY_RELEASED` event now carries the custodian of the kit *that asset* came through. Until now the whole batch borrowed the first selected kit's custodian, so releasing Sarah's kit and Tom's kit together left every asset in the batch recorded against Sarah — a false statement in a permanent asset history, and a wrong grouping in any report built on the released custodian.\n\nRecords written before 18 September 2026 still carry the old values. If you have run either of these batches and something in an asset's or a location's history looks off, that is the likely reason. Everything from here on is written from what the action really did."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/the-app-lists-a-booking-in-the-web-order",
      "url": "https://www.shelf.nu/updates/the-app-lists-a-booking-in-the-web-order",
      "title": "The app lists a booking in the same order as the web",
      "summary": "On the phone, a booking's items still waiting to be checked out now come first and the ones already out sink to the bottom, matching the web booking page. Nothing to install.",
      "content_html": "<p>Open a booking in <a href=\"https://www.shelf.nu/mobile-app\">Shelf Companion</a> halfway through a hand-over and the items you still have to collect are now at the top of the list, where you are looking. The ones already checked out sink to the bottom.</p>\n<p>Until now the phone did the opposite: it listed the checked-out items first, so every item you handed over pushed the remaining work further down the screen. The web booking page has always ordered the list the other way round, and the two now agree. A kit is judged as one block and only sinks once every member of it is out, a <a href=\"https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables\">quantity-tracked</a> line stays on top while any of its booked units are still waiting, and items that tie break A→Z by name rather than by when they were created.</p>\n<p>This was a server-side change, so <strong>there is nothing to install</strong>. Every phone with Shelf Companion already lists bookings this way, whatever version it is running.</p>",
      "image": "https://www.shelf.nu/images/updates/shelf-mobile-app.jpg",
      "date_published": "2026-09-18T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Open a booking in [Shelf Companion](https://www.shelf.nu/mobile-app) halfway through a hand-over and the items you still have to collect are now at the top of the list, where you are looking. The ones already checked out sink to the bottom.\n\nUntil now the phone did the opposite: it listed the checked-out items first, so every item you handed over pushed the remaining work further down the screen. The web booking page has always ordered the list the other way round, and the two now agree. A kit is judged as one block and only sinks once every member of it is out, a [quantity-tracked](https://www.shelf.nu/knowledge-base/quantity-tracked-assets-and-consumables) line stays on top while any of its booked units are still waiting, and items that tie break A→Z by name rather than by when they were created.\n\nThis was a server-side change, so **there is nothing to install**. Every phone with Shelf Companion already lists bookings this way, whatever version it is running."
      }
    },
    {
      "id": "https://www.shelf.nu/updates/model-reservations-hold-against-named-units",
      "url": "https://www.shelf.nu/updates/model-reservations-hold-against-named-units",
      "external_url": "https://www.shelf.nu/knowledge-base/adding-assets-and-kits-to-a-booking#reserved-units-stay-reserved-when-someone-books-by-name",
      "title": "Units Reserved by Model Stay Reserved",
      "summary": "A booking could pick a unit by name that another booking had already reserved by model. Shelf now counts model reservations whenever a unit is added by name, and marks those units in the picker.",
      "content_html": "<p>Reserving by <a href=\"https://www.shelf.nu/glossary/asset-models\">asset model</a> lets a booking hold \"2 laptops\" without choosing which two. That promise now holds against every other booking on the same dates, including ones that pick units by name.</p>\n<h2>What was missing</h2>\n<p>Shelf already stopped two model reservations from over-committing the same model. What it did not count was a unit named directly. Say a model has 3 laptops, 1 is in custody, and booking A reserves 2 by model. Booking B, on the same dates, could still add one of the 2 free laptops by name. Both bookings saved, and A was left needing 2 laptops from a pool that had 1.</p>\n<h2>What happens now</h2>\n<p>Whenever a unit is added to a booking by name, Shelf checks it against the model reservations on other bookings for those dates:</p>\n<ul>\n<li>In <strong>Manage assets</strong>, units of a fully reserved model show a <strong>Reserved by model</strong> badge and can't be ticked.</li>\n<li>Scanning such a unit onto a booking, on the web or in the Shelf Companion app, is refused.</li>\n<li>Reserving a draft that already holds one is refused, so a draft put together before the reservation existed can't slip past it.</li>\n<li>Extending a booking into a period where the model is fully reserved is refused if the booking holds a unit of it.</li>\n</ul>\n<p>The refusal names the model and shows the count, for example <em>\"Dell Latitude 5550\": 1 unit requested by name, but 2 units are reserved by model on other bookings for these dates and only 0 more can be booked.</em></p>\n<p>A model with units to spare works as before, and a booking that reserves the model itself can still fill its own reservation by picking or scanning units of it.</p>",
      "image": "https://www.shelf.nu/images/updates/add-assets-to-bookings.jpg",
      "date_published": "2026-09-16T00:00:00.000Z",
      "_shelf": {
        "inApp": false,
        "appRoles": [],
        "markdown": "Reserving by [asset model](https://www.shelf.nu/glossary/asset-models) lets a booking hold \"2 laptops\" without choosing which two. That promise now holds against every other booking on the same dates, including ones that pick units by name.\n\n## What was missing\n\nShelf already stopped two model reservations from over-committing the same model. What it did not count was a unit named directly. Say a model has 3 laptops, 1 is in custody, and booking A reserves 2 by model. Booking B, on the same dates, could still add one of the 2 free laptops by name. Both bookings saved, and A was left needing 2 laptops from a pool that had 1.\n\n## What happens now\n\nWhenever a unit is added to a booking by name, Shelf checks it against the model reservations on other bookings for those dates:\n\n- In **Manage assets**, units of a fully reserved model show a **Reserved by model** badge and can't be ticked.\n- Scanning such a unit onto a booking, on the web or in the Shelf Companion app, is refused.\n- Reserving a draft that already holds one is refused, so a draft put together before the reservation existed can't slip past it.\n- Extending a booking into a period where the model is fully reserved is refused if the booking holds a unit of it.\n\nThe refusal names the model and shows the count, for example *\"Dell Latitude 5550\": 1 unit requested by name, but 2 units are reserved by model on other bookings for these dates and only 0 more can be booked.*\n\nA model with units to spare works as before, and a booking that reserves the model itself can still fill its own reservation by picking or scanning units of it."
      }
    }
  ]
}