
Security News
OpenClaw Skill Marketplace Emerges as Active Malware Vector
Security researchers report widespread abuse of OpenClaw skills to deliver info-stealing malware, exposing a new supply chain risk as agent ecosystems scale.
@nextcloud/files
Advanced tools
Nextcloud Files helpers for Nextcloud apps and libraries.
This library provides three kinds of utils:
@nextcloud/files/dav@nextcloud/files version | Supported | Nextcloud version |
|---|---|---|
| 4.x | ✅ | 33+ |
| 3.x | ✅ | 26-32 |
| 2.x | ❌ | 23-25 |
| 1.x | ❌ | 20-22 |
The "New"-menu allows to create new entries or upload files, it is also possible for other apps to register their own actions here.
import type { Entry } from '@nextcloud/files'
import { addNewFileMenuEntry } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
const myEntry: Entry = {
// unique ID of the entry
id: 'my-app',
// The display name in the menu
displayName: t('my-app', 'New something'),
// optionally pass an SVG (string) to be used as the menu entry icon
iconSvgInline: importedSVGFile,
handler(context: Folder, content: Node[]): void {
// `context` is the current active folder
// `content` is the content of the currently active folder
// You can add new files here e.g. use the WebDAV functions to create files.
// If new content is added, ensure to emit the event-bus signals so the files app can update the list.
}
}
addNewFileMenuEntry(myEntry)
It is possible to provide your own sidebar tabs for the files app. For this you need to create a custom web component, which can either be done without any framework by using vanilla JavaScript but is also possible with Vue.
This example will make use of the Vue framework for building a sidebar tab as this is the official UI framework for Nextcloud apps.
The sidebar tab consists of two parts:
This object provides the requires information such as:
The registration must happen in an initScript.
import type { ISidebarTab } from '@nextcloud/files'
import { getSidebar } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
const MyTab: ISidebarTab = {
// Unique ID of the tab
id: 'my_app',
// The display name in the tab list
displayName: t('my_app', 'Sharing'),
// Pass an SVG (string) to be used as the tab button icon
iconSvgInline: '<svg>...</svg>',
// Lower values mean a more prominent position
order: 50,
// The tag name of the web component
tagName: 'my_app-files_sidebar_tab',
// Optional callback to check if the tab should be shown
enabled({ node, folder, view }) {
// you can disable this tab for some cased based on:
// - node: The node the sidebar was opened for
// - folder: The folder currently shown in the files app
// - view: The currently active files view
return true
},
// Optional, recommended to large tabs
async onInit() {
// This is called when the tab is about to be activated the first time.
// So this can be used to do some initialization or even to define the web component.
},
}
// the you need to register it in the sidebar
getSidebar()
.registerTab(MyTab)
The web component needs to have those properties:
INodeIFolderIViewbooleanWhen using Vue you need to first create the Vue component:
<script setup lang="ts">
import type { IFolder, INode, IView } from '@nextcloud/files'
defineProps<{
node: INode
folder: IFolder
view: IView
active: boolean
}>()
</script>
<template>
<div>
<div>Showing node: {{ node.source }}</div>
<div>... in folder: {{ folder.source }}</div>
<div>... with view: {{ view.id }}</div>
</div>
</template>
Which then can be wrapped in a web component and registered.
import { getSidebar } from '@nextcloud/files'
import { defineAsyncComponent, defineCustomElement } from 'vue'
getSidebar().registerTab({
// ...
tagName: `my_app-files_sidebar_tab`,
onInit() {
const MySidebarTab = defineAsyncComponent(() => import('./views/MySidebarTab.vue'))
// make sure to disable the shadow root to allow theming with Nextcloud provided global styles.
const MySidebarTabWebComponent = defineCustomElement(MySidebarTab, { shadowRoot: false })
customElements.define('my_app-files_sidebar_tab', MySidebarTabWebComponent)
},
})
The getClient exported function returns a webDAV client that's a wrapper around webdav's webDAV client.
All its methods are available here.
import { getClient, defaultRootPath, getFavoriteNodes } from '@nextcloud/files/dav'
const client = getClient()
// query favorites for the root folder (meaning all favorites)
const favorites = await getFavoriteNodes(client)
// which is the same as writing:
const favorites = await getFavoriteNodes(client, '/', defaultRootPath)
import {
getClient,
getDefaultPropfind,
resultToNode,
defaultRootPath,
defaultRemoteURL
} from '@nextcloud/files/dav'
// Get the DAV client for the default remote
const client = getClient()
// which is the same as writing
const client = getClient(defaultRemoteURL)
// of cause you can also configure another WebDAV remote
const client = getClient('https://example.com/dav')
const path = '/my-folder/' // the directory you want to list
// Query the directory content using the webdav library
// `davRootPath` is the files root, for Nextcloud this is '/files/USERID', by default the current user is used
const results = client.getDirectoryContents(`${defaultRootPath}${path}`, {
details: true,
// Query all required properties for a Node
data: getDefaultPropfind()
})
// Convert the result to an array of Node
const nodes = results.data.map((result) => resultToNode(r))
// If you specified a different root in the `getDirectoryContents` you must add this also on the `resultToNode` call:
const nodes = results.data.map((result) => resultToNode(r, myRoot))
// Same if you used a different remote URL:
const nodes = results.data.map((result) => resultToNode(r, myRoot, myRemoteURL))
import { getClient, davGetDefaultPropfind, resultToNode, davRootPath } from '@nextcloud/files'
import { emit } from '@nextcloud/event-bus'
const client = getClient()
client.stat(`${davRootPath}${filename}`, {
details: true,
data: davGetDefaultPropfind(),
}).then((result) => {
const node = resultToNode(result.data)
emit('files:node:updated', node)
})
FAQs
Nextcloud files utils
The npm package @nextcloud/files receives a total of 20,094 weekly downloads. As such, @nextcloud/files popularity was classified as popular.
We found that @nextcloud/files demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 9 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Security researchers report widespread abuse of OpenClaw skills to deliver info-stealing malware, exposing a new supply chain risk as agent ecosystems scale.

Security News
Claude Opus 4.6 has uncovered more than 500 open source vulnerabilities, raising new considerations for disclosure, triage, and patching at scale.

Research
/Security News
Malicious dYdX client packages were published to npm and PyPI after a maintainer compromise, enabling wallet credential theft and remote code execution.