# TagSpaces Documentation > Complete reference documentation for TagSpaces This file contains all documentation content in a single document following the llmstxt.org standard. ## About the docs # About this documentation This documentation is work in progress, the articles are being updated on a regular base. ## Documentation structure This documentation is built using [Docusaurus](https://docusaurus.io/), for a streamlined and simple user experience. Each **page** will concern a particular topic, giving **detailed and illustrated explanations** and **instructions** about it. Every page is broken down to different level headings. The navigation sidebar on the left side of this page will represent the **chapters** as expandable topics, with the **sections** listed in each expanded view. ## Illustrations For preparing the screenshots for this documentation we use shapes from the following SVG file. ![Shapes for preparing graphics](/media/inkscape-shapes.svg) We used another great open source product called [Inkscape](https://inkscape.org/) for the creation of the graphics. The color of the shapes has the following HEX encoding: `#ef2dae` ## Text markup You will notice, that certain words are marked with **bold text**. These either mean names of elements, or significant notes/concepts about usage. _Italicized words_ usually mark menu items, or other selectable elements, although it is not a hard and fast rule. Bulleted lists will be used to - Improve **readability** - Make it **easier to find** what you are looking for. ## Document symbols There are currently two types of symbols, apart from the usual text formatting and annotations, that you can find on these pages: - - means that the described feature is part of the TagSpaces Pro and Custom editions. - ⚒ - means that the section is not ready yet and may contain unclear, or not up-to-date information, or sections might be missing entirely. ## Contribution This documentation project is hosted on [GitHub](https://github.com/tagspaces/documentation), and uses the [Docusaurus MD format](https://docusaurus.io/). Enhancement, or corrections are welcome via pull requests. For the markdown syntax used for the document please refer to the [Style Guide](/markdown) ## Credits **Original text and images** in this documentation were **created and edited by**: - [**Ilian Sapundshiev**](https://www.ilian.me) - initiator of the TagSpaces project - [**Attila Orosz**](https://www.linkedin.com/in/attila-orosz-43832114) - main editor of the documentation for version 2 of the product, he can be reached via [email](mailto:attila.orosz@mail.com). Articles published on the [TagSpaces Blog](https://www.tagspaces.org/blog/), served as the **basis upon which this documentation was built**. Fragments of the original text can still be found in the documentation, without marking the original author. ## License of the documentation TagSpaces Documentation by TagSpaces Authors is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.Based on a work at https://github.com/tagspaces/documentation. --- ## AI Functionality Starting with version 6.1, TagSpaces can connect to [Ollama](https://ollama.com/) as an external AI service provider. Ollama is a **locally installed offline** software that enables running AI models (LLMs - large language models) directly on your computer. :::tip TagSpaces does not have its own AI engine or models but relies entirely on external AI software like Ollama for these features. **All AI features are disabled by default**. ::: ## Prerequisites - A modern PC with a recent Nvidia/AMD graphics card or a Mac with an Apple Silicon processor. Ollama also works on regular CPUs, but performance may be slower. - [Download](https://ollama.com/download) and install the Ollama software. - At least 10 GB of free hard drive space for LLMs. ## AI Configuration In the settings, a new tab called **AI** is available. Here, you can add AI engines and manage their models. ### Adding an AI Engine After installing Ollama, you can add it by clicking the **Add AI Engine** button in TagSpaces. If everything is set up correctly, you'll see a new section labeled "Ollama" with a green indicator, meaning Ollama is running in the background. If there are connection issues, the indicator will turn red. By default, the configuration assumes the Ollama service is running on your local machine `https://localhost:11434`. However, it can also run on other computers in your network. You can add multiple Ollama configurations using the **Add AI Engine** button. Select the desired engine in the **Default AI Engine** dropdown. ### Downloading Models The next step is to download a suitable model (LLM). This can be done via the **Default model for text-based tasks** dropdown. In the "Example installable AI models" section, you can choose a suitable model. For text-based tasks, we suggest the **llama3.2** model. For image-based tasks (e.g., image description), you can use *llava* or *llama3.2-vision*. While *llama3.2-vision* delivers better results, it is significantly slower. Once you select a model, a progress dialog will show the download status. Note that models are typically several gigabytes in size, so patience is required. If you can't find the desired model, you can install additional ones using Ollama's [command-line tool](https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#cli-reference). ## AI Chat in Folders If configured correctly, a new button will appear next to the perspective switcher in the folder area. Clicking it opens the **AI Chat** tab in the folder properties. At the top of the tab, select the model for the AI chat. At the bottom, use the AI prompt to ask questions. You can maintain a separate chat for each folder, enabling chat-based research or project organization directly in folders. :::warning All chat history, including dropped images, is saved in the **ai** folder within the **.ts** subfolder of the current folder. Deleting the **ai** folder or the current folder will delete the chat history. ::: ## AI Features for Files AI-related file features are part of the PRO version. These functionalities are currently available: - **Generate image descriptions** for JPG and PNG files. - **Generate tags** from image descriptions. - **Generate tags** for images in JPG and PNG formats. - **Generate PDF descriptions** based on content. - **Summarization** of text based files like HTML, TXT and MarkDown - **Batch AI-processing** of multiple files - Extraction of **dominant colors** in images - **Language configuration** for generated content ## Custom prompts for the AI features In the bottom of the AI tab, there is a section called _Advanced_ which is closed by default. When you open it, you will find text areas where the prompts for the AI/LLM features can be adjusted. ## Upcoming AI Features The following features are on the development roadmap for TagSpaces. - Integration with additional AI engines - Translation of generated content Any **feedback and new ideas** are welcomed in our [**forum**](https://tagspaces.discourse.group/c/feature-requests/6). --- ## Annotating files and folders This pages was moved in the following pages: - [File annotations](/files) - [Folder annotations](/folders) --- ## Bookmarks # Bookmark to files and folders In the PRO versions you can add any file or folder as bookmark for an easy later access. The **Bookmarks Area (1)** are accessible from the **Quick Access (2)** section as seen in the next screenshot. The adding or removing of a bookmark can be done with button marked with **(3)** in the previous screenshot. :::info Bookmark reside only in you current installation of the application, as for now they can not be transferred or shared with anybody. ::: In the context menu **(4)** of the bookmarks you have the following options: - **Refresh** - will reload the bookmarks from the application memory - **Delete all Bookmarks** - will irreversible delete all your bookmarks --- ## Perspectives Overview When you navigate to a folder in your active location, the files contained in the selected folder will be displayed in the main file browsing area of the user interface. TagSpaces offers flexible views to display your files. We call these views **perspectives**. Perspectives are modular extensions that allow more flexibility, easier development, and customizability. TagSpaces is delivered by default with two perspective, while additional perspectives can be found in the PRO products. This is a list of all currently available : - [Grid Perspective](/perspectives/grid/) - Presents files and folders in a grid format, suitable for tagging and file management. It is the **default** perspective built into TagSpaces. - [List Perspective](/perspectives/list/) - Presents files in a list format, suitable for tagging and file management. - [Gallery Perspective](/perspectives/gallery/) - Optimized for browsing and viewing images and photos. - [Mapique Perspective](/perspectives/mapique/) - Displays geo-tagged files and folders on a map. Available in the Pro edition. - [Kanban Perspective](/perspectives/kanban/) - Shows your files as tasks on a Kanban board, representing subfolders as columns on the board. - [FolderViz Perspective](/perspectives/folderviz/) - An experimental perspective that applies information visualization concepts to presenting your folder and file structures. ## Switching Perspectives The perspective for the current folder can be switched in two ways. The easiest method is to use the perspective switch located in the bottom-right corner of the application, as shown in the screenshot below. ![Changing perspectives for a folder](/media/core/perspective-switch.avif) In some cases, such as when using the application on mobile devices, the perspective switch is not available. In these cases, you can open the folder menu located in the upper-right part of the screen. From this menu, you can choose from the available perspectives, similar to the previous screenshot. :::tip Every folder can have its own **[default perspective](/folders/#default-folder-perspective)**, which can be selected in the folder properties area. Once you choose a perspective, every time you open that folder, it will be displayed using the selected perspective. ::: ## Custom Perspective Settings Per Folder In the PRO version, you can assign a default perspective to any folder so that every time you open the folder, it will automatically be displayed using the selected perspective. Some perspectives support custom settings at the folder level. For example, you can set custom _sorting_, _thumbnail mode_, or _pagination limits_. You can learn more in the [perspective settings](/perspectives/grid/#perspective-settings) section. --- ## Create Files # Creating and Importing Files In addition to previewing various file types, TagSpaces also allows you to create new files in several text-based formats, making it a great note-taking application. To create a new file in TagSpaces, you have several options. The easiest way is to click the plus icon button, which is almost always visible in the application. This opens the content creation menu, where you can choose from the actions described bellow. **Timestamp as Default Tag** When you create a new file in TagSpaces, a timestamp in the format `YYYYMMDDThhmmss` is automatically added as a tag: - `YYYY`: The current year - `MM`: The current month - `DD`: The current day - `T`: A delimiter between the date and time - `hh`: The hour - `mm`: The minute - `ss`: The second For example, a file created on January 17, 2017, at 10:30:32 would have the timestamp tag `20170117T103032`. These timestamp tags ensure the uniqueness of automatically generated file names. **Creating files in the desktop app** On the desktop version of the app, you can open the **Main Menu** (by pressing `ALT` on Windows or Linux) and then select **New File** from the **File menu**. In the tray menu there is also an entry called **New file** which will open the dialog for creating new markdown files. ## New Plain Text File Creates a plain text file with the `.txt` extension. ## New Markdown File Creates a text file with the `.md` extension, which ill allow you to add content [Markdown](https://en.wikipedia.org/wiki/Markdown) format. ## New HTML File Creates an HTML file with the `.html` extension, allowing you to add rich text content. At the top of the file creation dialogs, the automatically generated file name is displayed. The text is preselected, so you can easily change it to whatever you need. This is especially useful when creating new cards in the Kanban perspective. Below the text field, you will see the path where the file will be created. The default path is usually the current folder, but if no location is open, the file will be created in the root folder of the first location in your location manager. The file name follows this format: `note[20191113T164613].md` (or `.html` or `.txt`). The default file name includes a timestamp tag, which is explained bellow. ## New Link File Create a URL file, which contain a link to a web site. This files are supported natively on Mac and Windows. There are suitable for creating bookmarks. :::tip The created link files can be then opened in TagSpaces with the [URL Viewer](/extensions/url-viewer/) extension. ::: ## New Audio File Opens a dialog where you can record an audio note. :::tip The recorded audio files can be played in TagSpaces with the [Media Player](/extensions/media-player/) extension. ::: ## New From Template Opens a dialog where you can create files from different templates. :::info The file template are completely customizable in the settings of the application. Just click the **Manage templates** button in the top of the dialog to open the [**file templates tab**](/ui/settings#file-templates) in the settings. ::: ## New Form Device Allows you to import files into the app. See the [Importing Files](#importing-files) section for more details. ## New From URL Opens a dialog where you can enter a URL in the text field and click the **OK** button to start the download and save the file in the current folder. :::info Downloading files from URLs generally works for files shared from object stores, but often fails due to CORS restrictions implemented by websites. As a workaround, you can use our **[browser extension](/web-clipper/)**. ::: ## New Folder Opens the dialog for creating new folders, where beside the name you can choose also the folder's background color. ## Importing Files TagSpaces offers several ways to import files. After a successful import, the file will be copied to the currently open folder. ### Importing from the Folder Menu You can also import files from the folder menu, located in the top-right corner of the application. ![Screenshot showing how to open the folder menu](/media/editcreate/open-folder-context-menu.avif) Choose **New From Device** to open your operating system's file chooser. From there, select the files you want to import. ### Importing Files on Mobile Devices On mobile devices, tapping the **New From Device** menu opens a dialog that lets you choose various sources for files. In the following screenshot from an **Android** device, you can see options like: - **Camera**: Opens the _Camera app_ to take a picture and import it into the current location. - **Camcorder**: Allows you to record a video that can be imported into the app. - **Voice Recorder**: Launches the _Voice Recorder app_ to create an audio note that can be imported. - **Files**: Opens the _Files app_ to select files for import. Depending on your Android device and installed apps, this dialog may display more or fewer options. On **iOS**, you have the options to take a picture with the _Camera app_ or select one or more files from the _Files app_. :::info If the current folder is located on object storage (e.g., AWS S3), importing will trigger the file's upload to the S3 bucket. ::: ### Importing via Drag and Drop You can also import files by dragging them from your desktop or file manager and dropping them into the app. :::note If the current folder is located on object storage (e.g., AWS S3), dragging and dropping files will trigger their upload to the S3 bucket. ::: --- ## Command Line Tools This is a set of command line tools which can create search index and thumbnails for folders used in the TagSpaces Desktop and Web apps. The source code for the tools is available on [GitHub](https://github.com/tagspaces/tagspaces-common/tree/develop/packages/tagspaces-shell) ## Installation ``` npm install -global @tagspaces/shell ``` ## Search index generation This tool will create a search index for a given folder with all its sub folders. Run node script: ``` tscmd -m indexer /some/folder/ ``` This command can be used for automation e.g. in CRON jobs. ## Thumbnail generation This script will recursively create thumbnails for a specified folder with all its sub folders. You have to install [sharp](https://sharp.pixelplumbing.com/install) package globally with the following command: ``` npm i sharp -g ``` Set NODE_PATH environment points to global npm folder: ``` export NODE_PATH=$(npm root --quiet -g) ``` Run node script: ``` tscmd -m thumbgen /some/folder/ ``` This command can be used for automation e.g. in CRON jobs. Don't forget to put the trailing slash after the folder name. ## Cleaning obsolete thumbnails and sidecar files. Running this command will analyze the specified folder: ``` tscmd -m metacleaner /some/folder ``` Where `-m` is for mode, which here is metacleaner. The metacleaner will analyse first the specified folder and deliver a list with files which are not needed or connected anymore. You can review the list and confirm the deletion by setting the `-a`, which is for analyse with `false` as parameter. So this command will finally perform the cleaning. ``` tscmd -m metacleaner -a false /some/folder ``` ## Third party tools Here you will find a list of projects which provides tooling compatible with TagSpaces. These projects are not affiliated with TagSpaces. - [TSS](https://github.com/nahoj/tss) - a command-line tool to manage files with tags, with completion provided for zsh. --- ## Deployment Strategies ## Deployment of the desktop app ![Deployment desktop app](/media/swa/deployment-desktop-app.jpg) ## Deployment of the web app ![Deployment web app](/media/swa/deployment-web-app.jpg) ## Deployment of both app types The following diagram shows the different ways for using the TagSpaces desktop application in combination with different deployment of the TagSpaces Web application. ![SWA](/media/swa/sw-architecture.png) --- ## Extension development guide :::caution This guide is outdated, please use it with caution. ::: This is an initial version of a guide intended to clarify the process of extension development for TagSpaces. ## Prerequisites Cloning the TagSpaces repository from Github git clone https://github.com/tagspaces/tagspaces.git ## Setting up the development environment Using the script `checkoutextensions.sh` or `checkoutextensions.cmd` respectively for Linux and Windows. For Windows users, please open your Command Prompt and execute the following command: checkoutextensions.cmd For Linux users, please open your Terminal and execute the following command: sh checkoutextensions.sh ## Directory structure After running the checkout script your dev environment should have the following directory structure: ``` ~ tagspaces-github-location ├── data │ ├── assets │ │ └── ubuntu-font │ ├── chromium │ ├── cordova │ │ └── fastclick │ ├── electron - Electron framework core │ ├── ext │ │ ├── editorHTML -> tagspaces-github-location/extensions/editorHTML │ │ ├── ... │ │ ├── perspectiveGraph -> tagspaces-github-location/extensions/perspectiveGraph │ │ ├── ... │ │ ├── viewerAudioVideo -> tagspaces-github-location/extensions/viewerAudioVideo │ │ └── ... │ ├── js │ ├── libs │ │ ├── bootstrap │ │ ├── ... │ │ └── underscore │ ├── locales │ │ ├── de │ │ ├── ... │ │ └── zh_TW │ ├── _locales │ │ ├── de │ │ ├── .. │ │ └── zh_TW │ ├── mozilla │ ├── node_modules │ │ └── fs-extra │ ├── node-webkit │ ├── locales │ └── node_modules │ ├── fs-extra │ └── trash ├── docs ├── extensions │ ├── editorHTML │ ├── ... │ ├── perspectiveGraph │ ├── ... │ ├── viewerAudioVideo │ └── ... └── node_modules ``` Please note that after running the script all extension folders in `data/ext` are connected by symlinks to the extensions in the `extensions`. In this folder you will find cloned the repositories of all supported TagSpaces extension. This way you can make changes in for e.g. `extensions/viewerImage`, which will be immediately testable after running the application, because of the symlink. ## Extension initialization On application loading TagSpaces is scanning the extension folder (e.g. `data/ext`) for available extensions. So basically it is searching every sub folder for a bower file. From the bower file TagSpaces is extractiong the id and the name of the extension, which are needed later. Currently on Firefox and Chrome the available extensions are fixed in settings and not resolved at runtime. When a given extension is needed, TagSpaces is loading a file called `extension.js` from the folder of the extension. So this file is mandatory for every extension. It loads later with _requirejs_ further javascript, css or other types of files if needed. In the most extensions like [viewerImage] or [viewerMD] the `extension.js` is creating dynamically a new IFRAME elements which loads a file called `index.html`, where the image or markdown content is displayed or manipulated. ## Messaging API In order the extension to communication with TagSpaces the _Messaging API_ can be used. It is currently in definition phase and can be found unter [data/js/ext.api.js](https://github.com/tagspaces/tagspaces/blob/master/data/js/ext.api.js) ## Structure of the extension The following is the structure of a typical extension. . ├── bower.json - A mandatory file ├── .bowerrc - An optional file for specifying the location of the libraries (e.g. ./libs folder) ├── extension.css ├── extension.js - the app is searching on extension loading js file with this name. ├── main.js - ├── index.html ├── libs │ ├── exif-js │ │ ├── bower.json │ │ ├── ... │ │ └── exif.js │ ├── jquery │ │ ├── bower.json │ │ ├── dist │ │ │ ├── jquery.js │ │ │ └── jquery.min.js │ │ └── MIT-LICENSE.txt │ └── jquery.panzoom │ ├── bower.json │ ├── ... │ └── dist │ ├── ... │ └── jquery.panzoom.min.js ├── LICENSE.txt ├── locales - location of the translated files from Transifex │ ├── de_DE │ │ └── ns.viewerImage.json │ ├── ... │ └── en_US │ └── ns.viewerImage.json └── README.md ## Recommended structure of the bower.json TagSpaces uses Bower as a management tool for its extension. In this section you will find out how the mandatory bower.json should look like. ```js {2} { "name": "The Cool Name", <- The name of the extension, can contain spaces "id": "viewerHTML", <- The id of the extension, should be the same as the folder where your ext. is located "description": "A TagSpaces extension for ...", <- Short description of your extension "type": "viewer", <- The type of your extension, could be: viewer, editor or perspective "version": "1.0.0", <- The version of the extension "dependencies": { "jquery.panzoom": "~2.0.5" }, "devDependencies": {}, "authors": [ "Your Name Here - http://your-optional-website-or-email.com" ], "keywords": [ "html", "viewer" ], "license": "MIT", "main": [ "extension.js" ], "ignore": [ "Gruntfile.js" ], "private": true } ``` ## Internationalization For the internationalization of the extensions we use [Transifex](https://www.transifex.com/tagspaces/tagspaces/). For some extension we have already created translation file, like for [viewerImage](https://www.transifex.com/tagspaces/tagspaces/nsviewerimagejson/) --- ## External Configuration ## Introduction This document will describe how to deploy TagSpaces Pro and Custom with predefined configuration such as custom logo and color, tag library or locations. The settings discussed here should be saved in a file called **extconfig.js**, placed in the folder where the application is hosted. ## Configuring a custom logo For exchanging the application logo the **ExtLogoURL** parameter should be used. A valid values can be an URL: ```js title="Add custom logo" window.ExtLogoURL = "https://www.tagspaces.org/content/text-logo.svg"; ``` or a relative path the file containing the logo: ```js window.ExtLogoURL = "custom-logo.png"; ``` :::tip Images with up to **250 px** width and up to **50 px** height suits best in the user interface of the application. Valid image file formats are JPG, GIF, PNG and SVG. ::: ## Hiding TagSpaces' logo The following setting can be used in order to hide the TagSpaces' logo in the upper left part of the user interface. ```js window.ExtShowTSLogo = false; ``` Possible values: `true`, `false`. Default value: `true` ## Hiding TagSpaces' version The following setting can be used in order to hide the TagSpaces' version in the upper left part of the user interface. ```js window.ExtShowTSVersion = false; ``` Possible values: `true`, `false`. Default value: `true` ## Disabling the onboarding dialog and the license confirmation The property **ExtIsFirstRun** can be used for disabling the initial onboarding dialog and license confirmation. ```js window.ExtIsFirstRun = true; ``` The default value is `true`. ## Disable the checking for new version on startup ```js window.ExtCheckForUpdatesOnStartup = false; ``` The default value is `true`. ## Switching desktop and mobile mode of the app The property **ExtDisplayMode** can be used for switching between the desktop and mobile mode of the app. ```js window.ExtDisplayMode = "mobile"; ``` Possible values are `mobile` and `desktop`. ## Specifying the file tagging mode in the app The property **ExtUseSidecarsForFileTagging** can be used for switching between using the file rename method and using sidecar files for saving the tagging information. ```js window.ExtUseSidecarsForFileTagging = false; ``` Possible values are `true` and `false`. :::tip If the parameter is specified then this setting could not be changed in the TagSpaces settings dialog anymore. The user can only see which file tagging method is activated (renaming files or using sidecar files) ::: ## Forcing the user to use tags from the tag library only If the property **ExtUseOnlyTagsFromTagLibrary** is set to true, the user is forced to limit the tagging only with the predifined tags. The freely creation of tags during tagging is prohibeded this way. ```js window.ExtUseOnlyTagsFromTagLibrary = false; ``` Possible values are `true` and `false`. :::tip If the parameter is specified then this setting could not be changed in the TagSpaces settings dialog anymore. The user can only see the current status of the setting. ::: ## Specifying the location of the tags in the filename The property **ExtFilenameTagPlacedAtEnd** can be used to switching between placing the tags in the beginning of the filename or in the end. For example: `[tag1 tag2] filename.ext` vs. `filename [tag1 tag2].ext`. ```js window.ExtFilenameTagPlacedAtEnd = true; ``` Possible values are `true` and `false`. The default value is `true`. ## Configure custom URLs ### Custom privacy policy URL The installation of TagSpaces Web and TagSpaces Web Pro, do not show a button leading to a privacy policy by default. An URL to a custom privacy policy can be configured with this setting: ```js window.ExtPrivacyURL = "https://tagspacesweb.yourdomain.com/privacy/"; ``` ### Custom imprint page URL The installation of TagSpaces Web and TagSpaces Web Pro, do not show a button leading to a imprint web page by default. An URL to a custom imprint page can be configured with this setting: ```js window.ExtImprintURL = "https://tagspacesweb.yourdomain.com/imprint/"; ``` ## Configuring custom locations With this feature TagSpaces can be deployed with a set of predefined location, which could point to local folder or object store buckets hosted for example on AWS S3. The configuration property responsible for this feature is called **ExtLocations**. This an example for connecting an AWS S3 bucket as location: ```js title="extconfig.js" window.ExtLocations = [ // a list containing one or many locations { uuid: "10565f09-c7fd-2333-fc67-a75db27rt5ba", // an inique id of the location type: "1", // 1 defines the locations a cloud based name: "The name of the cloud location", // the name of the location path: "demo", // the path to sub folder in the location accessKeyId: "your_access_key", // the access key of the user secretAccessKey: "your_secret_key", // the secret case of the user bucketName: "demo-bucket", // the name of the S3 bucket region: "eu-central-1", // the AWS region endpointURL: "https://nas34r:3000/minio", // optional property allowing the specify the cloud end-point directly isNotEditable: true, // disable the opening of the location properties and export isDefault: true, // if true this location will be loaded by the application start isReadOnly: true, // if true the user interface of the application turns to read-only mode disableIndexing: false, // if "true" the app will try to find an existing search index and use it for the searches, by "false" the app will create the index on every search (unless the last created index in the current browser session is not expired see maxIndexAge property) disableThumbnailGeneration: false, // disables the process of thumbnail generation, usefull for S3 buckets, where you do not want to dowload the folder content in order to generate thumbnails fullTextIndex: false, // activated the full-text search for TXT, MD and HTML files watchForChanges: false, // activates the watching for changed files in the current location, (feature is not working on cloud locations) maxIndexAge: 600000 // time in milliseconds (10 minutes x 60 secs per minute x 1000 milliseconds per second) for which the index is valid persistTagsInSidecarFile: true // specifies the way files are tagged in this location ignorePatternPaths: ["**/node_modules/**"], // list of path strings to ignore while indexing }, ]; ``` The following snipped is an example for connecting a local folder as location: ```js window.ExtLocations = [ // an array containing one or many locations { uuid: "53453458-c7fd-2333-fc67-a75db27rt5ba", // an unique id of the location type: "0", // 0 defines the location as local name: "The name of the local location", // the name of the location paths: ["/var/mnt/data/"], // the path pointing to the local folder isDefault: true, // if true this location will be loaded by the application start isReadOnly: true, // if true the user interface of the application turns to read-only mode disableIndexing: false, // if "true" the app will try to find an existing search index and use it for the searches, by "false" the app will create the index on every search (unless the last created index in the current browser session is not expired see maxIndexAge property) fullTextIndex: false, // activated the full-text search for TXT, MD and HTML files watchForChanges: false, // activates the watching for changed files in the current location }, ]; ``` ### Disable the editing of the locations (deprecated) The editing of the locations can be disabled with the following property: **ExtLocationsReadOnly** :::tip This switch is not supported anymore. Now as soon as you have externally configured locations they are automatically read-only. ::: ### Saving locations in the browser Turning on this property will force the app to store the configuration for the locations in the browser's local storage. In the desktop app this is enabled by default, but on the web based version it is turned off. ```js window.ExtSaveLocationsInBrowser = true; ``` Possible values are `true` and `false`. Default value is `false` You might want to set this setting to true, if you want the location data, including the access and secret key for accessing S3 based locations is saved in the local storage of your browser. This way, you don't have to recreate the location every time you open the application. If you are using TagSpaces Web in a browser on your computer or mobile device, where only you have access, this shouldn't be a problem. Please keep in mind, anybody with access to your browser, can with some effort get access to the access keys. This is of course true also for the desktop version, where anybody who can start TagSpaces on your computer can see this information. :::warning **Warning**: It is not recommended to use TagSpaces Web installations with `ExtSaveLocationsInBrowser = true` on public computers, since the location information will potentially stay there even after you close the browser. ::: ## Configuring custom tag library With this feature TagSpaces can be deployed with a set of predefined tags distributed in tag groups. The configuration property responsible for this feature is called **ExtTagLibrary**. The following code snipped shows how to define one tag group containing one tag as a predefined tag library ```js window.ExtTagLibrary = [ // an array containing one or many tag groups { uuid: "17882854-44a7-4b2d-a2b1-b022846ac41d", // an unique id of the tag group title: "Common Tags", // the name of the tag group color: "#008000", // the default background color of the tags in this group textcolor: "#ffffff", // the default text color of the tags in this group readOnly: true, // makes the tag group read-only children: [ // an array containing one or many tags { type: "plain", // the type of tag, just leave it plain title: "book", // the name of the tag description: "", // a optional description for a tag color: "#008000", // the background color of the tag textcolor: "#ffffff", // the text color of the tag }, ], expanded: true, // should be true in order this tag group to be visible in the application }, ]; ``` ### Including the tag library in the config - Start the export process from the three dot menu of the tag library - From the export dialog choose which tag groups you want to export - Click the **Export** button and choose where the exported json file should be saved - Open the exported json file in text or json editor. TagSpaces has an integrated [JSON editor](https://docs.tagspaces.org/extensions/json-editor/), which can be used too. - Edit the json files if needed - Copy the part shown in the next snipped, to the window.ExtTagLibrary array in the extconfig.js - Save the changes in extconfig.js Explanation which part of the code should be copied. ```js { "appName": "TagSpaces", "appVersion": "6.3.1", "settingsVersion": 3, "tagGroups": [ // Copy everything from here to window.ExtTagLibrary = [ here ] ] } ``` :::tip As soon as tags are defined in the `extconfig.js`, the tag library will rendered read-only in the application, so the user will not able to add, change or delete tags there. ::: ## Configuring search file types With this setting you can customize the file types grouping in the search. This is the current default configuration: ```js window.ExtSearchTypeGroups = { any: [''], images: [ 'jpg', 'jpeg', 'jfif', 'jif', 'jiff', 'png', 'gif', 'svg', 'webp', 'bmp', 'tga', 'tif', 'tiff', 'nef', 'cr2', 'dng', 'psd', 'avif', 'nef', ], notes: ['md', 'mdown', 'txt', 'html'], documents: [ 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'odt', 'ods', 'odp', 'pptx', 'numbers', 'potx', 'sldx', 'dotx', ], audio: ['ogg', 'mp3', 'wav', 'wave', 'flac', 'acc', 'm4a', 'opus'], video: ['ogv', 'mp4', 'webm', 'm4v', 'mkv', 'avi', '3gp', '3g2', 'mov'], archives: ['zip', 'rar', 'gz', 'tgz', 'arc', '7z'], bookmarks: ['url', 'lnk', 'sym', 'desktop', 'website'], ebooks: [ 'epub', 'mobi', 'azw', 'prc', 'azw1', 'azw3', 'azw4', 'azw8', 'azk', ], emails: ['eml', 'msg'], folders: ['folders'], files: ['files'], untagged: ['untagged'], }; ``` ## Configuring custom search queries TagSpaces Pro can be pre-configured with predefined search queries. ```js window.ExtSearches = [ // a list of search queries { uuid: "2123", // unique identifier title: "Some query name", // name of the search textQuery: "", // some free text query fileTypes: "", // possible values tagsAND: [ // all of these tags should be attached to an entry { title: "tag1", }, { title: "tag2", }, ], tagsOR: [], // at least one of those tags should be attached to an entry tagsNOT: [ // none of these tags should be attached to an entry { title: "tag3", }, ], lastModified: "", fileSize: "", searchBoxing: "location", // other possible values are 'folder' or 'global' searchType: "fuzzy", // other possible values are 'semistrict' or 'strict' forceIndexing: true, // re-index the current location before performing the search currentDirectory: "/home/username/Documents", fileTypes: ["md", "mdown", "txt", "html"], // a list of file extensions lastModified: "past7Days", // TBD fileSize: "sizeVerySmall", // TBD tagTimePeriodFrom: 1622505600000, // TBD tagTimePeriodTo: 1625090399999, // TBD maxSearchResults: 100, // max number of search result showUnixHiddenEntries: true, // TBD }, ]; ``` ## Configuring custom map tile servers From version 3.10 TagSpaces can be pre-configured with custom map tile servers. The OpenStreetMap compatible tile servers can be even self hosted allowing you to work with maps without the need to be connect to the Internet. ```js window.ExtMapTileServers = [ // a list of one or more external map tile server with their attributes { uuid: "qer4123412ew", // an unique id of the map tile server name: "Stamen Watercolor", serverURL: "https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg", serverInfo: "Map tiles by Stamen Design - http://stamen.com, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.", }, ]; ``` :::tip Some example map tile servers can be found in the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Raster_tile_providers). Please consider the terms of usage of any given map service provider! ::: ## Configure the format of the geo tags The geo tags in can be in either in [Pluscode](https://en.wikipedia.org/wiki/Open_Location_Code) or in [MGRS](https://en.wikipedia.org/wiki/Military_Grid_Reference_System) formats. ```js window.ExtGeoTaggingFormat = "pluscodes"; ``` Possible values: `pluscodes`, `mgrs`. ## Configure the boundaries of the default map With this parameter you can configure a map rectangle, which will be loaded by default in the Mapique perspective the current folder does contain any geo-tagged files or folders. ```js window.ExtDefaultMapBounds = { southWest: { lat: 56, lng: -13 }, northEast: { lat: 29, lng: 50 }, } ``` The geo coordinates in the example above are the default ones, will open Europe in the map. {/* ## Configuring third-party extensions ```js window.ExtExtensionsFound = [ { extensionId: '@tagspaces/arithmetic-player', extensionName: 'Mental Arithmetic', extensionTypes: ['viewer'], extensionEnabled: true, version: '1.0.0', }, ]; ``` ```js window.ExtSupportedFileTypes = [ { type: 'math', color: '#5cb85c', viewer: 'third-party/extensions/@tagspacesarithmetic-player_1.0.0/build', }, ]; ``` */} ## User interface tweaks ### Show vertical panel on startup (deprecated) ```js window.ExtDefaultVerticalPanel = "none"; ``` Possible values: `none`, `taglibrary`, `locations` {/* ### Show advanced search (removed with version 5.4 ) ```js window.ExtShowAdvancedSearch = true; ``` Possible values: `true`, `false`. Default value: `true`. */} ### Show welcome panel ```js window.ExtShowWelcomePanel = true; ``` Possible values: `true`, `false`. Default value: `true`. ### Show smart tags Smart tags are documented [here](/ui/taglibrary/#smart-tags). ```js window.ExtShowSmartTags = true; ``` Possible values: `true`, `false`. Default value: `true`. ### Enable location based tags The [location tags](/ui/taglibrary/#location-tags) are saved in the location's folder and not centrally in the applicaiton's configuration. ```js window.ExtUseLocationTags = true; ``` Possible values: `true`, `false`. Default value: `false`. ### Author This setting provides a way to overwrite the author name which is by default the username of the operating system. The author name can be used in the templates. ```js window.ExtAuthor = ''; ``` Possible values: `true`, `false`. Default value: `true`. ## Theming ### Choose startup theme ```js window.ExtTheme = "dark"; ``` Possible values: `dark`, `light`. ### Open app with predefined perspective ```js window.ExtDefaultPerspective = "gallery"; ``` Possible values are `default`, `gallery`, `mapique`. ## Custom color for the default themes ### Set custom light color for the light theme ```js window.ExtLightThemeLightColor = "#dcf3ec"; ``` Possible value: any css color Default value: `'#dcf3ec'` ### Set custom main color for the light theme ```js window.ExtLightThemeLightColor = "#1dd19f"; ``` Possible value: any css color Default value: `'#1dd19f'` ### Set custom light color for the dark theme ```js window.ExtDarkThemeLightColor = "#56454e"; ``` Possible value: any css color Default value: `'#56454e'` ### Set custom main color for the dark theme ```js window.ExtDarkThemeMainColor = "#ff9abe"; ``` Possible value: any css color Default value: `'#ff9abe'` {/* ### Set custom sidebar color (obsolete since v4) ```js window.ExtSidebarColor = "#2C001E"; ``` Possible value: any css color Default value: '#2C001E' ### Set custom sidebar selection color (obsolete since v4) ```js window.ExtSidebarSelectionColor = "#880E4F"; ``` Possible value: any css color Default value: '#880E4F' */} ## Custom prompts for AI functionalities ### Default question prompt ```js window.ExtDefaultSystemPrompt = "Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question. Chat History: {chat_history} Follow Up Input: {question} Standalone question:"; ``` ### Prompt for summary generation ```js window.ExtSummarizePrompt = "Generate a concise summary {max_chars} in {language} language for the following text: {summarize_text}"; ``` ### Prompt for generation of structured description for an image ```js window.ExtDescriptionFromImageStructuredPrompt = "Analyze this image and return a detailed JSON description including objects, scene, colors and any text detected. If you cannot determine certain details, leave those fields empty."; ``` ### Prompt for generation of description for an image ```js window.ExtDescriptionFromImagePrompt = "Generate a concise description for this image {file_name} in {language} language."; ``` ### Prompt for generation of description for text ```js window.ExtDescriptionFromTextPrompt = "Generate a concise description {max_chars} in {language} language for this text: {input_text}."; ``` ### Prompt for generating tags from image ```js window.ExtTagsFromImagePrompt = "Write the most important topics from the image description. The output TOPICS must be in parsable format like {keyword} without whitespace in braces."; ``` ### Prompt for generating tags from text ```js window.ExtTagsFromTextPrompt = "Extract important tags (single words please) and sort them by their importance from the following content: {input_text}"; ``` ## Custom templates for new files ### Default new file template ```js window.ExtDefaultFileTemplate = { id: 'default', name: 'Default', content: '{createdInApp} ({date})', fileNameTmpl: 'note[{timestamp}]', }; ``` ### Defining a set of templates for new files ```js window.ExtFileTemplates = [ { id: '62342', name: 'External Template 1', description: 'Default template for new markdown files' type: 'md', // md | txt | html content: '{createdInApp} ({date}) by {{author}}, fileNameTmpl: 'task[{timestamp}]', screenshotUrl: 'dataURL:...', // URL to a screenshot of the template }, { id: '72323', name: 'External Template 2', description: 'Default template for new text files' type: 'txt', // md | txt | html content: '{createdInApp} ({date})', fileNameTmpl: 'issue[{timestamp}]', screenshotUrl: 'dataURL:...', // URL to a screenshot of the template }] ``` ## Embedding extconfig.js to packages ### For macOS - Open the TagSpaces' DMG package - Copy the content `TagSpaces.app` to a folder e.g. your desktop - Navigate to TagSpaces.app/Contents folder and copy there your `extconfig.js` file - Install TagSpaces.app to your Applications folder with simple drag and drop Allternatively you can copy the `extconfig.js` after the installation to this path: `/Applications/TagSpaces.app/Contents` ### For Windows - Extract the content of TagSpaces' ZIP package to a folder e.g. your desktop - Copy the `extconfig.js` in the extracted folder - Zip the folder and redistribute Alternatively copy the `extconfig.js` directoy to the installation folder, as shown in the following screenshot. The path is usually `C:\Users\USERNAME\AppData\Local\Programs\TagSpaces`. ### For Linux - Extract the content of TagSpaces' TAR.GZ package to a folder e.g. your desktop - Copy the `extconfig.js` in the extracted folder - Zip the folder and redistribute ## Example configuration file Here you will find the whole configuration file, so it can be easily copied and reused for your custom needs. ```json{2} window.ExtLogoURL = "https://www.tagspaces.org/content/text-logo.svg"; window.ExtIsFirstRun = false; window.ExtTheme = "dark"; window.ExtLocations = [ { uuid: "10565f09-c7fd-2333-fc67-a75db27rt5ba", type: "1", name: "The name of the cloud location", path: "demo", accessKeyId: "your_access_key", secretAccessKey: "your_secret_key", bucketName: "demo-bucket", region: "eu-central-1", isDefault: false, isReadOnly: true, disableIndexing: false, fullTextIndex: false, watchForChanges: false, }, { uuid: "53453458-c7fd-2333-fc67-a75db27rt5ba", type: "0", name: "The name of the local location", path: "/var/mnt/data/", isDefault: true, isReadOnly: true, disableIndexing: false, fullTextIndex: false, watchForChanges: false, }, ]; window.ExtTagLibrary = [ { uuid: "17882854-44a7-4b2d-a2b1-b022846ac41d", title: "Common Tags", color: "#008000", textcolor: "#ffffff", children: [ { id: "ff47282f-a7cc-474c-951f-4636d60c0529", type: "plain", title: "book", description: "", color: "#008000", textcolor: "#ffffff", }, { id: "c3fa72f5-afde-4d2e-af14-bdebb6782a71", type: "plain", title: "article", description: "", color: "#008000", textcolor: "#ffffff", }, ], }, { uuid: "e21711da-ee78-4c83-bae3-e0007fe426a3", title: "Priorities", color: "#008000", textcolor: "#ffffff", children: [ { id: "dca64cf4-79e2-4450-a57b-b53d9d6b8ad3", type: "plain", title: "high", description: "", color: "#ff7537", textcolor: "#ffffff", }, { id: "41dbf6ab-cf8f-4d88-bad1-f9baec83d48b", type: "plain", title: "medium", description: "", color: "#ffad46", textcolor: "#ffffff", }, { id: "78fb6569-9970-4fdf-b6df-ec0daa6ea9b9", type: "plain", title: "low", description: "", color: "#7bd148", textcolor: "#ffffff", }, ], }, ]; ``` --- ## Specification of the meta file formats In comparison to many other tools, TagSpaces uses external text files for saving the meta information for folders and files, instead of a database. Here you will find the specification of the formats used by these files and also some other useful information concerning these files. ## Role of the meta folder The folder containing the meta information for given folder is called `.ts`. The dot in front of the name makes this folder automatically hidden for Unix based file systems like Linux or MacOS. On Windows we set explicitly the a flag to make this folder hidden. Every folder managed in TagSpaces will have its own meta folder. The meta folder contains the following files: - **[tsm.json](#folder-meta-description-format)** - contains the meta information for the parent folder of the `.ts` folder - **tsi.json** - contains the search index for the parent folder it is a root of a location - **tst.jpg** - is the thumbnail file of the parent folder - **tsb.jpg** - is the background image file of the parent folder - **[tsl.jpg](#format-of-the-location-specific-tag-groups)** - contains location specific tag groups, if the parent folder is the root of a location - **file1.ext.jpg** - every file in the parent folder can have a thumbnail which is saved in this file (if the main fail is called `document.pdf` the thumbnail file will be named `document.pdf.jpg`) - **[file1.ext.json](#file-meta-description-format)** - every file in the parent folder can have its own meta information which is save in this files (the main file is called `file.ext`) ## File meta description format This file should be located in a folder called `.ts` located in the folder, where the tagged file is placed. The meta file should have exactly the same name as the tagged file, but in addition it should have the `.json` file extension. So at the end you should have similar structure as the following: ``` ~ /some/TagSpaces/location/folder ├── subfolder_1 │ ├── .ts │ │ ├── file1.jpg.json │ │ └── file2.pdf.json │ ├── file1.jpg │ └── file2.pdf ├── .ts │ ├── file3.png.json │ └── file4.docx.json ├── file3.png └── file4.docx ``` The meta information is saved in JSON format, which has the following format: ```json title="Example JSON file containing file meta data" { "id": "4194969c6bb84ad3acac779645c90e70", "tags": [ // A set containing the file tags { "title": "tag1", // The name of the tag "type": "sidecar", // The type of the tag "color": "#ffcc24", // The background color of the tag "textcolor": "#ffffff" // The text color of the tag }, { "title": "tag2", "type": "sidecar", "color": "#ffcc24", "textcolor": "#ffffff" } ], "description": "# Some description\n\nin *markdown* format" // \n is used for adding new line } ``` ## Folder meta description format In the PRO version of the application you can add tags and description to every folder managed in TagSpaces. This meta information is persisted in a file called **tsm.json** located in `.ts` folder of the tagged folder. The following is an example folder structure of a tagged folder with one tagged subfolder. ``` ~ /some/TagSpaces/location/folder ├── subfolder_2 │ ├── .ts │ │ ├── tsm.json // a file containing the meta info for subfolder_2 │ │ └── file2.pdf.json │ └── file2.pdf ├── .ts │ ├── tsm.json │ └── file4.docx.json └── file4.docx ``` The meta information is saved in JSON format, which has the following format: ```json title="Example tsm.json file containing folder meta data" { "id": "6622238f41024c1a934948abe2e56540", // id of folder "color": "#a47ae244", // the background color of the folder "description": "# Some description\n\nin *markdown* format", // \n can be used for adding new line "tags": [ // the tags added to the folder { "title": "1926", // tag name "type": "sidecar", // tag type "color": "#cca6acff", // tag background color "textcolor": "white" // the color of the text in the tag }, { "title": "3star", "type": "sidecar", "color": "#ffcc24", "textcolor": "#ffffff" } ], "perspectiveSettings": { "list": { // the List perspective settings of the current folder "testID": "listPerspectiveContainer", "settingsKey": "tsPerspectiveList", "orderBy": true, "sortBy": "byName", "layoutType": "row", "singleClickAction": "openInternal", "entrySize": "tiny", "thumbnailMode": "contain", "showDirectories": true, "showDetails": true, "showDescription": false, "showEntriesDescription": true, "showTags": true, "gridPageLimit": 100, "maxDescriptionPreviewLength": 100 }, "grid": { // the Grid perspective settings of the current folder "testID": "gridPerspectiveContainer", "settingsKey": "tsPerspectiveGrid", "orderBy": true, "sortBy": "byName", "layoutType": "grid", "singleClickAction": "openInternal", "entrySize": "small", "thumbnailMode": "cover", "showDirectories": true, "showDetails": true, "showDescription": false, "showEntriesDescription": true, "showTags": true, "gridPageLimit": 100, "maxDescriptionPreviewLength": 100, "nativeDragModeEnabled": false }, "kanban": { // the Kanban perspective settings of the current folder "settingsKey": "tsKanBanPerspective", "orderBy": true, "sortBy": "byName", "layoutType": "grid", "singleClickAction": "openInternal", "entrySize": "small", "thumbnailMode": "contain", "showDirectories": true, "showDetails": true, "showSubFolderDetails": false, "showEntriesDescription": false, "showFolderContent": false, "showTags": true, "filesLimit": 15, "initColumnsLimit": 5 } }, "customOrder": { // order of the files (cards) and folders (columns) used in Kanban perspective "folders": [ { "uuid": "6622238f41024c1a934948abe2e56540", "name": "Folder1" }, { "uuid": "02a2a158c17b4b7bb45a583bd5029e28", "name": "Folder2" }, { "uuid": "f367e3cf8958471aa8d8ae9076ceb6cb", "name": "Folder3" } ], "files": [ { "uuid": "02c5a465b3164110bd6ad3a1721ed27a", "name": "file1.png" }, { "uuid": "f3b6b54e394849d59a9a77ebeaed8a5a", "name": "file2.mp4" }, { "uuid": "eead6bac508f4634abde93921fc11a37", "name": "file3.pdf" } ] } } ``` > **Note** In the JSON examples on this page, you will find sometimes a description after the these characters `//`. These are not part of the format and are used only for clarification purposes. ## Format of the tag library export All tag groups and tags can be exported from the settings of the application, as shown in the next screenshot. ![exporting the tag library](/media/taglibrary/taglibrary-export.avif) The meta information is persisted in JSON format, which has the following format: ```json title="Example tag library export file in JSON format" { "appName": "TagSpaces", // the app name from which this file was generated "appVersion": "6.4.5", // the version of the app from which this files was generated "settingsVersion": 3, "tagGroups": [ // a list of one or more tag groups { "created_date": "1728677734620", // the time when this tag group was created "uuid": "5d8e8305a3ba4fa394fdbb13823dce6d", // an universally unique of the tag group "title": "TestTG", // the name of the tag group "color": "#fa573cff", // the default color of the tags in this tag group "textcolor": "white", // the default text color of the tags in this tag group "children": [ // a list of one or more tags in the current tag group { "title": "tag1", // the name of the tag "description": "", // maybe used in the future "color": "#fa573cff", // the color of the tag "textcolor": "white", // the text color of the tag "description": "some description" // description of the tag }, { "title": "tag2", "color": "#fa573cff", "textcolor": "white" } ], "modified_date": "1744893534077", "expanded": false }, { "uuid": "e28bd828c1e445ed810ac660609f9780", "title": "Another tag group", // the name of the second tag group in the list "color": "#cca6acff", "textcolor": "white", "children": [ { "type": "sidecar", "color": "#cca6acff", "textcolor": "white" } ], "created_date": "1744893534077", "modified_date": "1744893534077", "expanded": true } ] } ``` ## Format of the location export The locations can be exported from one TagSpaces Pro installation and imported in another. The format of the exported file is presented in this section. The example bellow specified one local and two location pointing object storages. The second one is AWS S3 object storage, while the third one is pointing to MinIO server. ```json title="Example location export file in JSON format" { "appName": "TagSpaces", // the app name from which this file was generated "appVersion": "6.4.5", // the version of the app from which this files was generated "locations": [ // a list containing one or many locations { "uuid": "1fa528e7-92b4-3ew2-b4b9-3cd975d87fba", "type": "0", // 0 specifies a location pointing to a local folder "name": "Desktop", // name of the location "path": "/home/username/Desktop", // path pointing to a local folder, should not be empty on local locations "isDefault": true, // specifies if this location is the default one, which loads after starting the app "isReadOnly": false, // specified is the location should be in read-only mode "disableIndexing": false, // if "true" the app will try to find an existing search index and use it for the searches, by "false" the app will create the index on every search (unless the last created index in the current browser session is not expired see maxIndexAge property) "disableThumbnailGeneration": false, // disables the process of thumbnail generation, usefull for S3 buckets, where you do not want to dowload the folder content in order to generate thumbnails "creationDate": 1743859126680, // the creation time of the location "lastEditedDate": 1744891863809, "fullTextIndex": false, // activated the full-text search for TXT, MD and HTML files "maxIndexAge": 660000, // time in milliseconds (10 minutes x 60 secs per minute x 1000 milliseconds per second) for which the index is valid "watchForChanges": true, // activates the watching for changed files in the current location "ignorePatternPaths": ["**/node_modules/**"], // list of path strings to ignore while indexing "persistTagsInSidecarFile": false // specifies the way files are tagged in this location }, { "uuid": "681c60cc-67uz-4221-aebf-f35ce797cd0c", "type": "1", // 1 specifies a location from object storage type (cloud location) "name": "TS Pro Releases AWS", "endpointURL": "", "accessKeyId": "aws_access_key_id", // access key id "secretAccessKey": "some_secret_key", // secret key id "encryptionKey": "some_enc_key", // key for the decryption of encrypted files "bucketName": "your_bucket_name", // the name of the bucket in the object storage "region": "eu-central-1", // AWS region "isDefault": false, "isReadOnly": true, "disableIndexing": false, "disableThumbnailGeneration": true, "fullTextIndex": false, "watchForChanges": false, "creationDate": 1740474629766, "lastEditedDate": 1744891863809, "maxLoops": 2, "path": "an_optional_path_in_the_s3_bucket" }, { "uuid": "2762d4e6-559b-4421-3w12-e40c967160d8", "type": "1", "name": "MinIO Server on QNAP NAS", "path": "/", "endpointURL": "http://192.168.178.12:7000", // a URL to the server (e.g. MinIO) providing the object storage "accessKeyId": "miniouser", "secretAccessKey": "secret_minio_password", "bucketName": "Photos", "region": "", "isDefault": false, "isReadOnly": false, "disableIndexing": false, "fullTextIndex": false, "watchForChanges": false, "creationDate": 1740474629766 } ] } ``` ## Format of the exported search queries TagSpaces Pro offers the possibility to export previously saved search queries. And later import them in another TagSpaces Pro installation. ![export search queries](/media/search/import-export-searches.avif) ```json title="Example files with exported search queries in JSON format" { "appName": "TagSpaces", "appVersion": "6.4.5", "searches": [ { "uuid": "3c5c1937043a43388f44408944ac31ba", "title": "testquery +1920 -article |5star", "textQuery": "testquery", "tagsAND": [ { "title": "1920" } ], "tagsOR": [ { "title": "5star" } ], "tagsNOT": [ { "title": "article" } ], "searchBoxing": "location", // "location", "folder" or "global" "searchType": "fuzzy", // "fuzzy", "strict" or "semistrict" "fileTypes": ["md", "mdown", "txt", "html"], // file extension you need can be added here "lastModified": "past7Days", "fileSize": "sizeVerySmall", "tagTimePeriodFrom": 1622505600000, "tagTimePeriodTo": 1625090399999, "maxSearchResults": 1000, "forceIndexing": false // true or false } ] } ``` ## Format of the location specific tag groups Since version 3.11 TagSpaces supports tags which are specific for a given location. The tags resides in a file called `tsl.json`, which should be located in the `.ts` folder of the current location. ```{5} ~ /some7TagSpaces/location/folder ├── subfolder_2 ├── .ts │ ├── tsm.json │ ├── tsl.json // file containing the tag groups of this location │ └── file4.docx.json └── file4.docx ``` The format of these files is similar to the format of the produced by exporting your [tag library](#format-of-the-tag-library-export). So basically you can take such exports rename them to tsl.json and put them in .ts folder. After reloading them by clicking the "Reload Location Tags"-menuitem the tag-groups should appear in the Tag Library. Tag groups imported from locations will have the location name in brackets as seen the following screenshot. ```json title="Example tsl.json file" { "appName": "TagSpaces", // the app name from which this file was generated "appVersion": "3.11.2", // the version of the app from which this files was generated "tagGroups": [ // a list of one or more tag groups { "created_date": "1740474629766", // the time when this tag group was created "uuid": "2e0c46f0-3a1b-4902-a930-58a0a1a170f8", // an universally unique of the tag group "title": "TestTagGroup", // the name of the tag group "readOnly": "true", // specifies if the tag group can be edited "color": "#fa573cff", // the default color of the tags in this tag group "textcolor": "white", // the default text color of the tags in this tag group "children": [ // a list of one or more tags in the current tag group { "type": "sidecar", "title": "tag1", // the name of the tag "color": "#fa573cff", // the color of the tag "textcolor": "white" // the text color of the tag }, { "type": "sidecar", "title": "tag2", "color": "#fa573cff", "textcolor": "white" } ], "modified_date": "1740474629766", "expanded": false } ] } ``` --- ## Edit Files Besides opening and viewing files, TagSpaces can also edit specific file formats. Just like [File Browser Perspectives](/browsing-files/#perspectives-overview), and [File Preview extensions](/viewing-files/), the different types of **File Editors** are also **modular extensions**, making TagSpaces' file editing capabilities extendable. Currently three editor extensions ship bundled with the application: - [**HTML Editor**](/extensions/html-editor/) - `HTML` files serve a specific purpose in TagSpaces. They are treated as RichText documents, that can not only be previewed, but visually edited in a full-featured **WYSIWYG editor**. - [**Markdown Editor**](/extensions/md-editor/) - This editor can open files in Markdown format `.md` and supports **WYSIWYG** editing. - [**Text Editor**](/extensions/text-editor/) - This editor opens all other text-based file formats, and unknown file types alike. For `.txt` and miscellaneous files, it behaves as a simple editor, with added syntax highlighting capabilities for common programming languages. - [**JSON Editor**](/extensions/json-editor/) - An interactive visual editor for editing and manipulating `JSON` files. If the file format of the currently opened files is supported for editing the **EDIT button** will appear in the top right corner of the application. Clicking on this button will activate the edit mode for this file. Once in edit mode the `Edit` button will disappear and on its place two new buttons will be appear. Pressing the `Cancel` button will revert the changes and exit the edit mode. Pressing the `Save` button will respectively save the changes, which can be done also with the `CMD/CTRL+S` key combination. After saving the changes the file will remain in edit mode and you can continue its editing. If the file is changed you will see a black dot in front of the file extension, visible in the upper left corner of the next screenshot. Saving the changes will make the dot to disappear. The `Cancel` and `Save` button will be exchanged with an`Exit editing` button, which will open the file back with file viewer extension for this file type. ## File revisions A key feature of document management systems is the ability to create revisions of the edited files. This feature can be enabled in the [Advanced tab](/ui/settings/#advanced) of the application's Settings dialog box. Once activated, a full copy of the current file (e.g. TXT, MD, HTML or JSON) is created with each save. The created file versions are listed in the **Revisions** tab of the file properties view, as seen in the screenshot. From here, you can **preview** and **restore** previous versions of the file. It is also possible to **delete all** revisions, by clicking the button with the trash bin icon, located in the revision's table header. ### Technical details The revisions are stored in a subfolder of the `.ts` folder, which is located in the same folder as the file being currently edited. The name of the folder is an unique ID, which is the same as the Entry ID visible in the file properties and saved in the file's sidecar file. ```bash ~ folder1 ├ ── .ts │ ├── 95b6e7d8e00245c7ba8a37d65783d514 - the folder containing the revisions for file4.md │ │ ├── 1743100950489.md - the version of the files create on the timestamp │ │ └── 1744314207751.md - another version of the file │ ├── file4.md.json - contains the entry id for file4 e.g.: 95b6e7d8e00245c7ba8a37d65783d514 │ └── tsm.json - contains tags and description for folder1 └── file4.md ``` ## Auto-save changes The auto-save feature can be enabled individually for each editable file. When it is enabled, the application will save any changes you make automatically every 40 seconds. In the most editor extensions you can also save the file anytime manually by clicking the save button or by pressing the `CMD/CTRL+S` key combination. ## Increasing your workspace All of the above editors, will initially open on the right pane of the main area. You can expand your workspace to be able to see and edit more of the document, in two ways: - **Expand** the editor to fill the whole width of the TagSpaces user interface, by clicking on the **Toggle full width** menu entry, shown in the next screenshot. - Click on the **Switch to fullscreen** menu entry will open only the area of the editor in full screen mode. To exit fullscreen mode, press the (X) button located at the top right of the screen or just press the **ESC** key on your keyboard. :::tip By using the fullscreen feature you are editing the documents in the so called **distraction free mode**. This will expand the editor area to fill the entire screen area, with no window decorations, or other user interface elements, while any applicable **formatting toolbars** and the **Floating Action Button** will still be shown. ::: --- ## 3D Viewer A TagSpaces extension for opening 3D file formats. ## Features - 3D preview of GLB, GLTF, STL, and OBJ files - Rotate the models with mouse dragging - Use the mouse wheel to zoom in and out - Hold right-click and move the mouse to shift the rotation center of the model - Save a screenshot of the current 3D rendering as a PNG file ## Used Libraries This extension thankfully relies on the following great libraries: - [model-viewer](https://modelviewer.dev/) - [viewstl](https://www.viewstl.com/) - [three.js](https://threejs.org/) - [FileSaver](https://github.com/eligrey/FileSaver.js/) - [Bootstrap](https://getbootstrap.com/) - [i18next](https://www.i18next.com/) ## Installation This extension is pre-installed in TagSpaces Pro. ## License Proprietary --- ## Archive Viewer A TagSpaces extension allowing you to preview the content of ZIP files. ## Features - Listing the content of ZIP files - Previewing the content of the files in the ZIP container ![Screenshot of the viewerZIP](/media/extensions/viewer-zip-lead.png) ## Used Libraries This extension thankfully relies on the following great projects: - [jszip](https://stuk.github.io/jszip/) - [Bootstrap](https://getbootstrap.com/) - [i18next](https://www.i18next.com/) - [DOMPurify](https://github.com/cure53/DOMPurify) ## Installation This extension is packaged with any new version of TagSpaces. ## Source Code The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/archive-viewer). ## Development If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide). ## License [MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/archive-viewer/LICENSE.txt) --- ## Document Viewer A TagSpaces extension for previewing document files. ## Features - Preview files in DOCX format - Export the content as an HTML file - Zoom in and out of the content ![general screenshot of the document viewer extension](/media/extensions/viewer-document-lead.png) ## Used Libraries This extension thankfully relies on the following great libraries: - [mammoth](https://github.com/mwilliamson/mammoth.js/) - [bootstrap](https://getbootstrap.com/) - [i18next](https://www.i18next.com/) - [mark.js](https://markjs.io/) - [dompurify](https://github.com/cure53/DOMPurify) - [jszip.js](https://stuk.github.io/jszip/) ## Installation This extension is packaged with any new version of TagSpaces. ## Source Code The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/document-viewer). ## Development If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide). ## License [MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/document-viewer/LICENSE.txt) --- ## eBook Viewer A TagSpaces extension allowing you to open eBooks or digital magazines in EPUB format. ## Features - Previewing files in EPUB format - Automatically switch to two-fold mode by sufficient width ## Used Libraries This extension thankfully relies on the following great libraries: - [epub.js](https://github.com/futurepress/epub.js/) - [Bootstrap](https://getbootstrap.com/) - [i18next](https://www.i18next.com/) - [jszip.js](https://stuk.github.io/jszip/) ## Installation This extension is packaged with any new version of TagSpaces. ## Source Code The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/ebook-viewer). ## Development If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide). ## License [MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/ebook-viewer/LICENSE.txt) --- ## Font Viewer A TagSpaces extension for previewing font files. ## Features Here is a list of the key features offered by this extension: - Supporting the following font formats: TTF, OTF, WOFF - Preview of the font with the standard sentence: _The quick brown fox jumps over the lazy dog_ - Preview of the glyphs in the font file ## Used Libraries This extension thankfully relies on the following great libraries: - [Opentype.js](https://opentype.js.org/) - [Bootstrap](https://getbootstrap.com/) ## Installation This extension is pre-installed in TagSpaces Pro. ## License Proprietary --- ## HTML Editor A TagSpaces extension allowing editing of HTML documents. ## Features - The standard feature set of the [Summernote](http://summernote.org/) JavaScript library. - Content cleaning and sanitizing. - Directly pasting images from the clipboard. - Saving all the images as data URLs in one HTML file. ![Screenshot of the HTML editor running in the Linux version of TagSpaces](/media/extensions/editor-html-lead.png) ## Used Libraries This extension thankfully relies on the following great libraries: - [Summernote](http://summernote.org/) - a JavaScript library for HTML editing. - [Bootstrap](https://getbootstrap.com/) - [i18next](https://www.i18next.com/) - [Dompurify](https://github.com/cure53/DOMPurify) ## Installation This extension is packaged with any new version of TagSpaces. ## User Manual **HTML files** are treated like RichText documents in TagSpaces. When you edit a `.html` document, the fully formatted preview of the file will be replaced by a **WYSIWYG** (**W**hat **Y**ou **S**ee **I**s **W**hat **Y**ou **G**et) HTML editor. In editor mode, the HTML document will keep its formatting, but you are now able to edit the text, making the HTML editor behave like a RichText editor. On the top of the view, you will find a formatting toolbar, with which you can fully control the appearance of the document. ![](/media/extensions/html-editor/tagspaces-html-editor.png) The formatting toolbar offers some common features you can find in any RichText or WYSIWYG HTML editor, with some features specific to TagSpaces. The overflow menu options from the [HTML viewer](/extensions/html-viewer/) are not implemented in the HTML Editor. ### Toolbar Buttons The toolbar buttons are grouped together based on similar behavior or functionality. The major groups are illustrated below: ![](/media/extensions/html-editor/html-editor-toolbar.png) - [**Manage Checkboxes**](#manage-checkboxes) (**1**) - [**Paragraph Style**](#paragraph-style) (**2**) - [**Color**](#color) (**3**) - [**Font Styles**](#font-styles) (**4** and **5**) - [**Font Family**](#font-family) (**6**) - [**Lists and Alignment**](#lists-and-alignment) (**7**) - [**Line Height**](#line-height) (**8**) - [**Insert Table**](#insert-table) (**9**) - [**Insert Link, Image and Horizontal Ruler**](#insert-link-image-and-horizontal-ruler) (**10**) - [**Code View**](#code-view) (**11**) - [**Help**](#help) (**12**) #### Manage Checkboxes This is a compound button, consisting of two parts: - **Add Checkbox** (**1**) - **Toggle All Checkboxes** (**2**) ![](/media/extensions/html-editor/add-checkbox-button.png) Pressing **Add Checkbox** will insert an interactive, clickable checkbox into your document, which can be used to create, e.g., ToDo lists. To learn more about this feature, scroll down to the [Creating ToDo Lists](#creating-todo-lists) section. Pressing the **Toggle All Checkboxes** button will select or deselect all the checkboxes present in the HTML document, regardless of their location. :::tip When some checkboxes are manually selected, while others are deselected, the **Toggle All Checkboxes** will check all the unchecked ones. Pressing the button again will only uncheck the ones that have been checked via the button. The ones that were manually checked will remain unchanged. ::: [Back to button group list](#toolbar-buttons) #### Paragraph Style This button will open a dropdown menu from which you can select a paragraph style to apply. When selecting an option, the chosen style will be applied to the entire current paragraph (where the cursor is located) without having to make a selection first. If you do select some text first, the style will only be applied to the current selection. ![](/media/extensions/html-editor/paragraph-styles.png) Available styles are: - **p** represents the `` HTML tag (normal paragraph). It can also be used to remove other styles. The hotkey `Ctrl+0` is assigned to this action. - **blockquote** will enclose the current paragraph in `
` tags. - **pre** will enclose the current paragraph in `
` (preformatted text) tags.
- **H1** to **H6** mean different heading levels from **1** (largest) to **6** (smallest). Selecting one of these options will enclose the entire paragraph in `` to `` tags. Hotkeys `Ctrl+1` to `Ctrl+6` can also be used to set headings, where the number reflects the level of the desired heading.

[Back to button group list](#toolbar-buttons)

#### Color

This is a compound button, which has two parts.

![](/media/extensions/html-editor/color-button.png)

The left part, **Recent Color**, will apply the last used background and foreground color on the text. The applicable background and foreground colors are reflected on the button itself.

![](/media/extensions/html-editor/colour-button-alt-background.png)

The right part, **More Color**, will open a dropdown menu, from which you can choose both background and foreground colors to apply, while the default color values can be reset with their respective buttons.

![](/media/extensions/html-editor/color-button-dropdown.png)

[Back to button group list](#toolbar-buttons)

#### Font Styles

The following groups represent font styles that can be applied to either a selection or as a toggle, to mark any text to be written with the given style, until the toggle is switched off.

![](/media/extensions/html-editor/font-styles.png)

**Bold** (**1**), **Italic** (**2**), and **Underline** (**3**) will mark either the selected text or the text that follows as **bold**, _italic_, or underlined, respectively. These three buttons also have hotkeys assigned. `Ctrl+b` will toggle **bold**, `Ctrl+i` toggles _italic_, while `Ctrl+u` toggles underline.

**Superscript** (**4**) and **Subscript** (**5**) will mark either the selection or the text that follows to be superscript or subscript, respectively. **Strikethrough** (**6**) will create ~~strikethrough~~ text, and **Remove Font Style** (**7**) will remove all formatting. (This last option is only applicable to selections.)

From this group, only two options have hotkeys assigned. **Strikethrough** can be toggled with `Ctrl+Shift+s`, while the **Remove Font Style** hotkey is `Ctrl+\`.

[Back to button group list](#toolbar-buttons)

#### Font Family

This is the last of the font style buttons. It can set the selection or the text that follows to a specific font family.

![](/media/extensions/html-editor/font-family.png)

:::tip
The options presented here might depend on your operating system and the fonts installed.
:::

[Back to button group list](#toolbar-buttons)

#### Lists and Alignment

This is a compound group, which offers different options that all work on the currently active paragraph as a toggle, without the need to make a selection first.

![](/media/extensions/html-editor/alignment-button-dropdown.png)

The first two buttons offer toggles for **Unordered List** (**1**) and **Ordered List** (**2**). The last button in the group will open a dropdown menu which offers four standard alignment options: **Left** (**3**), **Center** (**4**), **Right** (**5**), and **Full Justify** (**6**); and also the option to **Decrease Indent** (**7**) or **Increase Indent** (**8**).

The hotkeys for these operations are:

- **Unordered List** - `Ctrl+Shift+7`
- **Ordered List** - `Ctrl+Shift+8`
- **Left Align** - `Ctrl+Shift+L`
- **Center Align** - `Ctrl+Shift+E`
- **Right Align** - `Ctrl+Shift+R`
- **Justify Full** - `Ctrl+Shift+J`
- **Decrease Indent** - `Ctrl+Shift+Tab`
- **Increase Indent** - `Ctrl+Tab`

[Back to button group list](#toolbar-buttons)

#### Line Height

Offers a dropdown menu that allows you to set the line-height of either the active paragraph or the currently selected paragraphs between **1.0** and **3.0** by increments of **1.0**, **1.2**, **1.4**, **1.5**, **1.8**, **2.0**, and **3.0**.

![](/media/extensions/html-editor/change-line-height.png)

:::tip
When you make a selection, you do not need to select the entire paragraph. The selection's edges will mark active paragraphs. The line height adjustment will be performed on all full paragraphs, starting with the one inside which the selection starts, and ending with the one inside which the selection ends.
:::

#### Insert Table

This button will open a drop-down graphical menu for drawing a table grid, with a maximum size of **10x10**, that can be easily inserted into the document.

![](/media/extensions/html-editor/insert-table-dropdown.png)

#### Insert Link, Image, and Horizontal Ruler

![](/media/extensions/html-editor/insert-link-etc.png)

This group has the following three buttons:

- [**Insert Link**](#insert-link) (**1**)
- [**Insert Image**](#insert-image) (**2**)
- [**Insert Horizontal Ruler**](#insert-horizontal-ruler) (**3**)

##### Insert Link

The first button will open a dialog that allows you to add a hyperlink to the text. The dialog allows for specifying the text to display and the link to follow when clicked, with a checkbox allowing you to set the link to be opened in a new tab or window. The dialog can also be invoked by pressing `Ctrl+K`.

![](/media/extensions/html-editor/insert-link-dialog.png)

If you select some text to apply the link to before pressing the button, the selection will automatically populate the _Text to display_ field. If you made no selection, you will need to specify a text to be displayed. If you leave the field empty and start typing a URL, it will automatically populate the text to display field, which you can later modify.

To edit or remove links, you can just click inside the link and use the buttons that appear on the popup.

![](/media/extensions/html-editor/edit-link.png)

The first button (**1**) will allow you to edit the link, while the second (**2**) will remove it.

:::tip
Links can also be added to the documents by typing the URL and pressing enter. A well-formed URL will automatically turn into a link.
:::

##### Insert Image

The second button in the group will also open a dialog, which lets you insert a picture from either your computer or from a URL.

![](/media/extensions/html-editor/insert-image-dialogue.png)

##### Insert Horizontal Ruler

The last button will insert a simple horizontal ruler (a HTML `` tag) at the point where the cursor is currently located. The hotkey to quickly insert a horizontal ruler is `Ctrl+Enter`.

:::caution
This button does not respect paragraph endings. If you press this button in the middle of a paragraph, it will break the paragraph at that point.
:::

[Back to button group list](#toolbar-buttons)

#### Code View

![](/media/extensions/html-editor/code-view.png)

This is a toggle to show plain HTML code on a dark background, where the formatting buttons are disabled, and you can edit the HTML code directly.

![](/media/extensions/html-editor/code-view-view.png)

Pressing the button again will return to the WYSIWYG mode.

:::info
Code highlighting for the HTML view is not currently implemented.
:::

#### Help

![](/media/extensions/html-editor/help-button.png)

The last button will display a summary of all the keybindings. If you prefer to use hotkeys, you will find a quick reference here.

![](/media/extensions/html-editor/help-view.png)

### Creating ToDo Lists

The recently added feature of interactive checkboxes makes TagSpaces ideal for creating simple, yet flexible **ToDo lists**. Pressing the [**Add Checkbox Button**](#add-checkbox) button will insert a checkbox anywhere in the text.

For **ToDo Lists**, you would ideally want the checkbox to be the very first character of a list, although you are not limited by placement. To make your list multi-level (i.e. sub-items under list items), you can use the **Increase Indent** feature (see [Toolbar Buttons -> Lists and Alignment](#lists-and-alignment)) on the desired line, by either pressing its button or using its hotkey (`Ctrl+Tab` to increase indent, `Ctrl+Shift+Tab` to decrease indent).

![](/media/extensions/html-editor/ToDoList.png)

:::tip
The interactive checkboxes only work in editor mode. When in HTML preview mode, you can see the current state of the box, but cannot change it. To make a list interactive, switch to editor mode by pressing the little pencil icon at the top of the preview.
:::

### Key bindings

Below you can find a summary of all the hotkeys you can use in the HTML Editor

:::tip
Mac users should use the `Cmd` key, where `Ctrl` is mentioned
:::

- `Ctrl+Z` - Undo the last command
- `Ctrl+Y` - Redo the last command
- `Tab` - Insert Tab
- `Shift+Tab` - Remove tab
- `Ctrl+B` - Set a bold style
- `Ctrl+I` - Set an italic style
- `Ctrl+U` - Set an underline style
- `Ctrl+Shift+S` - Set a strikethrough style
- `Ctrl+\` - Clear all styles
- `Ctrl+Shift+L` - Set left align
- `Ctrl+Shift+E` - Set center align
- `Ctrl+Shift+R` - Set right align
- `Ctrl+Shift+J` - Set full align
- `Ctrl+Shift+7` - Toggle unordered list
- `Ctrl+Shift+8` - Toggle ordered list
- `Ctrl+Tab` - Indent on current paragraph
- `Ctrl+Shift+Tab` - Outdent on current paragraph
- `Ctrl+0` - Change current paragraph's style to plain paragraph (`` tag)
- `Ctrl+1` - Change current paragraph's style to H1
- `Ctrl+2` - Change current paragraph's style to H2
- `Ctrl+3` - Change current paragraph's style to H3
- `Ctrl+4` - Change current paragraph's style to H4
- `Ctrl+5` - Change current paragraph's style to H5
- `Ctrl+6` - Change current paragraph's style to H6
- `Ctrl+Enter` - Insert horizontal rule
- `Ctrl+K` - Show Link Dialog

## Source code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/html-editor).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspa ces/tagspaces-extensions/blob/main/html-editor/LICENSE.txt)

---

## HTML Viewer


A TagSpaces extension allowing opening of HTML files.

## Features

Here is a list of the key features offered by this extension:

- Zoom in and zoom out capabilities
- Printing the document
- Search for text in the current document
- Reader mode, extracting only the main part of the document by stripping header, footer, and navigation if available

![General screenshot of the HTML viewer extension](/media/extensions/viewer-html-lead.png)

### Meta-Data

The TagSpaces [Firefox](https://addons.mozilla.org/en-us/firefox/addon/tagspaces/) and [Chrome](https://chrome.google.com/webstore/detail/tagspaces/ldalmgifdlgpiiadeccbcjojljeanhjk) web clippers save the date and time of the saving, the URL from which the webpage is saved, and optionally a screenshot. This information can be accessed from the `File Details` menu entry in the extension's main menu. In the dialog that will appear, you will see the screenshot of the web page (if available) and the original URL of the webpage.

![Web scraping details](/media/extensions/viewer-html-scraping-details.png)

## Used Libraries

This extension thankfully relies on the following great libraries:

- [Readability](https://github.com/mozilla/readability)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [DOMPurify](https://github.com/cure53/DOMPurify)

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/html-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/html-viewer/LICENSE.txt)

---

## Image Viewer


A TagSpaces extension allowing you to open different kinds of image formats.

## Features

- Opening of the following image formats: JPG, PNG, GIF, SVG, BMP, WEBP, ICO, TIFF, AVIF, TGA
- Preview of these formats: CR2, NEF, DNG, PSD
- Zooming, flipping, and rotating of the current image
- Different background colors of the viewer for better contrast
- For JPG files, it features an integrated Exif and IPTC reader with auto-rotation of photos according to the Exif information
- Support for image printing
- Grayscale filter
- Exporting the current image in JPG, PNG, or WEBP format (only for the desktop apps)

![Screenshot of the image viewer extension](/media/extensions/viewer-image-lead.png)

The following screenshot shows a dialog with the extracted Exif and IPTC information.

![Screenshot showing extracted Exif information](/media/extensions/viewer-image-exif.png)

## Used Libraries

This extension thankfully relies on the following great libraries:

- [viewer.js](https://fengyuanchen.github.io/viewerjs/)
- [exif.js](https://github.com/exif-js/exif-js)
- [UTIF.js](https://github.com/photopea/UTIF.js/)
- [tga.js](https://github.com/vthibault/tga.js/)
- [psd](https://github.com/meltingice/psd.js/)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/image-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/image-viewer/LICENSE.txt)

---

## JSON Editor


A TagSpaces extension allowing viewing and editing of JSON documents.

## Features

- Open and edit JSON documents graphically.



## Used Libraries

This extension thankfully relies on the following great libraries:

- [JSON editor](https://github.com/josdejong/jsoneditor)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [Mark.js](https://markjs.io/)

## Installation

This extension is packaged with any new version of TagSpaces.

## User Manual

Editing JSON files will build upon the functionality you've already seen in the **JSON Preview mode**.

![JSON Editor Screenshot](/media/extensions/json-editor/json-editor.png)

The top row of the editor will offer a basic toolbar, with some common actions such as **Expand all fields** (**1**), **Collapse all fields** (**2**), **Undo** and **Redo** (**3**), and a search box (**4**).

![JSON Editor Toolbar](/media/extensions/json-editor/json-editor-toolbar.png)

Each field has some useful controls that can help manipulate and rearrange JSON files easily.

![JSON Editor Parts](/media/extensions/json-editor/json-editor-parts.png)

- On the left edge, there is a drag handle, allowing for easy movement of each row (**1**).

- Next to the drag handle is an **Action Menu Button** (**2**), which opens the **Action Menu** (**3**), offering useful actions on each field, such as:

  - You can choose or change the **Type** of the field, choosing from _Auto_, _Object_, _Array_, or _String_.
  - You can **Insert** an _Array_, _Object_, or _String_ inside any field (there is also an _Auto_ mode for insertion). Inserting will place the new field **before** the selected field.
  - When selecting the **Action Menu** on the last member of an _Object_ or _Array_, you can also **Append** the same categories, which will place the new field **after** the last item.
  - _Objects_ and _Arrays_ will also allow for **Sorting**, either _Ascending_ or _Descending_.
  - Finally, you can **Duplicate** or **Remove** any field from the hierarchy (apart from the root).

- To the right of the Action Menu Button, there is an **Open/Close Chevron** (**4**), which can expand or collapse each field.

- Finally, you have the field itself, with one (**5**) (for arrays and objects) or two editable sections (**6**) (for string type), and an optional, read-only information field (**7**) that displays the number of sub-fields, in either curly brackets `{ }` (for objects) or square brackets `[ ]` (for arrays).

The **FAB Overflow Menu** will offer to either **Print** the file or display a **JSON Help** menu, which gives a summary of the numerous key combinations that can be used to work on JSON files even faster.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/json-editor).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/json-editor/LICENSE.txt)

---

## Markdown Editor


A TagSpaces extension allowing viewing and editing of Markdown files.



## Features

- **WYSIWYG** Markdown editing
- Embedding images, also as data URLs
- Support for emojis 🍒
- Support for tables
- Simple text _formatting_ and headers
- Copy and paste markdown text
- Support for math expressions
- Reading aloud the text content of the document
- Visualizing the markdown header structure as a mind map

**TIP**: Just type `/` on a new line to get a menu showing all available markdown elements such as headings, bullet lists, images, quotes or tables.

### Mindmap

The extension can generate a mind map structure of the document based on its header structure.

![Screenshot of the markdown editor mind map](/media/extensions/md-editor-mindmap.png)

### Diagrams (depracated)

The editor supports presenting and editing of [mermaid](https://mermaid-js.github.io/mermaid/) based diagrams:



## Live Demo

You can test it live [here](https://demo.tagspaces.com/int.html?tslid=10ades09-c7fd-zt33-fc67-a75db43rt4gz&tsdpath=demo%2FNote-Taking&tsepath=demo%2FNote-Taking%2Fcomplex-markdown-note.md).

## Used Libraries

This extension thankfully relies on the following libraries:

- [Milkdown](https://milkdown.dev/)
- [React](https://reactjs.org/)
- [Mui](https://mui.com/)

## Keyboard Shortcuts

> `Mod` is `Cmd` on macOS and `Ctrl` for Windows/Linux.

### Essentials

| Action    | Key       |
| --------- | --------- |
| Copy      | Mod-c     |
| Cut       | Mod-x     |
| Paste     | Mod-v     |
| New Line  | Enter     |
| Exit Code | Mod-Enter |
| Print     | Mod-p     |
| Save      | Mod-s     |

### History

| Action | Key         |
| ------ | ----------- |
| Undo   | Mod-z       |
| Redo   | Mod-Shift-z |

### Mark

| Action         | Key       |
| -------------- | --------- |
| Bold           | Mod-b     |
| Italic         | Mod-i     |
| Inline Code    | Mod-e     |
| Strike Through | Mod-Alt-x |

### Paragraph

| Action      | Key         |
| ----------- | ----------- |
| Normal Text | Mod-Alt-0   |
| H1          | Mod-Alt-1   |
| H2          | Mod-Alt-2   |
| H3          | Mod-Alt-3   |
| H4          | Mod-Alt-4   |
| H5          | Mod-Alt-5   |
| H6          | Mod-Alt-6   |
| Code Fence  | Mod-Alt-c   |
| Line Break  | Shift-Enter |

### List

| Action         | Key       |
| -------------- | --------- |
| Ordered List   | Mod-Alt-7 |
| Bullet List    | Mod-Alt-8 |
| Task List      | Mod-Alt-9 |
| Sink List Item | Mod-]     |
| Lift List Item | Mod-[     |

### Table

| Action               | Key       |
| -------------------- | --------- |
| Next Cell            | Mod-]     |
| Prev Cell            | Mod-[     |
| Exit Table and Break | Mod-Enter |

---

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/md-editor).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/md-editor/LICENSE.txt)

---

## Markdown Viewer


A TagSpaces extension that allows for the opening of markdown files.

## Features

- Offers different themes for displaying documents.
- Find text in the current document.
- Export the content as an HTML file.
- Zoom in and out of the content.
- Document printing.

![Screenshot of the viewerMD](/media/extensions/viewer-md-lead.png)

## Used Libraries

This extension relies on the following great projects:

- [marked](https://github.com/chjj/marked) - A markdown parser and compiler.
- [Bootstrap](https://getbootstrap.com/) - A popular CSS framework for responsive design.
- [i18next](https://www.i18next.com/) - An internationalization framework for JavaScript.
- [Mark.js](https://markjs.io/) - A library to highlight text in a document.
- [Dompurify](https://github.com/cure53/DOMPurify) - A DOM-only XSS sanitizer.

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/md-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/md-viewer/LICENSE.txt)

---

## Media Player


A TagSpaces extension that allows the playback of audio and video files.

## Features

- Play audio and video files.
- Fullscreen mode for an immersive experience.
- Automatically triggers the opening of the next file in the current folder upon finishing playback, allowing you to listen to multiple audio files continuously, just like a regular music player.

![Screenshot of the media player](/media/extensions/media-player.avif)

:::info
The supported audio and video formats depend on the underlying browser platform.
:::

## Used Libraries

This extension relies on the following excellent libraries:

- [Vidstack](https://vidstack.io/) - An advanced, customizable HTML5 media player.
- [React](https://reactjs.org/) - A JavaScript library for building user interfaces.
- [Mui](https://mui.com/) - A popular React UI framework.

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/media-player).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/media-player/LICENSE.txt)

---

## MHTML Viewer


A TagSpaces extension allowing you to open MHTML and EML files.

## Features

- Viewing of MHTML/MHT files - MHTML is a [file format](https://tools.ietf.org/html/rfc2557) for saving web pages with all the images and styling information in one single file. Saving in MHTML format is natively supported by [Chrome™](/web-clipper#enabling-the-saving-of-webpages-as-mhtml) and Internet Explorer™ browsers.
- Viewing of EML files - EML is a file format for saving emails. It is the default email export format of email apps such as Thunderbird™ or Google Mail™.
- Reader mode, extracting only the main part of the document by stripping header, footer, and navigation if available.
- Showing the creation date of the file.
- Opening the source URL of an MHTML file.
- Finding text in the current file.
- File printing.

![Screenshot of the MHTML viewer extension](/media/extensions/viewer-mhtml-lead.png)

Dialog showing the scraping details, with the ability to open the original URL in an external browser.

![Screenshot of the MHTML viewer extension](/media/extensions/viewer-mhtml-webscraping.png)

### Showing email exported in EML format

![Screenshot of the MHTML viewer extension](/media/extensions/viewer-mhtml-emlpreview.png)

## Used Libraries

This extension thankfully relies on the following great projects:

- [mailparser](https://github.com/andris9/mailparser) - A powerful library for parsing email messages.
- [Readability](https://github.com/mozilla/readability) - A library that extracts the main content of web pages.
- [Bootstrap](https://getbootstrap.com/) - A popular CSS framework for responsive design.
- [i18next](https://www.i18next.com/) - An internationalization framework for JavaScript.
- [Mark.js](https://markjs.io/) - A library to highlight text in a document.
- [Dompurify](https://github.com/cure53/DOMPurify) - A DOM-only XSS sanitizer.

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/mhtml-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/mhtml-viewer/LICENSE.txt)

---

## Mindmap Viewer


A TagSpaces extension for opening mind maps based on markdown with the help of markmap.js.

## Features

- Preview mind maps
- Zoom in and out with the mouse wheel and menu

![Screenshot of the mind map viewer](/media/extensions/mindmap-viewer-lead.png)

## Used Libraries

This extension thankfully relies on the following great libraries:

- [markmap.js](https://markmap.js.org/)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [Dompurify](https://github.com/cure53/DOMPurify)

## Installation

This extension is packaged with the new version of TagSpaces (after version 5.2).

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/mindmap-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/mindmap-viewer/LICENSE.txt)

---

## MSG Viewer


A TagSpaces extension allowing you to open email in MSG format.

## Features

- Opens emails in MSG format.
- Export the content as HTML file.
- Zoom in and out of the content.

![Screenshot of the viewer msg extensions](/media/extensions/viewer-msg-lead.png)

## Used Libraries

This extension thankfully relies on the following libraries:

- [msg.reader](https://github.com/ykarpovich/msg.reader)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [Mark.js](https://markjs.io/)
- [Dompurify](https://github.com/cure53/DOMPurify)

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/msg-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/msg-viewer/LICENSE.txt)

---

## PDF Viewer


A TagSpaces extension allowing opening, searching, and navigating through PDF files.

## Features

- Adding text and drawings on the document's pages.
- Highlighting text and areas.
- Rotating and zooming of pages.
- Showing preview of the pages.
- Showing table of contents.
- Finding text in PDF documents.
- Printing PDF documents.

:::caution
In order to save the annotations (text or drawing), you have to download the PDF document from the icon in the toolbar. Otherwise, by closing or changing the document, your changes will be lost.
:::

![Screenshot of the viewerPDF](/media/extensions/viewer-pdf-lead.png)

## Used Libraries

This extension thankfully relies on the following great projects:

- [PDF.js](https://mozilla.github.io/pdf.js/)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/pdf-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/pdf-viewer/LICENSE.txt)

---

## RTF Viewer


A TagSpaces extension allowing the opening of RTF files.

## Features

- Preview files in RTF format.
- Export the content as an HTML file.
- Zoom in and out of the content.

![screenshot of the RTF viewer](/media/extensions/viewer-rtf-lead.png)

## Used Libraries

This extension thankfully relies on the following great libraries:

- [rtf.js](https://github.com/tbluemel/rtf.js)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [Mark.js](https://markjs.io/)
- [Dompurify](https://github.com/cure53/DOMPurify)

## Installation

This extension is packaged by default with TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/rtf-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/rtf-viewer/LICENSE.txt)

---

## Slides Viewer


A TagSpaces extension for opening slides in HTML format created with reveal.js. The extension is introduced for the first time in version 5.2.3 of TagSpaces.

## Features

- Preview reveal.js slides



:::note
The extension extracts only the content of the reveal.js presentation from the HTML file and removes all the embedded and referenced JavaScript code. For the rendering of the slides, it relies on the embedded reveal.js library. This is done to reduce the risk of opening malicious HTML files. The drawback is that the reveal.js version may be outdated and not support the newest features of the latest release.
:::

## Used Libraries

This extension thankfully relies on the following great libraries:

- [reveal.js](https://revealjs.com/)

## Installation

This extension is packaged with the new version of TagSpaces (after version 5.2).

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/slides-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/slides-viewer/LICENSE.txt)

---

## Spreadsheet Viewer


A TagSpaces extension allowing you to preview the content of spreadsheet files.

## Features

- Previewing the content of the XLSX files with sheets
- Previewing the content of the ODS files with sheets
- Previewing the content of the CSV files
- Export the content as an HTML file
- Zoom in and out of the content

![screenshot of the spreadsheet viewer](/media/extensions/spreadsheet-viewer.png)

## Used Libraries

This extension thankfully relies on the following great projects:

- [SheetJS](https://sheetjs.com/)
- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [Mark.js](https://markjs.io/)
- [Dompurify](https://github.com/cure53/DOMPurify)

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/spreadsheet-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/spreadsheet-viewer/LICENSE.txt)

---

## Text Editor


A TagSpaces extension allowing editing of text-based documents.

## Features

- Opening and editing of text documents
- Syntax highlighting for the following file types: h, c, clj, coffee, coldfusion, cpp, cs, css, groovy, haxe, htm, html, java, js, ts, tsx, jsm, json, latex, less, ly, ily, lua, markdown, md, mdx, ml, mli, pl, php, powershell, py, rb, scad, scala, scss, sh, sql, svg, textile, txt, xml

![Code highlighting with the text editor](/media/extensions/text-editor-code.avif)

## Used Libraries

This extension thankfully relies on the following great libraries:

- [Monaco-editor](https://microsoft.github.io/monaco-editor/)
- [React](https://reactjs.org/) - A JavaScript library for building user interfaces.
- [Mui](https://mui.com/material-ui/) - A popular React UI framework.
- [i18next](https://www.i18next.com/)
- [Dompurify](https://github.com/cure53/DOMPurify) - library for content sanitization

## Installation

This extension is packaged with any new version of TagSpaces.

## User Manual

### Text Editor

The text editor offers code highlighting for some common programming languages. In the extension menu you will find some extras like toggling line number, adjusting the font size or toggling the wrapping for words.

![Screenshot of the editorText](/media/extensions/text-editor-main.avif)

The text editor will keep the option to print from the plain [text viewer](/extensions/text-viewer/).

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/text-editor).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/text-editor/LICENSE.txt)

---

## Text Viewer


A TagSpaces extension allowing you to preview any kind of files as text.

## Features

- Displaying the content of files as plain text.

![Screenshot of the viewerText](/media/extensions/viewer-text-lead.png)

## Used Libraries

This extension relies on the following libraries:

- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [Mark.js](https://markjs.io/)
- [Dompurify](https://github.com/cure53/DOMPurify)

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/text-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/text-viewer/LICENSE.txt)

---

## URL Viewer


A TagSpaces extension allowing you to open URL files created from web browsers or bookmark managers.

## Features

- Enables TagSpaces to be used as a bookmark management application.
- Opening links from Ubuntu's `.desktop` files, created, for example, by dragging URLs from the Chrome browser.
- Opening links from Windows' `.url` files, created, for example, by the Favorite Manager of Internet Explorer.
- Opening links from Ubuntu's `.website` files.
- With this extension, it is possible to use TagSpaces as a bookmark manager with support for tagging.

![Screenshot of the viewerURL](/media/extensions/viewer-url-lead.png)

## Used Libraries

This extension thankfully relies on the following libraries:

- [Bootstrap](https://getbootstrap.com/)
- [i18next](https://www.i18next.com/)
- [Dompurify](https://github.com/cure53/DOMPurify)

## Installation

This extension is packaged with any new version of TagSpaces.

## Source Code

The source code of this extension is freely available on [GitHub](https://github.com/tagspaces/tagspaces-extensions/tree/main/url-viewer).

## Development

If you want to extend this extension, please follow our general [extension development guide](/dev/extension-development-guide).

## License

[MIT](https://github.com/tagspaces/tagspaces-extensions/blob/main/url-viewer/LICENSE.txt)

---

## Files Overview

## File Areas

The in top area of a file you can switch between the following sub-areas:

- **[Details](#file-properties)** - opens the file properties, see more bellow.
- **[Description](#file-description)** - opens the area where you can add description for this file (opened in the screenshot bellow).
- **[Revisions](/editing-files/#file-revisions)** - visible only for editable files, display a list of all file changes.
- **[Links](/linking)** - a place where you can see all incoming and outgoing links for this file.



:::tip
Click on the tab of the currently opened area will close it, making more space for the file preview or file editing area respectively.
:::

## File Menu



The file preview toolbar offers several actions, some of which are described below:

- **(1) Reload** - Reloads the properties of the file in the file preview area.
- **(2) Download file** - If the file is on a s3 object storage, this button will start downloading process. On local files, the button will open a file save dialog, allowing you to make a copy of the file on your file system.
- **(3) Switch to fullscreen** - Opens the file preview in full screen. You can exit full-screen mode by clicking the `ESC` key on your keyboard or by clicking the round green X-button in the top-right corner of the screen.
- **(4) Toggle full width** - Toggles the file preview to full width by hiding the file browsing areas in the left panel of the app.
- **(5) Delete** - Opens a dialog where you can confirm the deletion of the file.
- **(6) Navigate to parent folder** - Opens the parent folder of the file in the main area of the application.
- **(7) Open in new window** - Opens the file in a new TagSpaces window or tab in the web version.
- **(8) Open file natively** - Opens the current file in the default application of your operating system.
- **(9) Close entry** - Will close the file properties area.

## File Properties

Clicking the **( i )** icon button will open and close the file properties area. Here, you will find details about the currently opened file such as:



- **(1) File Name** - Shows the complete name of the file, including its extension. Clicking the `Rename` button or just on the file name will allow you to change it.
- **(2) Tags** - Displays the tags added to the file. Clicking on this area will open a dropdown where you can select additional tags to assign to the file. You can also drop tags from the tag library or other files or folders here.
- **(3) Map with geo-tag** - If the file has an attached [geo-tag](/ui/taglibrary#geo-tagging), a map will be displayed, showing the exact location of the geo-tag. The map server used is configurable in the [settings](/ui/settings/#advanced) of the app.
- **(4) Date Modified** - Shows the date and time when the file was last modified.
- **(5) Size** - Displays the size of the current file.
- **(6) Path** - Shows the complete path of the file. If the file is located on an object storage location, a cloud icon instead of a suitcase will appear in front of the path. Clicking the `Move` button will open a dialog allowing you to move or copy the file to another folder.
- **(7) Sharing link** - Displays a link for [internal sharing](/sharing#internal-sharing-for-files-and-folders). Clicking `Copy` will copy the link to the clipboard so that you can share the file with other users or TagSpaces installations.
- **(8) Link for downloading**  - The `Generate link` button will open a dialog where you can generate a [link or QR-code](/sharing#sharing-download-link-to-a-file) for downloading the file. This section is visible only for files located on S3 storage.
- **(9) Thumbnail**  - Displays the current thumbnail of the file. Clicking `Change` will open a dialog where you can choose a new thumbnail. The application supports adding a custom thumbnail to any file type.
- **(10) [Entry ID](/linking)** - the file identifier used for internal TagSpaces links.

## File Description


TagSpaces PRO allows users to add descriptions to any kind of files.



:::tip
Typing the forward slash `/` will open the context menu visible in the previous screenshot, with which you can insert various text elements supported in the description editor. Pressing `cmd + s` on Mac or `command + s` Windows or Linux PCs will save the changes in the descirptions
:::

## File Thumbnails



TagSpaces can automatically generate thumbnails for many file types, as described [here](/thumbnails). Additionally, the PRO version offers a dialog where you can set a custom thumbnail for any file type, even those unsupported by the automatic [thumbnail generation](/thumbnails).



:::tip
An image in the clipboard can be used as thumbnail after pasting it in this dialog with `cmd/ctrl+v`
:::

:::info
If the file is on an S3 object storage, the thumbnail will be uploaded there.
:::

## Technical details

The description and tags are added in a [sidecar file](/dev/metafileformats#file-meta-description-format) located in the hidden `.ts` folder within the current folder. This file has the same name as the original file with additional `.json` at the end.

The `.ts` folder contains also the thumbnail images of the files. The thumbnail files have also the same name as original file but with `.jpg` at the end.

For some file format like PDF, the `.ts` folder can have a sidecar file containing the text content of the original file. This files has the same name as original file with additional `.txt` at the end. These files are used for speeding-up the search and for some AI functionalities.

```
~ some-folder
├── .ts
│   ├── file5.png.json - contains tags and description for file.png
│   ├── file5.png.jpg - is the thumbnail image for file5.png
│   ├── file6.pdf.json - contains tags and description for file6.pdf
│   ├── file6.pdf.txt - contains the extracted text content of file6.pdf
│   ├── file6.pdf.jpg - is the thumbnail image for file6.pdf
│   └── tsm.json
├── file5.png
└── file6.pdf
```

---

## Folders Overview

Folders play an essential role in TagSpaces that goes beyond typical file grouping and organization. We have enhanced their functionality by adding tagging, description, custom background, thumbnail, wallpaper, and a default perspective. This allows you to turn every folder into a so-called **file-based app**, depending on the files stored within it.

## Folder Areas

The in top area of a folder you can switch between the following sub-areas:

- **[Details](#folder-properties)** - opens the folder properties, see more bellow.
- **[Description](#folder-description)** - opens the area where you can add description for this folder (opened in the screenshot bellow).
- **[AI Chat](/ai#ai-chat-in-folders)** - this is the place for the folder's own AI chat, this tab is visible only if the AI functionality is enabled.
- **[Links](/linking)** - a place where you can see all incoming and outgoing links for this folder.



## Folder Menu

The toolbar for folders can be seen in the following screenshot:



The following actions can be accessed from the toolbar:

- **(1) Reload folder** - Reloads the folder properties.
- **(2) Open in main area** - Opens the folder in the main area of the application. This is useful if you have navigated away from the folder opened in the preview area.
- **(3) Open in new window** - Opens the folder in a new window or tab in the web version.
- **(4) Open folder externally** - Opens the folder in the default file manager of your operating system, not available for S3 locations.
- **(5) Toggle full width** - Opens the folder properties in full width, giving more space for AI tasks, writing description.
- **(6) Delete folder** - Starts the process for deleting the current folder along with its files and subfolders.
- **(7) Close entry** - Closes the folder properties area.

## Folder Properties

The folder properties section is similar to the file properties area.



- **(1) Folder Name** - Displays the complete folder name. Clicking the **RENAME** button will make the name editable.
- **(2) [Tags](/tagging#folder-tagging)** - Displays the folder's tags. Clicking on this area opens a dropdown to assign additional tags, or you can drag and drop tags from the tag library or other files and folders.
- **(3) Map with geo-tag** - If geo-tagged, a map with a droppin shows the exact [geo tag](/ui/taglibrary/#geo-tagging). The map tile server is configurable in the [settings](/ui/settings/#advanced).
- **(4) [Description](#folder-description)**  - Displays the folder description. Opening this tab will allow you to add description for the folder.
- **(5) Date modified** - Shows the last modified date and time of the folder.
- **(6) Size** - Displays the calculated size of the folder, including subfolders. This feature is unavailable on object storage locations.
- **(7) Path** - Shows the complete folder path. For object storage locations, a cloud icon is shown instead of a suitcase. Clicking **MOVE** opens a dialog to move or copy the folder.
- **(8) Sharing link** - Shows the internal sharing [link](/sharing#internal-sharing-for-files-and-folders). Clicking **COPY** copies the link to your clipboard for sharing with others or other TagSpaces installations.
- **(9) [Default folder perspective](#default-folder-perspective)**  - Lets you specify the default perspective for this folder.
- **(10) [Background color](#folder-background)**  - Displays the folder's background color. Clicking the color area opens a dialog to change the folder's color.
- **(11) [Thumbnail](#folder-thumbnail)**  - Displays the folder's current thumbnail. Clicking **CHANGE** opens a dialog to select a new thumbnail.
- **(12) [Background Image](#folder-wallpaper)**  - Shows a preview of the folder's wallpaper. Clicking **CHANGE** allows you to choose a new wallpaper.
- **(13) [Entry ID](/linking)** - the folder identifier used for internal TagSpaces links.

## Folder Description



Folders can be annotated with descriptions, useful for adding additional information to files or folders. Descriptions are managed in the a separate tab in the folder' properties area.

The folder descriptions can be edited by clicking the **EDIT** button or by double-clicking directly in the description area. The description text can contain [Markdown](https://en.wikipedia.org/wiki/Markdown), allowing you to add basic formatting, [links](/linking), and lists to the content.



The descriptions are indexed by the search algorithm and considered in search results. If a given file or folder has a description, the first few words from it are displayed in the grid perspective.

## Default Folder Perspective



Every folder can have its own default perspective, which can be selected in the folder properties area.



Once you choose a perspective, every time you open this folder, it should open with the selected perspective.

## Folder Background



With this feature, every folder in TagSpaces can have its own background color or gradient. In addition to tagging, you can use colors to mark folders for particular use cases or areas of work. For example, you can differentiate your personal folders from your work folders using color or mark folders containing sensitive or important information.



In the previous screenshot, you can see a preview **(1)** of the background color. Clicking the preview will open the dialog shown in the screenshot. **(2)** switches between editing a color or a color gradient. **(3)** shows a set of 4 predefined backgrounds, and with button **(4)**, the background can be cleared.

The folder background is visible in grid, list, gallery, and kanban perspectives, even when the folder is shown as a subfolder.



## Folder Thumbnail



In TagSpaces Pro, users can manually set a thumbnail for any file or folder. This can be achieved in a dedicated dialog, where you can choose an image from your hard drive or from thumbnails embedded in the application. The images used here are based on the [illlustrations.co](https://illlustrations.co) kit. In this dialog, you can also clear the folder's thumbnail.

:::info
If the folder is on an S3 bucket, the selected thumbnail file will be uploaded there.
:::



:::tip
An image in the clipboard can be used as thumbnail after pasting it in this dialog with `cmd/ctrl+v`
:::

Adding a custom thumbnail to any file type can be achieved similarly from the file's properties section.

## Folder Background Image


Folders can have background images (wallpapers) in TagSpaces Pro. The background images are supported in the Grid, List, Gallery and Kanban [perspectives](/browsing-files).



The background image can be changed in the folder properties, where you can open the dialog for changing the wallpapers.



:::tip
An image in the clipboard can be used as background for a folder after pasting it in this dialog with `cmd/ctrl+v`
:::

Some wallpapers are bundled with the application, but you can also choose an image from your hard drive. In the dialog, you also can also clear any previously selected wallpapers.

:::info
If the folder is on an S3 bucket, the wallpaper file will be uploaded there.
:::

## Technical details

The folder descriptions, id, background color, preferred perspective and tags are saved in a [sidecar file](/dev/metafileformats#folder-meta-description-format) called `tsm.json` within the hidden `.ts` folder of the current folder.

The `.ts` folder contains also the thumbnail images of the files. The thumbnail files have also the same name as original file but with `.jpg` at the end.

```bash
  ~ folder1
  ├── sub-folder2
  │   └── .ts
  │       └── tsm.json - can contains tags and description for sub-folder2
  ├── .ts
  │   ├── file4.docx.json - can contain tags and description for file4.docx
  │   ├── tsb.jpg - is the background image for the folder1
  │   ├── tst.jpg - is the thumbnail image of the folder1
  │   └── tsm.json - contains tags and description for some-folder1
  └── file4.docx
```

---

## Installing TagSpaces

Here you will learn how to install TagSpaces on different operating systems.

## Getting the Application

The free versions of TagSpaces are available for download from the [Downloads Section](https://www.tagspaces.org/downloads/) on the TagSpaces website. Here, you can quickly find the appropriate installer for your operating system (Windows, macOS, Linux, Android, Firefox, and Chrome).

:::tip
**Download the newest PRO release:** TagSpaces PRO customers should use the download links provided in their purchase confirmation email. These links will always point to the latest available PRO version.
:::

### New Version Notification

When a new version of the application is available, you will see a notification in the lower-left corner of the app. Clicking the **Get It Now** button will direct you to the TagSpaces website download page, where you can obtain the latest community version. **TagSpaces Pro** users should use the links in their order confirmation email to access the latest version or follow this [link](https://tagspacesstore.onfastspring.com/account).



:::tip
If you prefer not to have TagSpaces check automatically for new versions, you can disable this functionality in the [settings](/ui/settings).
:::

## Installation on Windows

The Windows version of TagSpaces is distributed as either an `.exe` installer or a `.zip` archive file. The `.exe` file can be directly executed to start the installation. The `.zip` archive must be unzipped into a folder on your system. In the unpacked folder, you will find a file named `tagspaces.exe`, which can be executed with a double-click.

The installer is signed with modern software certificates, ensuring authenticity. By a right click on installer and choosing **Properties**, you can check the certificate of the installer, see the screenshot for orientation.



:::tip
The **profile** folder under Windows is located here: `C:\Users\Your_User_Name\AppData\Roaming\TagSpaces`
:::

### Updating the Windows version

To update, replace the contents of your current installation with the contents from the zip file of a newer release. Your tag library and locations are stored in the user's home folder, so you won’t lose any data during the update process.

## Installation on macOS

For macOS, you can [download](https://www.tagspaces.org/downloads/) the 64-bit versions of TagSpaces for either Intel or Apple Silicon (ARM) processors. After downloading, double-click the zip file in Finder to properly unpack it. Some users have reported issues unpacking the app with third-party zip utilities, so it’s recommended to use Finder.

:::tip
The **profile** folder under macOS is located here: `~/Library/Application Support/TagSpaces`
:::



### Updating the macOS version

To update, replace the contents of your current installation with the files from the zip archive of the new release. Your tag library and locations are stored in the user's home folder, ensuring no data loss during updates.

## Installation on Linux

The Linux version of TagSpaces is available as a `tar.gz` archive, an `AppImage`, and a `.deb` file for Debian-based distributions like Ubuntu. All versions are available for download [here](https://www.tagspaces.org/downloads/).

To install:

- For the `tar.gz` file, unpack it into a folder on your system. In the unpacked folder, you’ll find a `tagspaces` executable, which can be run with a double-click or via terminal.
- For the `.deb` package, double-click to install or use the following command:

```bash
sudo dpkg -i tagspaces-linux-amd64-x.x.x.deb
```

For the AppImage, make it executable first:

```bash
chmod +x tagspaces-linux-x86_64-x.x.x.AppImage
```

Then, you can launch it with a double-click.

:::tip
The **profile** folder under Linux/Ubuntu is located here: `~/.config/TagSpaces`
:::

### Updating the Linux version

To update the **tar.gz** version, replace the contents of your current installation with the files from the new release. Your tag library and locations are persisted in the user's home folder. For distribution packages, simply reinstall over the current version.

## Installation on Android

:::caution
The Android version is meanwhile **deprecated**, we still are still releasing new versions, but we are not actively developing the app anymore.
:::

A version of the Android app is available as an [APK file](https://www.tagspaces.org/downloads/) in the download section of our website.

To install the APK file, follow these steps on your Android phone:

1. Go to **Settings**.
2. Open the **Security & privacy** option.
3. Scroll down and find **Install from unknown apps**. If it’s not there, try looking under **More**.
4. You should see a list of apps. Find your browser (e.g., Firefox or Chrome).
5. Tap on your browser and choose **Allow from this source**.

If the above steps do not work, try the following:

1. Go to **Settings**.
2. Open **Apps & Notifications** and select **Configure apps**.
3. Scroll down and tap on **Advanced options** or **Special app access**.
4. Scroll to the bottom and find the **Install unknown apps** option.
5. Select your browser, tap on it, and enable **Allow from this source**.

Once these steps are done, download and install the APK from our [download section](https://www.tagspaces.org/downloads) using your configured browser.

:::caution
**Risks of installing apps outside the Play Store:** Installing apps from outside the Google Play Store can expose your phone to potential security risks, including viruses. Always ensure you are downloading from trusted sources.
:::

## Installing the Firefox Browser Extension

Download the [TagSpaces Add-on for Firefox](https://addons.mozilla.org/en-us/firefox/addon/tagspaces/). Open the **Add-ons tab** in Firefox from the main menu by clicking on the puzzle icon, or simply type `Ctrl+Shift+A` (or `Command+Shift+A` on macOS). In the new tab, go to the settings dropdown next to the search bar and select **Install Add-on From File...**. Choose the downloaded file and follow the instructions.

Once installed, you can start the add-on from the TagSpaces icon in the top-right corner of your browser or through **Tools > TagSpaces** in the main menu.

> **Updating the Firefox Add-on:** Once a newer version of the Firefox add-on is approved by Mozilla, it will automatically be installed on your Firefox browser.

## Installing the Chrome Browser Extension

You can install the Chrome extension directly from the [Chrome Web Store](https://chrome.google.com/webstore/detail/tagspaces-web-clipper/ldalmgifdlgpiiadeccbcjojljeanhjk).

> **Updating the Chrome Extension:** Once a new version of the Chrome extension is published on the Chrome Web Store, it will be automatically installed on your Chrome browser.

## Running in Portable Mode

The Windows, macOS and Linux versions of TagSpaces can run in "portable mode," allowing you to use the application from a USB stick or other portable devices. In this mode, all configuration data (such as tags, tag groups, and location connections) is stored in a folder called `tsprofile` within the same directory where the application is started, rather than in the home directory of the operating system.

### On Windows and Linux

To start the portable mode, use the `tagspacesp.cmd` script on Windows or `tagspacesp` on Linux. These scripts are usually found in the unpacked application folder. On Linux, you may need to make the script executable by running:

```bash
chmod +x tagspacesp
```

If the files are not included in the distributed packages, they can be downloaded from the following locations:

- [tagspacesp (Linux)](https://raw.githubusercontent.com/tagspaces/tagspaces/develop/resources/tagspacesp)
- [tagspacesp.cmd (Windows)](https://raw.githubusercontent.com/tagspaces/tagspaces/develop/resources/tagspacesp.cmd)

Once downloaded, place these files in the same directory where the TagSpaces executable is located.

### On macOS

Extract the content of the DMG files, to the place where you want to have the portable version, e.g. a USB stick. Open the command line for this folder and run:

```bash
./TagSpaces.app/Contents/MacOS/TagSpaces -p
```

This will start the app in portable mode and create the `tsprofile` folder in the current folder. All the setting for the portable version will be stored in this folder.

### Updating the Portable Version

To update a portable version of TagSpaces (e.g., on a USB stick), you simply need to replace the existing files and directories with the updated ones from the new installation package. Since the tag library and locations are stored in the `tsprofile` folder during portable mode, special care should be taken to preserve this folder during the update. Follow these steps to upgrade:

1. Rename your existing `tagspaces` folder (e.g., to `tagspaces_old`).
2. Extract the new TagSpaces zip file, which will create a fresh `tagspaces` folder.
3. Copy or move the `tsprofile` folder from the old `tagspaces_old` directory into the newly created `tagspaces` folder.

:::caution
**Important:** Do **not** delete the `tsprofile` folder as it contains crucial data for your portable TagSpaces setup.
:::

### Portable Mode with the AppImage Package (Linux Only)

The AppImage package offers another way to run TagSpaces in portable mode. AppImages are a distribution format that allows applications to run on various Linux distributions. This package format has its own [portable mode](https://docs.appimage.org/user-guide/portable-mode.html), which can be activated by creating an empty folder with the same name as your AppImage file, followed by `.config`.

For example, if your AppImage file is named `tagspaces-linux-x86_64-6.0.2.AppImage`, create an empty folder called `tagspaces-linux-x86_64-6.0.2.AppImage.config` in the same directory. This structure would look like:

```bash
tagspaces-linux-x86_64-6.0.2.AppImage
tagspaces-linux-x86_64-6.0.2.AppImage.config
```

From this point on, TagSpaces will store all configuration information in the `.config` folder instead of the default config folder in the user’s home directory. This setup allows you to run the application from, for example, a USB stick with the same configuration on different computers.

## TagSpaces Command Line Tool

This section has been moved [here](/dev/command-line-tools).

---

## User Documentation


Welcome to the official documentation for **TagSpaces**! 

This guide will help you explore and understand the features, philosophy, and use cases of TagSpaces products.

## What is TagSpaces?

**TagSpaces** is an open-source, cross-platform file manager, organizer, and browser, designed with a no-backend and no-login philosophy. It empowers you to organize files, photos, and documents using tags on various platforms and devices. With a consistent and user-friendly interface, TagSpaces allows you to organize files according to your personal logic and preferences.



## Key Features

- Platform-independent and future-proof tagging for files and folders
- Add descriptions to files and folders in a platform-independent way
- Integrated free text and tag search (supports AND, OR, and NOT operators)
- Viewers for a variety of image, video, audio, and document file formats
- Editors for HTML, text, and markdown files
- Support for user interface themes (including dark mode)
- Thumbnail previews for numerous file types

## Philosophy - Offline first

- **No Backend, No Login:** TagSpaces follows a no-backend, no-login philosophy, meaning it works entirely offline without needing an internet connection.
- **Local File System as a Backend:** TagSpaces is a front-end application that uses your file system (or object storage) as the backend.
- **Database-Free:** Metadata is stored in your files and folders, preventing data loss in case of crashes, and eliminating vendor lock-in.
- **Sync-Friendly:** Use cloud services like Dropbox, NextCloud, or Google Drive to easily synchronize tagged files between devices.
- **Searchable:** Tags stored in filenames can be searched using your operating system's search functionality.

## Product Landscape
TagSpaces offers several products to cater to different user needs:
- **[TagSpaces Lite](https://www.tagspaces.org/products/lite/):** The community-developed edition of TagSpaces for Windows, macOS, and Linux.
- **[TagSpaces Pro](https://www.tagspaces.org/products/pro/):** An extended solution with advanced features for power users.
- **[TagSpaces Pro Web](https://www.tagspaces.org/products/proweb/):** A self-hosted package for managing files on web infrastructure with object storage support.
- **[TagSpaces Custom](https://www.tagspaces.org/products/custom/):** Tailored for enterprise use.
- **[Web Clipper Extension](https://www.tagspaces.org/products/webclipper/):** Available for Chrome, Firefox, and Edge, this extension allows you to save webpages, webpage fragments, and screenshots as local files.
- **[Android App (deprecated)](https://www.tagspaces.org/downloads/):** A mobile app offering most of the desktop version's features on Android devices.

## Common Use Cases

TagSpaces is suitable for various use cases:
- Organizing files and folders
- Desktop search
- Note-taking
- Photo management
- Bookmark management
- Simple file manager
- eBook organizer

## Videos

This short introductory video shows TagSpaces in action:



### YouTube Channel

We maintain a [YouTube channel](https://www.youtube.com/channel/UCzfSaeg-7mpt96UI97zwbfQ) where we publish videos related to TagSpaces.

## Technology Stack

The front-end of TagSpaces is built with:

- JavaScript / TypeScript / HTML / CSS
- React / Redux / [MUI](https://mui.com/material-ui/)

Native APIs for file access are based on:

- Desktop versions for Windows, macOS, and Linux, powered by [Electron](https://www.electronjs.org/)
- Mobile versions for Android, powered by [Cordova](https://cordova.apache.org/)
- Web versions for managing files in object storages, powered by [AWS SDK for JavaScript](https://aws.amazon.com/sdk-for-javascript/)

---

## Link to files, folders and locations



One long-awaited feature in TagSpaces is the ability to create links between files, folders, and locations. Now, you can navigate seamlessly from one file to another, or to a folder or location. The description field of any file or folder can contain links to other entities. If you're using markdown for notes, you can also place these kinds of links directly into your markdown file content.



The context menu for every file and folder in the default perspective includes the option **Copy Sharing Link**, which generates a sharing link and copies it to your clipboard. This link can be used to create internal links to this file inside TagSpaces.



### Location IDs

:::info
When sharing links between TagSpaces users, make sure that the locations in their TagSpaces installation have the **same IDs**; otherwise, the links will not work. These links also work in folders synced with services like Dropbox or Syncthing.
:::

You can change the location ID in the location's properties, as shown in the following screenshot. For S3 locations, ensure that the location connects to the same subfolder of the connected bucket.



### Links in the web versions of TagSpaces

Users of the web versions can directly copy the URL from their browser or use the copy button in the properties area.



:::info
Copying the URL from the browser has an advantage: the person receiving the link can open the same installation directly in their browser.
:::

### Opening TagSpaces links from the search

If you've received a TagSpaces link (e.g., a tslink) in an email or chat, you can copy and paste it into the search field. Running the search will open the location, file, or folder the tslink points to.



### Under the hood

TagSpaces links can point to locations, files, or folders. They follow these formats:

```bash title="Link to a location"
ts://?tslid=53ea7417-4f7c-9c25-dc44aa41f6c8

ts://?tslid=53ea7417-4f7c-9c25-dc44aa41f6c8
```

```bash title="Sharing link for a file"
ts://?tslid=53ea7417-4f7c-9c25-dc44aa41f6c8&tsepath=%2FMyHome%2Ftodos%5B202109%5D.md
```

```bash title="Sharing link for a folder"
ts://?tslid=53ea7417-4f7c-9c25-dc44aa41f6c8&tsdpath=%2FPersonal%20Knowledge
```

:::info
In version 5.1, the protocol prefix for links was changed from ts:? to ts://? for better compatibility. Links created in older versions with ts:? are still supported for backward compatibility.
:::

Technically the links consist of some parameter embedded in the URL.

- `ts://?` - Indicates that this is a TagSpaces link (tslink).
- `&tslid` - Represents the TagSpaces location ID.
- `&tsepath` - Encoded relative path to the entry.
- `&tsdpath` - Encoded relative path to the folder.
- `&tseid` - The unique id of a file or folder.

:::tip
Renaming or deleting a file or folder linked in a tslink will make the link unusable. However, TagSpaces will attempt to open the valid part of the link (e.g., the location). If the tslink contains a `tseid`, a search for this id will be offered by the application, so if a file or a folder with this id is still in the location it will be found.
:::

---

## Style Guide

## Markdown Syntax

To serve as an example page when styling markdown based Docusaurus sites.

## Headers

# H1 - Create the best documentation

## H2 - Create the best documentation

### H3 - Create the best documentation

#### H4 - Create the best documentation

##### H5 - Create the best documentation

###### H6 - Create the best documentation

The corresponding markdown:

```
# H1 - Create the best documentation

## H2 - Create the best documentation

### H3 - Create the best documentation

#### H4 - Create the best documentation

##### H5 - Create the best documentation

###### H6 - Create the best documentation
```

---

## Emphasis

Emphasis, aka italics, with _asterisks_ or _underscores_.

Strong emphasis, aka bold, with **asterisks** or **underscores**.

Combined emphasis with **asterisks and _underscores_**.

Strikethrough uses two tildes. ~~Scratch this.~~

The corresponding markdown:

```
Emphasis, aka italics, with _asterisks_ or _underscores_.

Strong emphasis, aka bold, with **asterisks** or **underscores**.

Combined emphasis with **asterisks and _underscores_**.

Strikethrough uses two tildes. ~~Scratch this.~~

```

---

## Lists

1. First ordered list item
1. Another item
   - Unordered sub-list.
1. Actual numbers don't matter, just that it's a number
   1. Ordered sub-list
1. And another item.

- Unordered list can use asterisks

* Or minuses

- Or pluses

The corresponding markdown:

```
1. First ordered list item
1. Another item
   - Unordered sub-list.
1. Actual numbers don't matter, just that it's a number
   1. Ordered sub-list
1. And another item.

- Unordered list can use asterisks

* Or minuses

- Or pluses
```

---

## Links

[I'm an inline-style link](https://www.google.com/)

[I'm an inline-style link with title](https://www.google.com/ "Google's Homepage")

[I'm a reference-style link][arbitrary case-insensitive reference text]

[You can use numbers for reference-style link definitions][1]

Or leave it empty and use the [link text itself].

URLs and URLs in angle brackets will automatically get turned into links.

Some text to show that the reference links can follow later.

[arbitrary case-insensitive reference text]: https://www.mozilla.org/
[1]: http://slashdot.org/
[link text itself]: http://www.reddit.com/

The corresponding markdown:

```
[I'm an inline-style link](https://www.google.com/)

[I'm an inline-style link with title](https://www.google.com/ "Google's Homepage")

[I'm a reference-style link][arbitrary case-insensitive reference text]

[You can use numbers for reference-style link definitions][1]

Or leave it empty and use the [link text itself].

URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com/ or  and sometimes example.com (but not on GitHub, for example).

Some text to show that the reference links can follow later.

[arbitrary case-insensitive reference text]: https://www.mozilla.org/
[1]: http://slashdot.org/
[link text itself]: http://www.reddit.com/

```

---

## Images

Here's our logo (hover to see the title text):

Inline-style: ![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")

Reference-style: ![alt text][logo]

[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"

Images from any folder can be used by providing path to file. Path should be relative to markdown file.

![img](../static/img/logo.svg)

The corresponding markdown:

```
Inline-style: ![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")

Reference-style: ![alt text][logo]

[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"

![img](../static/img/logo.svg)

```

---

## Code

```javascript
var s = "JavaScript syntax highlighting";
alert(s);
```

```python
s = "Python syntax highlighting"
print(s)
```

```
No language indicated, so no syntax highlighting.
But let's throw in a tag.
```

```js {2}
function highlightMe() {
  console.log("This line can be highlighted!");
}
```

---

## Tables

Colons can be used to align columns.

| Tables        |      Are      |   Cool |
| ------------- | :-----------: | -----: |
| col 3 is      | right-aligned | \$1600 |
| col 2 is      |   centered    |   \$12 |
| zebra stripes |   are neat    |    \$1 |

There must be at least 3 dashes separating each header cell. The outer pipes (|) are optional, and you don't need to make the raw Markdown line up prettily. You can also use inline Markdown.

| Markdown | Less      | Pretty     |
| -------- | --------- | ---------- |
| _Still_  | `renders` | **nicely** |
| 1        | 2         | 3          |

The corresponding markdown:

```
| Tables        |      Are      |   Cool |
| ------------- | :-----------: | -----: |
| col 3 is      | right-aligned | \$1600 |
| col 2 is      |   centered    |   \$12 |
| zebra stripes |   are neat    |    \$1 |

| Markdown | Less      | Pretty     |
| -------- | --------- | ---------- |
| _Still_  | `renders` | **nicely** |
| 1        | 2         | 3          |
```

---

## Blockquotes

> Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.

Quote break.

> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can _put_ **Markdown** into a blockquote.

---

## Inline HTML

Definition list
Is something people use sometimes.
Markdown in HTML
Does *not* work **very** well. Use HTML tags.
--- ## Line Breaks Here's a line for us to start with. This line is separated from the one above by two newlines, so it will be a _separate paragraph_. This line is also a separate paragraph, but... This line is only separated by a single newline, so it's a separate line in the _same paragraph_. --- ## Admonitions :::note This is a note ::: :::tip This is a tip ::: :::important This is important ::: :::caution This is a caution ::: :::warning This is a warning ::: --- ## Powered by MDX You can write JSX and use React components within your Markdown thanks to [MDX](https://mdxjs.com/). export const Highlight = ({children, color}) => ( {children} ); Docusaurus green and Facebook blue are my favorite colors. I can write **Markdown** alongside my _JSX_! --- ## FolderViz Perspective This perspective is a collection of views that apply information visualization techniques to analyze and represent files, folders and tags. While this perspective started as a showcase of TagSpaces' capabilities for developing custom solutions, some of its features may also be beneficial for end users. The perspective currently offers five views, accessible from the main toolbar located as usual on the top of the perspective. **Clicking** on a file or folder will display an overlay showing a thumbnail (if available) and additional details. Double-clicking on a folder will navigate to it, while **double-clicking** on a file will open it in the file preview area. **Click and drag** on the view will move the visualization. **Scrolling** with the mouse will zoom in and out. Click on the **legend** elements on the top of the visualization will toggle the visibility of the corresponding entries in the graph. In the **vertical menu** located in the top left part of the views you will find some useful commands, like redrawing the graph, changing its appearance or hiding the vertical menu in order to not have it on screenshots. The colors of the files are the same use for the file extension and can be configured in the [settings](/ui/settings/#file-types). The color of the tags are coming from the [tag library](/ui/taglibrary). ## Folder Tree View This shows an expanded, folder tree, similar to MindMap. While useful for visualizing folder hierarchies, it may struggle with performance in folders with many files. ## Circular Folder Tree View Shows the same information like the folder tree view but in a circular tree. ## Links Graph View This view uses the index created by the full-text search in a given location to show links between files and folder and their links to external website. The arrow connecting linked entries show the direction of the link. Only file and folder participating in a link will be displayed here. :::info - Full-text search should be enabled for the location in order to have a link extraction. - The links are extracted from files in plain text, Markdown, HTML or PDF formats and from the description of any files or folder. - The links between the files and folder should be in the in the tagspaces' [link format](/linking) in order to be displayed here. ::: ## Tags Graph View The visualization show all the used tags with the tagged entries in a given location. Double-click on a tag will start a search for this tag and will show the files and folder tagged with it. ## Treemap View The TreeMap View represents files and folders as tiles, where the size of each tile corresponds to the file size relative to others in the same folder hierarchy. This provides a visual understanding of file sizes in relation to the root and each other. --- ## Gallery Perspective This perspective offers basic image gallery functionality, including previewing images from the current folder and a presentation mode with full-screen viewing. :::tip This perspective can only be activated in folders containing images and photos in file formats such as JPG, PNG, GIF, BMP, SVG, WEBP, etc. ::: ## Functionalities in the Toolbar The toolbar of the gallery perspective offers the following functionalities: - **(1) Navigate to parent folder** - Opens the parent folder of the current folder. - **(2) Switch to masonry view** - Returns to the initial masonry view. - **(3) Folder properties** - Opens the [properties](/ui/userinterface#folder-properties) of the current folder. - **(4) Open previous/next image** - Navigates to the previous or next image file in the current folder. - **(5) Start/stop presentation mode** - Toggles the slideshow presentation mode, displaying images from the current folder for 3 seconds each. (Future releases will allow configurable durations.) - **(6) Full screen mode** - Opens the currently selected file in full screen mode. - **(7) File properties** - Opens the properties of the current file in the regular properties area. - **(8) Thumbnail bar modes** - Toggles through thumbnail bar positions: at the top, on the left, or hidden. These modes apply in full screen mode as well. - **(9) Import EXIF/IPTC** - Opens the dialog to import EXIF/IPTC information from your files. - **(10) Help** - Opens this page for further guidance. :::tip In full-screen mode, you can navigate through the files using the left and right arrow keys on your keyboard. On touch-screen devices, images can be changed by swiping left or right. ::: ## Importing EXIF/IPTC Data from JPGs Many digital cameras embed additional metadata, such as geolocation, in the photos they capture. One common format for this metadata is [EXIF](https://en.wikipedia.org/wiki/Exif). Another format is [IPTC](https://en.wikipedia.org/wiki/IPTC_Information_Interchange_Model), which is often used for embedding keywords and descriptions in JPG files. The gallery perspective can read and convert the following data into TagSpaces' tags: - **EXIF geolocation** - Converts latitude and longitude into geo-tags using [Plus Code](https://maps.google.com/pluscodes/) or MGRS format. - **EXIF shooting date and time** - Converts the shooting date and time into a date-time tag. - **IPTC keywords** - Imports IPTC keywords as regular tags. --- ## Grid Perspective This perspective is optimized for general browsing through file and folder structures while supporting common file management operations such as tagging, renaming, deleting, copying, and moving files and folders. The default view in TagSpaces presents content in a grid, making it the most common way of displaying folders. ![screenshot of the default perspective of the app](/media/grid/grid-lead.avif) ### File Tile Each tile in the grid represents the following information: - **(1)**: Displays tags added to the file. - **(2)**: Shows file description, if available. - **(3)**: Displays the file title (filename without extension or tags). - **(4)**: Shows the file extension, color-coded based on settings in the [File types tab](/ui/settings#file-types). - **(5)**: Indicates the last modified date of the file. - **(6)**: Shows the file size, hovering over it reveals the size in bytes. - **(7)**: Indicates file selection (with a green border). - **(8)**: Displays a file thumbnail, if available. - **(9)**: Highlights a [geo-tag](/ui/taglibrary/#geo-tagging) with a special icon. ![A tile of a file](/media/grid/file-tile.svg) :::info Adding descriptions and geo-tags to a file is a feature available in the Pro versions of the app. ::: ### Folder Tile Similar to file tiles, folder tiles display the following: - **(1)**: Shows tags added to the folder. - **(2)**: Displays the folder description, if available. - **(3)**: Shows the folder name and, if set, the [custom color](/ui/userinterface#folder-properties-area). - **(4)**: Displays a folder icon (instead of a file extension). - **(5)**: Displays a folder thumbnail, if available. - **(6)**: Shows selection status for the folder. ![A tile representing a folder](/media/grid/folder-tile.svg) :::info Adding descriptions and thumbnails for folders is a feature available in the Pro versions of the app. ::: ### Selecting Files Files can be selected by holding the `CTRL` / `CMD` key and clicking on them. To select a range, hold `SHIFT`, click on the first file (_file 1_), then click on the second file (_file 2_). This selects all files between _file 1_ and _file 2_. To select or deselect all files, use the first button in the perspective's toolbar or press `CTRL+A` / `CMD+A`. ![Folder with selected files and subfolders](/media/grid/folder-with-selected-entries.png) ## Perspective Toolbar The toolbar at the top of the perspective contains the following buttons and sub-menus: - **(1) Open parent folder** - Navigates to the parent folder of the current folder, if within the current location. This action can also be achieved by pressing the **BACKSPACE** key. - **(2) Toggle File Selection** - Selects or deselects all files and folders in the perspective. - **(3) Open Folder Properties** - Opens the folder properties. - **(4) Add/Remove Tags** - Manages tags on selected files, applicable to multiple files simultaneously. Learn more in the [Tagging -> Tagging using context menus](/tagging#tag-operations-on-many-entries) section. - **(5) Copy/Move Entries** - Opens the **Move or Copy Entries** dialog to specify the target directory for moving or copying files. - **(6) Delete Files** - Opens a dialog to confirm the deletion of selected files. - **(7) Sort Files** - Opens a menu to sort files by the following options: - **Title** - Sorts alphabetically by name. - **Size** - Sorts by file size. - **Date Modified** - Sorts by last modified date. - **First Tag** - Sorts alphabetically by the first tag. - **File Ext.** - Sorts alphabetically by file extension. - **Random** - Sorts files randomly, useful when using TagSpaces as a music player for random audio track playback. :::tip Clicking a sorting option twice reverses the sort order. For random sorting, this regenerates a new random order. ::: :::info Sort order is preserved when navigating to a new folder. ::: - **(8) Export as CSV** - Feature is described [below](#export-files-as-csv). - **(9) Open Perspective Settings** - Opens the perspective settings dialog, described [below](#perspective-settings). ## File Context Menu Right-clicking a file opens the context menu with options for file management. ![The context menu of a file](/media/grid/file-context-menu.png) - **Open File** - Splits the main area of TagSpaces, opening the file in the right pane. Learn more in the [Viewing Files](/viewing-files) section. - **Open Parent Folder** - Useful in search results to open the parent folder of a selected file. - **Open File Natively** - Opens the file in the default external application. - **Show in File Manager** - Opens the file in your operating system’s default file manager. - **Add/Remove Tags** - Opens a dialog to manage tags for the file. - **Rename File** - Opens a file renaming dialog. - **Duplicate File** - Creates a copy of the file, with tags for "copy" and timestamp (e.g., "20210831T1230"). - **Move/Copy File** - Opens the move/copy dialog. - **Use as Thumbnail for the Current Folder** - Sets the file’s thumbnail as the folder thumbnail. - **Delete File** - Opens a deletion confirmation dialog. - **Copy Sharing Link** - Copies an internal sharing link for the file to your clipboard. ## Folder Context Menu Right-clicking a folder opens its context menu for folder management. ![The context menu of a folder](/media/grid/folder-context-menu.png) - **Open Folder** - Navigates to the selected directory. - **Open in New Window** - Opens the folder in a new TagSpaces window or tab (web version). - **Rename Folder** - Opens the folder renaming dialog. - **Move/Copy Folder** - Opens the dialog to move or copy the folder. - **Delete Folder** - Opens a deletion confirmation dialog. - **Show in File Manager** - Opens the directory in the default file manager. - **Use as Thumbnail for Parent Folder** - Sets the folder’s thumbnail as the parent folder thumbnail. - **Copy Sharing Link** - Copies a link for internal sharing or linking. - **Add/Remove Tags** - Opens the dialog to manage folder tags. - **Folder Properties** - Opens the folder properties in the preview area. ## Perspective Settings Adjust the grid perspective settings in the dialog below. Settings Options - **Show Folders** - Toggles folder visibility. - **Show Tags on Files and Folders** - Shows/hides tags as small colored circles. - **Show Descriptions for Files and Folders** - Shows/hides descriptions. - **Show Folder Details** - Shows/hides folder details. - **Toggle Thumbnail Modes** - Switches between "cover" and "contain" modes for thumbnails. "Cover" may crop thumbnails, while "contain" shows the entire image with possible transparent bars. - **Sort** - Choose default sorting for the perspective. - **Compact Mode** - Condenses display mode with reduced space for file/folder representation. - **Default Mode** - Standard display mode. - **Large Mode** - Enlarges file/folder representation. - **Single Click Opens File Internally** - Opens files in the application with a single click. - **Single Click Opens File Externally** - Opens files in an external application with a single click. - **Single Click Selects Only** - Selects the file without opening it. :::info Double-clicking always opens a file in the preview area or navigates to a folder. ::: At the bottom of the dialog, you’ll find these options: - **Help** - Opens this page from the online documentation. - **Set as Default** - Saves the settings as the default for all folders with this perspective. - **Set for This Folder** - Saves the current settings for the folder, so these options will be applied upon opening. The dialog also indicates if the current folder has custom settings. You can reset them using the **Reset Custom Settings** button. ### Example Configurations A common arrangement found in file browsing applications is the grid. The grid view offers a resizable grid with thumbnail previews of certain file formats, for quick and effective browsing. The files and folder are represented by user interface element called cards. The following screenshot shows the grid view in its **compact mode**. The thumbnails are in the so called **cover** mode, covering the whole area defined for the thumbnail. In order to achieve this effect this mode will more likely cut some of the border areas of the thumbnail's image. The folder details is turned on in the screenshot. ![](/media/grid/grid-perspective.png) The next screenshot shows the grid view in its **large mode**. The thumbnails here are in the **contain** mode, which displays the whole thumbnail in the thumbnail area of the card, eventually causing transparent bars to appear on the left and right side of the thumb image. The folder details is turned off in the screenshot. ![](/media/grid/grid-view-large-mode.png) ## Drag to move within TagSpaces An alternative way to move files into another folder is to drag it icon onto a folder on the **Folder navigation** area on the left panel. When the folder lights up with a greenish hue, just release the dragged item, and the file will be immediately moved into that folder. :::tip You can access sub folders of any folder displayed in the hierarchy, by clicking the folder icon next to its name. ::: ## Export files as CSV With this feature you can export the list of file and folder from the current folder or from the current search results as CSV file. This will allow you to process the information annotations you have entered in TagSpaces such as tags and description in other tools. The export can be started by clicking on the button from the main toolbar of the default perspective, marked on the next screenshot. The exported file contains the following columns: - **name** - name of the entry - **is file** - true if the entry is a file, false if it is folder - **file extension** - only for files - **tags** - a semicolon separated list of tags - **size** - in bytes - **last modified date** - ISO8601 compatible timestamp of the last modification - **full path** - the full path to the current entry - **description** - the entry description in markdown format --- ## Kanban Perspective This perspective shows the first five subfolders of the current folder as columns of a Kanban board. Additional subfolders can be turned on later. The cards in the columns represent the files of the subfolders and can be used to organize tasks or other items. The cards can be moved between columns via drag and drop. Moving cards within a column will persist their order. Columns themselves can also be moved via drag and drop. ## Why is this useful? Kanban boards have many potential uses. Here are some typical examples: - **Personal Kanban** - **Tracking software development** - **Task management** - **Recruiting process board** - **Weekly plan** – Have each day of the week as a column and track activities or document progress like a diary. ## General functionalities Below is a description of the buttons in the main toolbar of this perspective: - **Navigate to parent folder** – Self-explanatory. - **Folder properties** – Opens the folder properties in the right panel, allowing you to add tags, descriptions, and set the background color or custom wallpaper for the current folder. - **Show the content of the current folder** – Useful for distributing files from the current folder into the columns (subfolders). - **Toggle visibility of subfolders** – Displays the content of the current folder as an additional column on the far left. Useful for moving files from the current folder to other columns. - **Import Kanban board** – Opens a dialog for importing a Trello board. Details are provided below. - **Perspective settings** – Opens a dialog with settings specific to the Kanban perspective. ## Actions for Columns Beyond moving columns via drag and drop, there are additional actions for each column. In the bottom right corner of every column, there's a plus icon that opens the dialog for [creating files](/creating-files). ![Actions for columns](/media/kanban/column-actions.png) The three-dot icon in the top-right corner of each column opens a menu with the following options: - **Hide** – Hides the column. You can show it again using the toolbar button mentioned earlier. - **Move Left** – Switches the column with the one to the left. - **Move Right** – Switches the column with the one to the right. - **Reload Folder** – Reloads the content of the folder. - **Show in File Manager** – Opens the default file manager of your operating system with the preselected folder. - **New File / Note** – Opens the dialog for creating new files. - **Folder Properties** – Opens the folder properties, where you can change the background color, set a wallpaper image, or choose a thumbnail for the folder. ## Migration of Trello Boards This perspective includes an importer for Trello boards exported as JSON files. To use a Trello board in TagSpaces, you must first export it as JSON. This can be done by navigating to the board's menu (top-right corner) and selecting "More," then "Print and export," and finally "Export as JSON." Save the file locally for easy access during import. ![Export Trello board as JSON file](/media/kanban/trello-json-export.png) Once you have the JSON file on your computer, open TagSpaces, navigate to the folder where you want to import the Trello board, and switch to the Kanban perspective. Click the "Import Kanban" button and select "Choose Trello JSON file" from the dialog. ### Mapping the Trello Board to Files and Folders | Trello | TagSpaces | Comment | | ------ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Card | Markdown file | For each card, a text file in markdown format is created, including: description, checklist, link to attachments, link to the original card in Trello, and the timestamp of the import. | | Column | Folder | The order of the tasks in the columns is preserved as they are imported into the Kanban folders. | | Labels | Tags | The labels of the exported board are imported as [location-based tags](/ui/taglibrary/#location-tags). The importer tries to preserve the colors of the labels. All labels are transformed to lowercase by the importer. | ## Perspective Settings The settings for this perspective can be accessed from the last button in the perspective's toolbar. ![Kanban perspective settings](/media/kanban/kanban-perspecitve-settings.png) The following options can be adjusted in the settings dialog: - **Show folders** – Displays subfolders as columns, if available. - **Show tags** – Toggles between showing the full name of the tags or just a symbol indicating the presence of tags. - **Show content of the current folder** – Toggles the display of the current folder column on or off (same as the button in the toolbar). - **Show folder details** – Displays the name and a preview of the folder description above the columns of the board. - **Toggle thumbnail modes** – Switches between two modes for displaying thumbnails on the cards: cover and contain. - **Size of the files/tasks in the column** – Adjusts the width of the tiles between compact, default, and large. - **Definition of the single click** – Customizes the behavior of single-click actions. --- ## List Perspective This perspective is optimized for general browsing through files and folders and performing standard file and folder operations. It features three representation modes: compact, default, and large. The following information can be found on every row representing a file in this view: - **File extension** - A color-coded icon, representing the file type. Scroll down to [Color-coded file extensions](#color-coded-file-extensions) to learn more about this feature. - **Folder icon** - On rows representing folders, instead of the file extension, a folder icon is displayed. - **Title** - The file's title, which is the filename without the extension or any tag information. - **Description** - If the file/folder has a description, it will be displayed here. - **Tags** - All the tags that are applied to the file will appear here, with the correct background and font color. To learn more about tag colors, refer to the [Tag Library](/ui/taglibrary) section. - **Size** - The file size, displayed in a human-readable format. - **Date modified** - The time the file was last modified. :::info The functionalities of the list perspective are very similar to the **[grid perspective](/perspectives/grid)**. Please follow the previous link for more details. ::: ## Customizations ## Compact mode ## Perspective Settings Perspective settings are described in the [grid perspective](/perspectives/grid#settings-options). --- ## Mapique Perspective This perspective is useful for visualizing geo-tagged files and folders. Here are some ideas for which this perspective can be used: - Saving favorite places privately - Planning trips and places to visit - Showing pictures taken on trips - Placing any file or document on a map - Adding private annotations to a map ## Supported Maps The default map shown when opening this perspective is provided by [OpenStreetMap](https://www.openstreetmap.org/). An optional topological map is provided by [OpenTopoMap](https://opentopomap.org/) and looks as shown in the following screenshot. ## User Interface From the main toolbar of this perspective, the user can access the following functionalities: - **Parent folder** - Will open the parent folder in this perspective if possible. - **Details** - Will open the properties of the current folder. - **Extract geo tags** - Start the extraction of geo coordinates from JPG files with embedded EXIF/IPTC located in the current directory. - **Geo tag current folder** - Takes the location of the current map center and adds it as a geo tag in [Plus Code format](https://en.wikipedia.org/wiki/Open_Location_Code) to the current folder. - **Change the map type** - Clicking this button will iterate through the currently supported map types, which for now include: OpenStreetMap (default) and topographical. - **Show folders** - Will show the a list of all sub-folders of the current folder, so you can navigate to them. This is useful if some of the folders are not geo-tagged or currently not visible on the map. - **Help** - Clicking this button will open this page. Clicking on the popup of a file on the map will open the file in the previewing area of TagSpaces, where you can add or change the file description, rename the file, or choose another thumbnail. The following screenshot shows a comparison. ### Smart Pin Icon With the help of a small pictogram, you can directly recognize if the pin is for a file or a folder. The small tile in the center represents the first tag of the file or folder with its color. This allows you to visually recognize tagged files and folders. In the following screenshot, for example, each pin represents a geo-tagged file representing one person. The first tag is the year of birth, with the years organized in decades using different colors. The colored pins on the map help illustrate the age distribution of these individuals, which could allow for building clusters. ## Navigating Tagged Folders Since TagSpaces supports tagging of folders, you can geo-tag folders, making them displayable in the Mapique perspective. In the following screenshot, you can see that folders have a dedicated icon, differentiating them from files. Clicking on a folder icon will open a small popup, which when clicked, will navigate to the selected folder. Not all folders have geo tags, so the Mapique perspective only shows files and folders with such tags. This can be problematic when trying to navigate through a folder tree. To address this, a new button has been added to the main toolbar of the Mapique perspective. This button toggles an overlay displaying all subfolders of the current folder. Once turned on, the user can seamlessly navigate deep within a folder tree, even if there are no geo tags. The following video demonstrates how this works. ## Encoding Geo Tags By default TagSpaces uses [Plus Codes](https://en.wikipedia.org/wiki/Open_Location_Code) for encoding geo locations. Plus codes encode coordinates such as **48°08'27.8"N 11°34'53.6"E** into a short string like **8FWH4HRJ+CJ**, making the format ideal for use as tags. As alternative the geo tags can be encoded in [MGRS](https://en.wikipedia.org/wiki/Military_Grid_Reference_System) format. --- ## Quick Access # Quick Access Area The quick access section can be accessed from the left drawer and looks like this: This section contains the following areas: - **[Stored Search Queries](/search#stored-search-queries)** - contains prepared search queries for a later use, more on this in the [search section](/search/#stored-search-queries) - **[Bookmarks](/bookmarks)** - contains a list of bookmarked files and folders, more on this in the [bookmark section](/bookmarks) - **Recently opened files** - contains a list of recently opened files - **Recently edited files** - contains a list of recently edited files - **Recently opened folders** - contains a list of folders opened in the details section Since version 6.6 every bookmarks or recently visited entries have its own context menu containing the following operations: - **Open entry** - will open the entry in the current application window - **Open in new window** - will open the entry in a new application window or browser tab if on the web version. - **Copy the link to the clipboard** - will copy the link of the bookmarked file to clipboard, so it can be shared will somebody else working on the same files - **Remove** - will remove the file or folder from the list ## Configuring the recently opened entries The amount of the collected files can be adjusted in the advanced tab of the settings. Here you can also clear the history or deactivate the collection of the recent entries by choosing the _disabled_ menu item in dropdowns. --- ## Search Overview In order to offer desktop search functionalities, TagSpaces provides a variety of search-related features, which are described in this section. With the search functionality, you are able to find files and folders by their name, tags, and other properties. The search algorithm considers different weights for the following properties of the [indexed](#indexing) entries: - The name of the file or the folder - The tags assigned to the file or the folder - The description added to the file or the folder - The name of the parent directory of a given file is also considered by the search algorithm. For example, if you are searching for photos from your vacation in the USA and the folder where these files are located contains the word USA (e.g., '20160301 vacation usa'), the search will list all the files located directly in this folder. - The content of TXT, MD, and HTML files if the [full-text search](#full-text-search) is activated for the current location. ## Open the search The user can start a search by switching to the search area by pressing the `Ctrl+F` / `Cmd+F` key combination. It can also be opened by clicking on the search text field. Once activated, you can start entering the tags or other search [terms](#search-query). If you choose to enter tags with the `+` symbol, you will see suggestions **(1)** and you can choose from them with the arrow `UP` and `DOWN` keys. The search can be started by hitting the `ENTER` key or by clicking on the search button **(4)**. You can close the search mode with the `ESC` key or by clicking on the X-button **(3)**. The **advanced search options**, visible in the next screenshot, can be accessed after clicking on the button with the sliders **(2)** from the previous screenshot. ## Search query The search query consists of two parts. The first one is just a simple free text that is searched in the index. The second component is a list of tags. Here, you can define a more precise query by including and excluding tags. You can use the following shortcuts to add, remove, or exclude certain tags: - `+` - Will add the tag to the **Must contain all of the tags** field - logical AND - `|` - Will add the tag to the **At least one tag** field - logical OR - `-` - Will add the tag to the **None of these tags** field - logical exclusion The tags specified here will be visible in the search options described in the previous [paragraph](#search-for-tagged-entries). Example search queries: - **"+usa +beach -sunset jpg"** - Will find all files and folders having `jpg` in the name and having the `usa` and `beach` tags but not the `sunset` tag. - **"|beach |sunset"** - Will find all files and folders having the tags `beach` or `sunset`. ### Search query composition As usual, the search can be opened by the `CTRL+SHIFT+F` (`⌘+SHIFT+F` on Mac) key binding. The opened dropdown has two sections. The first is called **Actions**, which will be described below, and the second is **Search query composition**. This allows you to easily compose complex search queries, combining or excluding tags, choosing file size limits, types, and details. The following commands are currently supported: - **AND tag** - Typing `+` will show the list of all tags in the dropdown so you can select tags that should be present in every file or folder in the search results. - **NOT tag** - Typing `|` will show the list of all tags in the dropdown so you can select tags that may be present in files or folders in the search results, e.g., files tagged with "tag1" or "tag2." - **OR tag** - Typing `-` will show the list of all tags in the dropdown so you can select tags that should be excluded from the search results. - **File type** - Typing `t:` will present a list of supported file type groups, helping to narrow down the search results to documents, images, etc. - **File size** - Typing `s:` will present a list of predefined file sizes. - **Last modified** - Typing `lm:` will present a list of predefined points back in time. - **Search scope** - Typing `sc:` will allow you to choose from the following search scopes: current folder, current location, global search in all locations. - **Search accuracy** - Typing `a:` will allow you to toggle the search accuracy between fuzzy, semi-strict, or strict. ### App actions In the search menu, you can also start some common actions just by using your keyboard. The following commands are currently supported: - **Locations** - Typing `l:` will list the current locations, allowing you to easily find and open one by typing the first few letters. - **Filter** - Typing `f:` will filter the current content of the folder without starting a new search. - **History** - Typing `h:` will list the last opened or edited files so you can filter and open one of them. - **Bookmarks** - Typing `b:` will allow you to filter and open your bookmarked files or folders. - **Saved search query** - Typing `q:` will allow you to filter and start your saved search queries. - **Search history** - Typing `s:` will allow you to find and execute search queries you have used in the past. ### Search scope The search algorithm can be required to deliver results for the following search scopes: - **Location** - will deliver results from the current location. This is the default scope. - **Folder** - will deliver results for the current folder, including all sub-folders. - **Global** - will search in all configured locations. You can find more in the [Global Search](#global-search) section. ### Search accuracy The following three types of searches are supported: - **Fuzzy** - will deliver broader search results, tolerating typos in the search query. - **Strict** - will deliver exact search results. - **Semi-strict** - similar to strict but case insensitive. ### Search for tagged entries To support detailed search for tags, the user interface for entering them is split into three input fields: - **Must contain all of the tags** - all tags listed here must be attached to the files or folders for them to appear in the search results (**logical AND**). - **At least one tag** - any file or folder containing one of the tags listed here will be included (**logical OR**). - **None of these tags** - entries with any of the tags listed here will be excluded from the search results (**logical exclusion**). ## Search filters ### Filter by file type In the file type dropdown, you can specify which types of files to search. The file types are grouped into the following sections: - **Pictures and Photos**: e.g., JPG, PNG, GIF - **Documents**: e.g., PDF, ODF, DOCX, EXL - **Notes**: e.g., MD, TXT, HTML - **Audio files**: e.g., OGG, MP3, WAV - **Video files**: e.g., WEBM, OGV, MP4 - **Archives**: e.g., ZIP, RAR, TGZ, 7Z - **Bookmarks**: e.g., URL, LNK - **eBook**: e.g., EPUB, MOBI, AZW, PRC - **Emails**: e.g., EML, MSG In addition, there are special filters: - **Folders** - limits the search to only folders. - **Files** - limits the search to only files. - **Untagged files and folders** - displays only files and folders that are not tagged. ### Filter by file size In this dropdown, you can filter files by their size. The following options are supported: - **Empty** - filters files with zero size. - **Tiny** - filters files smaller than 10KB. - **Very small** - filters files smaller than 100KB. - **Small** - filters files smaller than 1MB. - **Medium** - filters files smaller than 50MB. - **Large** - filters files smaller than 1GB. - **Huge** - filters files larger than 1GB. ### Filter by creation and last modified date Here you can specify the time period in which the files you're searching for should have been modified. This filters supports the following options: - **Today** - shows files and folders modified today. - **Yesterday** - shows results modified yesterday. - **Past 7 days** - shows results modified in the last 7 days. - **Past 30 days** - shows results modified in the last 30 days. - **Past 6 months** - shows files and folders modified in the last 6 months. - **Past year** - shows files and folders modified in the last 12 months. - **More than one year** - shows files and folders older than one year. ### Filter by time period This filter limits search results to files and folders that have date-time tags pointing to a certain time period. ### Filter by GPS coordinates This filter is planned. ## Indexing TagSpaces has an integrated file and folder search functionality based on an **index**, which is created when you hit the search button. By default, the index is valid for 10 minutes. This time can be adjusted individually in the properties of each [location](/ui/locations/#local-locations). The idea is that some locations may contain files that do not change often, so a longer validity period, like 1 month, can be applied. If your location contains a large number of files (>50,000), it is recommended to split it into two or more locations or to [disable the indexing](/ui/locations#local-locations). If you decide to disable automatic indexing, you should manually update the index regularly to maintain working and accurate search functionality. The index can be updated in the following ways: - In the menu of each location in the location manager, there is an item called "Refresh Location Index." - All indexes can be updated at once from the search menu with the option "Update all location indexes." - Create the index manually with the [command line tools](/dev/command-line-tools). ## Limit the search results By default, TagSpaces limits the number of search results to 1,000 files and folders. This limitation also applies to the maximum number of files that can be displayed in a single folder. In the [general](/ui/settings#general) tab of the settings, there is a field where you can increase or decrease this limit. See the next screenshot. ## Full text search TagSpaces PRO supports full text search for text (.TXT), markdown (.MD), HTML and searchable PDF files. You can activate this feature for each location individually in the "Edit Location" dialog, as seen in the following screenshot. Once activated (see the screenshot below), during the indexing of a given location, the application will extract the text content of the supported files and create a keyword list that will be considered in the search algorithm. :::caution On locations with many large text files, activating this feature may slow down the application's performance, so be careful where you activate it. ::: These file formats are currently supported: - **HTML** - files in HTML format, used for rich text notes. - **MD** - markdown files. - **TXT** - plain text files. - **PDF** - searchable PDF documents (already OCR-ed). :::caution This feature is still in beta and could lead to performance issues if you have many or large text files. ::: ## Global search TagSpaces Pro offers searching across all locations, called "Global search." It works on both local and remote S3-based locations. You can activate this feature by clicking the _Global_ button in the search area, as shown in the following screenshot. Once in _Global search_ mode, you will see an additional option called "Force re-indexing all locations." Activating this checkbox will force TagSpaces to create a new index for each location before searching in it. This option delivers the most accurate search results but may take more time, especially when re-indexing remote locations or locations with many files. All other search settings work the same as in single location searches. The [search result limit](#limiting-the-search-results) applies here; once the limit is reached, TagSpaces will stop the search and not continue searching the remaining locations. :::info If you are in the context of a given [workspace](/workspaces), the global search will deliver only result from the location assigned to the current workspace. ::: ## Search history This feature can be activated in the app's advanced settings, where you can choose how large the search history should be. Once activated, the app will save the last searches performed, including the search query and the location where they were executed. The search history can also be **disabled** by choosing _disabled_ from the dropdown or **deleted** by clicking the trash bin icon. ## Stored search queries This feature allows you to store commonly used search queries for later use. The following video demonstrates how to use this feature. :::tip Stored searches are location-independent, meaning they can be executed on any location. ::: ### Create stored searches ### Edit stored searches ### Export and import This functionality allows you to share commonly used search queries with others who are working with you on the same file base. In the three-dot menu of the stored search area, you will find menu entries for exporting and importing search queries. The file format for the export is JSON, which can be opened and edited with any modern text editor. If needed, you can fine-tune the search queries in the editor and distribute them to other TagSpaces installations for yourself or colleagues. Due to the unique IDs associated with search queries, TagSpaces can recognize if the query has already been imported, allowing you to skip the re-import or import the newer version. An example export can be found in the [documentation](/dev/metafileformats#format-of-the-exported-search-queries). --- ## Setup Self-hosted TagSpaces based on WebDAV :::caution Deprecated functionality: The here described functionality is not supported anymore. ::: ## Motivation Almost since the very first releases of TagSpaces back in the 2013, many users did requested a server based version of TagSpaces. They wanted to use the convenient tagging workflow of TagSpaces on their self hosted Nextcloud/ownCloud or in general WebDAV instances. So starting from today this is possible, TagSpaces can now run on servers and once installed you can access your files from anywhere. ## Download and Installation The current version can of the WebDAV version can be downloaded from [here](https://github.com/tagspaces/tagspaces/releases). > **Note** Please handle the current status of the implementation is a technology preview, which in our opinion is still not suitable for production use on Internet. In order to use the hosted version you need a working WebDAV server. The current release was tested with success on [ownCloud](http://owncloud.org) which is based itself on the [sabre/dav](http://sabre.io) WebDAV server. On Ubuntu the installation steps are as following: - Install Apache webserver (_nginx_ webserver with its webdav extension is reported also to work) - Install [Nextcloud](https://nextcloud.com/install/)/[ownCloud](https://owncloud.org/install) or any other WebDAV server - Unzip the hosted version of TagSpaces somewhere in the www root folder of Apache. Currently the TagSpaces should be on the same host/ip and using the same port as the WebDAV server. This is so because of the XSS prevention build in the modern internet browsers. - Assuming _ownCloud_ is installed in `/var/www/owncloud` and TagSpaces in `/var/www/tagspaces` you have to type something like this in your terminal: ``` cd /var/www sudo chmod -R 755 tagspaces sudo chown -R your_www_group:your_www_user tagspaces ``` - Open your browser and enter: `127.0.0.1/tagspaces`. The TagSpaces UI should be loaded. - Create a new location with the following path: `/owncloud/remote.php/webdav` - Give a name to your location and save. - A dialog for credentials entering will appear. Enter here your ownCloud username and password. - That's all, you can now browse your files in TagSpaces. :::tip If the dialog prompting for the user credentials does not appear and you have running Nextcloud/ownCloud in some other browser tab, you have to logout there and reload the tab running TagSpaces. ::: ![screenshot of tagspaces showing the hosted edition](/media/tagspaces-webdav-edition.png) It is interesting to mention that you can open also your ownCloud contacts by creating a location with a path like `/owncloud/remote.php/carddav/addressbooks/ilian/contacts`. This does not make currently much sense, because you only see a list with VCF files, but who knows perhaps somebody will write a contacts perspective and VCF viewer for TagSpaces some day. ## Demo You can experience a live demo of the TagSpaces webdav version on [demo.tagspaces.org](http://demo.tagspaces.org). The username and password are both `demo`. ## Sharing links to files from the webdav version tbd ![sharing files from the webdav edition](/media/tagspaces-webdav-edition-sharing.png) ![open shared file from the webdav edition](/media/tagspaces-webdav-sharing-open.png) ## Starting the WebDAV edition locally for testing There is a script called `webdavserver.js` located in the data/web , which can be started with: node data/web/webdavserver.js or npm run webdav This command will start a local node.js based WebDAV server on `http://127.0.0.1:8000`. Open your browser and enter the following URL: http://127.0.0.1:8000/index.html You will be prompted for user credentials, which are username: `demo` and password: `demo` and now you should be able to work with the WebDAV version of TagSpaces. --- ## Share files and folders You can share files in two ways, and here is how it can be done. ## Internal sharing for files and folders The first method, introduced back in version 3.8, is called "Sharing." It allows you to share links to files and folders with other TagSpaces users and installations. These links will work for object storage locations or local locations synced with tools such as Dropbox, Google Drive, or Syncthing. A key requirement is that these locations must have the [same location ID](/linking#location-ids). Once copied to the clipboard with the **COPY** button, the link can be shared, for example, via email or messenger. The recipient must open TagSpaces, paste the link into the search box, and press enter. Alternatively the **Open Link** button from the next screenshot can be used for this purpose. :::info These kinds of links can also be used for internal links within TagSpaces. More details can be found in the dedicated [linking section](/linking). ::: ## Download links for files on object storage The second type of sharing links, called "Links for downloading," are available only for files (not folders) located on object storages such as AWS S3 or MinIO buckets. The relevant section in the file properties is shown in the next screenshot. Clicking the **Generate Link** button opens the following dialog: Here you have the following options: - Adjust the **validity duration** of the link. Supported durations include: 15 minutes, 1 hour, 1 day, 3 days, and 1 week. - The **Copy** button copies the link to the clipboard for use in other applications. - A **QR-code** of the link is automatically generated. Changing the duration will regenerate the QR-code. The generated link can be shared via chat or email. When opened in a browser, the download will be initiated. If the link expires, the user will see this message: ### Downloading directly in locations It is possible to download files via links directly into a TagSpaces location, bypassing the browser. Click on the **Create new** button and from the menu choose **New From URL** This will open the following dialog, where you can paste the URL and start the download with the **OK** button. ### Downloading to your phone You can also download files to your phone or tablet. Point your device’s camera at the QR-code, and it will automatically recognize the link, allowing you to open it in your mobile browser. This is an easy way to transfer files from object storage to mobile devices. ## Sharing multiple files at once To share files from a folder, a selection of files, or search results, you can use the "Share many files" feature. This functionality is available in the [Grid](/perspectives/grid), [List](/perspectives/list), and [Kanban](/perspectives/kanban) perspectives. To open the sharing dialog, click the sharing icon in the toolbar or select the share option from the context menu in these perspectives. The dialog generates sharing links that are valid for 3 days by default. You can adjust the validity duration to 15 minutes, 60 minutes, 1 day, 3 days, or 7 days. After expiration, the links will no longer work. TagSpaces does not offer permanent sharing links. The center of the dialog, surrounded by a dashed line, shows a preview of the generated HTML snippet. If the shared files have thumbnails, they will be displayed; otherwise, the filenames will be shown. The expiration date of the links is displayed at the top of this area. At the bottom of the dialog, you have the following options: - **Copy to clipboard** - Copies the generated code with the links to the clipboard, so you can paste it into an email or chat application. - **Save as HTML** - Saves the generated code locally as an HTML file, which can be attached to an email. - **Save & Share** - Saves the generated HTML file to the S3 bucket and opens the sharing dialog, allowing direct sharing of the file. - **Close** - Closes the dialog. - **Help** - Opens this help page in the online documentation. :::caution If the links have not expired, anyone with the code snippet can access and download the shared files. So be cautious with whom and how you share this code. ::: ### Using the HTML snippet in email clients Here is how the HTML snippet appears when pasted into some common email clients. #### Thunderbird :::info In Gmail, make sure to uncheck the "Plain text mode" option, as marked in the screenshot below, to ensure the links are recognized. ::: #### Gmail #### Outlook ### Using the HTML snippet in chat apps This is how the HTML snippet looks when pasted into common chat applications. #### Signal #### Whatsapp --- ## Supported file formats The following table lists the supported files types for viewing and editing of files in TagSpaces. ## 3D formats File format Preview Thumbnail Edit Extension STL yes yes, after opening the file no 3D Viewer OBJ yes yes, after opening the file no 3D Viewer GLB yes yes, after opening the file no 3D Viewer GLTF yes yes, after opening the file no 3D Viewer ## Image formats File format Preview Thumbnail Edit Extension PNG yes yes no Image Viewer JPG yes yes no Image Viewer SVG yes yes no Image Viewer GIF yes yes no Image Viewer AVIF yes yes no Image Viewer WEBP yes yes no Image Viewer BMP yes yes no Image Viewer TGA yes yes no Image Viewer ICO yes yes no Image Viewer TIF yes yes no Image Viewer DNG yes yes no Image Viewer CR2 yes yes no Image Viewer NEF yes yes no Image Viewer PSD yes yes, after opening the file no Image Viewer ## Documents formats File format Preview Thumbnail Edit Extension PDF yes yes no PDF Viewer MD/MARKDOWN yes no yes MD Editor,{" "} MD Viewer or{" "} Text Editor RTF yes no no eBook Viewer HTML yes yes no HTML Viewer RTF yes no no eBook Viewer DOCX yes yes no Document Viewer XLSX yes yes no Spreadsheet Viewer ODS yes yes no Spreadsheet Viewer CSV yes no no Spreadsheet Viewer ## Audio / Video formats File format Preview Thumbnail Edit Extension WEBM yes yes no Media Player MP4 yes yes no Media Player ACC yes no no Media Player FLAC yes no no Media Player OGG yes no no Media Player OGV yes no no Media Player OGA yes no no Media Player OGV yes no no Media Player OGX yes no no Media Player SPX yes* no no Media Player OPUS yes* no no Media Player MKV yes no no Media Player 3GP yes yes no Media Player 3G2 yes no no Media Player ## eBook formats File format Preview Thumbnail Edit Extension EPUB yes yes no eBook Viewer ## Bookmark formats File format Preview Thumbnail Edit Extension URL yes yes no URL Viewer DESKTOP yes no no URL Viewer WEBSITE yes no no URL Viewer ## Email formats File format Preview Thumbnail Edit Extension EML yes no no MHTML Viewer MSG yes no no MSG Viewer ## Archive formats File format Preview Thumbnail Edit Extension ZIP yes yes no Archive Viewer ## Font formats File format Preview Thumbnail Edit Extension TTF yes yes, after opening the file no Font Viewer WOFF yes yes, after opening the file no Font Viewer OTF yes yes, after opening the file no Font Viewer ## Text and source code formats File format Preview Thumbnail Edit Extension TXT yes no yes Text Editor XML yes no yes Text Editor JS yes no yes Text Editor JSON yes no yes JSON Editor CSS yes no yes Text Editor H yes no yes Text Editor CLJ yes no yes Text Editor COFFEE yes no yes Text Editor CPP yes no yes Text Editor CS yes no yes Text Editor GROOVY yes no yes Text Editor HAXE yes no yes Text Editor JAVA yes no yes Text Editor JSM yes no yes Text Editor LESS yes no yes Text Editor LUA yes no yes Text Editor ML yes no yes Text Editor MLI yes no yes Text Editor PL yes no yes Text Editor PHP yes no yes Text Editor PY yes no yes Text Editor RB yes no yes Text Editor SH yes no yes Text Editor SQL yes no yes Text Editor --- ## Organizing Files and Folders with Tags ## Why Tagging? Tagging is a versatile approach to organizing files and folders. Unlike predefined categories, tagging lets users label items with words that reflect their personal understanding. It enhances searching and helps categorize files like songs, books, documents, and more in a user-defined way. Tags are personal, providing the freedom to define and group files as you see fit. Tagging is more than just organization; it's a way of expressing your thoughts and emotions. Instead of conforming to someone else's categories, you define what matters to you. Think of it as a form of personal expression or even a type of "freedom of speech." One of the core functionalities in TagSpaces is the ability to add tags to files and folders. Unlike other products, **TagSpaces does not rely on a central database for storing tags**. Instead, it offers two alternative methods, which are described in the following sections. ## File Tagging TagSpaces supports two methods for tagging files: embedding tags in file names and using sidecar files. Both methods work on any file type and across all supported operating systems. ### Storing Tags in File Names This method embeds tags directly into the file name. For example, adding the tags `vacation` and `alps` to an image named `IMG-2653.jpg` will rename it to `IMG-2653[vacation alps].jpg`. **Advantages:** - **Durable and Portable:** Tags persist across platforms like Dropbox and Google Drive. - **Compatibility:** Tags are visible and searchable using any file browsing software. **Drawbacks:** - **File Path Length Limitations:** Some operating systems (like Windows) restrict the file path length to around 256 characters, which can limit how many tags you can add. Once embedded in the name of file, the tag stick there and can be removed only by file renaming. **This makes the tagging "durable" and portable**. The tags embedded in the name of a file "survives" synchronization across cloud platforms such as Dropbox and Google Drive and can be read by TagSpaces or any other file searching software on Windows, macOS or Linux. :::tip File name tagging may run into limitations due to file path length restrictions on certain operating systems like Windows. ::: ### Storing Tags in Sidecar Files As an alternative to embedding tags in file names, TagSpaces allows storing tags in sidecar files within a hidden `.ts` folder. This can be activated in the settings for all locations or per location in the properties of every location. When tagging a file, TagSpaces will create a corresponding sidecar file with the same name as the source file but with a `.json` extension. For example: ``` ~ location (with your files) ├── subfolder1 │ ├── .ts │ │ ├── file1.jpg.json <-- contains the tags and the description for file1.jpg │ │ └── file2.pdf.json │ ├── file1.jpg │ └── file2.pdf ├── .ts │ ├── file3.png.json │ └── file4.docx.json ├── file3.png └── file4.docx ``` **Advantages:** - **File Integrity:** Tags are stored separately, preserving the original file name. - **Unlimited Tags:** There is theoretically no limit to the number of tags you can add. **Drawbacks:** - **Manual Maintenance:** If files are moved or renamed outside of TagSpaces, you must also move or rename the corresponding sidecar files manually. - **Synchronization Issues:** Hidden `.ts` folders may not sync with cloud services unless explicitly enabled. :::tip To sync `.ts` folders with cloud services like Dropbox or Google Drive, enable the synchronization of hidden folders and files. ::: ## Folder Tagging Tags added to folders are always saved in sidecar files. The file is located in the `.ts` subfolder and is called `tsm.json`. ``` ~ location (with your files) ├── subfolder1 │ ├── .ts │ │ ├── tsm.json <-- contains tags and description for subfolder1 │ │ └── file2.pdf.json │ └── file2.pdf ├── .ts │ └── file4.docx.json └── file4.docx ``` :::tip To sync `.ts` folders with cloud services like Dropbox or Google Drive, enable the synchronization of hidden folders and files. ::: ## Tag Operations on Multiple Entries To add or remove tags from multiple files or folders, first, select them by holding the CTRL/CMD key and clicking on the entries with the left mouse button. You can also use checkboxes in the list view. Once selected, right-click on the files and choose `Add / Remove Tags` from the context menu, or click the `Tags` button in the toolbar. This will open a popup dialog for managing tags. The options in the dialog are: - **Clean all tags:** Removes all tags from the selected files. - **Remove tags:** Removes the specified tags. You have to manually enter the tags which you want to be remove from the selected files. - **Add tags:** Adds the specified tags to the selected files. ### Adding Multiple Tags at Once You can add multiple tags at once by separating them with commas in the tagging dialog. ## Tagging in File and Folder Properties Area Tags can also be added in the properties area by selecting them from a dropdown or dragging them into the tagging area. To remove a tag, click the open the three-dots menu next to the tag and choose `Remove tag`. ## Tagging with Drag and Drop Tagging can also be performed using drag-and-drop. Here are the supported operations: ### Dragging a tag from the tag library to a file or folder This action is supported in the [grid](/perspectives/grid), [list](/perspectives/list) and [kanban](/perspectives/kanban) perspective. ### Dragging a tag to the tagging section of the details area This actions is supported in the details of files and folders and can be initiated from the tag library or from a file or folder in the [grid](/perspectives/grid) and [list](/perspectives/list) perspectives ### Dragging a tag from one file or folder to another This action is supported in the [grid](/perspectives/grid) and [list](/perspectives/list) perspectives. --- ## Thumbnail Generation When a user opens a folder, the application automatically scans its contents and attempts to generate mini-previews, or thumbnails, for the files in the folder. ## Thumbnails on Local Folders When you navigate to a folder, TagSpaces will try to generated automatically thumbnails for the supported file types in this folder. The following file types are supported, a full list can be found [here](/supported-file-formats). - **Images:** PNG, JPG, BMP, GIF, SVG, WEBP, TIFF - **Videos:** WEBM, OGV, MP4, M4V - **Notes:** HTML (utilizing embedded screenshots, if created with the TagSpaces [Web Clipper](/web-clipper/)) - **Text Files:** TXT, MD, source code files (using the first lines found in the file) - **Bookmarks:** URL (using the embedded screenshot, if created with the TagSpaces [Web Clipper](/web-clipper/)) - **Ebooks:** EPUB (using the integrated ebook cover image) - **Archives:** ZIP (using the first image found in the archive) - **Office Documents:** PDF, ODT, ODP, ODS, DOCX, XLSX, PPTX (using embedded preview images, if available) The generated thumbnails are stored in the `.ts` folder located within each folder you browse. This caching mechanism significantly improves the speed of browsing folders containing many files. Thumbnail generation can be enabled or disabled in the application settings. ## Thumbnails on S3 Locations When you upload files to an S3 location, TagSpaces will attempt to generate thumbnails during the upload process. --- ## How to use Cloudflare R2 buckets as locations [Cloudflare](https://www.cloudflare.com/) is a globally distributed network platform known for its CDN, DNS, and security services. Its **R2 Object Storage** is an affordable, S3-compatible storage solution designed for developers and small teams who want to store data in the cloud **without egress fees** — a major advantage compared to traditional cloud providers. R2 integrates easily with many S3-compatible tools, including **TagSpaces**, allowing you to use it as a remote file location for tagging, browsing, and organizing your content. **Advantages** - No egress bandwidth fees - S3-compatible API - Hosted on Cloudflare’s globally distributed infrastructure - Integrated with Cloudflare Workers and CDN After registration, you’ll see the **R2 Object Storage** dashboard, which lists your existing buckets. From this screen, you can create new buckets and manage the **API tokens** needed to connect with TagSpaces. --- ## Creating a bucket In the R2 dashboard, click **Create Bucket** to open the setup screen. Here, you can choose: - **Bucket name** – this will be required later in TagSpaces - **Storage location** – choose your preferred data region and jurisdiction - **Storage class** – standard or low-frequency, depending on your usage Once created, go to the **bucket settings** page. Here you’ll find the **S3 API endpoint URL**, which will be required when setting up the connection in TagSpaces. ## Creating access tokens Access tokens are required to connect your Cloudflare R2 bucket to TagSpaces. They can be created directly from the R2 overview screen. Go to **Manage API Tokens** and from the next screen choose **Create User API token**: Here you specify the following settings: - **Permissions** – choose Read, Write, or Admin - **Bucket access** – specify which buckets the token can access Once created, you’ll receive your **Access Key ID** and **Secret Access Key** — store them securely, as they are only shown once. --- ## Connecting the bucket to TagSpaces Now it’s time to connect your **Cloudflare R2 bucket** to **TagSpaces**. 1. Open **TagSpaces**. 2. Click the **New** button and select **New Location**. 3. In the dialog, set the **Location Type** to **Object Storage**. 4. Fill in the following fields: - **Location name** – any name you prefer - **Bucket name** – your R2 bucket name (e.g. `ts-dev`) - **Access key** and **Secret key** – your R2 API credentials - **Endpoint URL** – your R2 S3 API endpoint, e.g. `https://.r2.cloudflarestorage.com` Once all fields are filled, click **OK** to create the location. You can now browse, tag, and organize files stored in your Cloudflare R2 bucket directly from TagSpaces. ## Conclusion By connecting **Cloudflare R2** to **TagSpaces**, you can manage your files in a fast, global, and cost-efficient way — ideal for users who want the scalability of the cloud combined with TagSpaces’ tagging and organization features. R2’s S3 compatibility means you retain flexibility: you can move your data between services or self-hosted alternatives without vendor lock-in, keeping your files accessible and under your control. TagSpaces + Cloudflare R2 = simple, flexible, cloud storage on your terms ☁️🔐 --- ## How to use Contabo to store your files [Contabo](https://contabo.com/de/object-storage/) offers affordable cloud infrastructure and storage solutions hosted in Germany and other EU locations. Currently (October 2025) they are offering 250 GB for roughly 3 € per month, which sound very reasonable. For users in the European Union or those concerned about **GDPR compliance**, Contabo provides a strong alternative to US-based cloud providers by keeping your data under strict EU privacy and data protection laws. Another advantage is the unlimited and free traffic for downloading and uploading files from/to the object storage. In this tutorial, we’ll walk through how to set up **Contabo Object Storage** as a location in **TagSpaces**, allowing you to manage, tag, and browse your files directly from Contabo’s S3-compatible storage. --- ## Creating a bucket 1. **Create a Contabo account** at [contabo.com](https://contabo.com) and log in. 2. Navigate to **Storage → Object Storage**. 3. Click **Create bucket** to make a new storage bucket. Once created, you’ll see your bucket appear in the **bucket list**: You can optionally adjust the **bucket properties** such as name purchase space, auto-scaling, and other options: --- ## Getting the access tokens To connect your bucket with external tools like TagSpaces, you’ll need API access with **S3 credentials**. 1. Go to your **Account → Security & Access** section. 2. Scroll down to find the **S3 Object Storage Credentials** area. 3. There, you’ll find your **Access Key** and **Secret Key** — these will be required later. --- ## Connecting the bucket to TagSpaces Now it’s time to connect your Contabo storage to **TagSpaces**. 1. Open **TagSpaces**. 2. Click the **New** button and select **New Location**. 3. In the dialog, set the **Location Type** to **Object Storage**. 4. Fill in the required fields: - **Location name** – any name you prefer - **Bucket name** – the name of your Contabo bucket - **Access key** and **Secret key** – from the previous step - **Endpoint URL** – the endpoint from your bucket list :::important Remove the **bucket name** from the URL when entering it into TagSpaces, e.g.: https://eu2.contabostorage.com/. ::: Once everything is set, click **OK** to create the location. You can now browse, tag, and organize your Contabo files directly in TagSpaces! --- ## Creating additional users with restricted rights If you want to give others limited access to your buckets, Contabo allows creating **additional user accounts**. 1. Go to **Account → User Management**. 2. Click **Create User**. 3. Enter the email address of the user who should have access. 4. Choose the appropriate permission level: - **Full access** - **Read only** - **Read and write** :::warning These permissions apply **globally to all buckets** — per-bucket permissions are not yet supported. ::: Click **Create** to finalize the new user. The new user can log into the Contabo admin console, navigate to **Account → Security & Access → S3 Object Storage Credentials**, and obtain their own access and secret keys. --- ## Conclusion By connecting **Contabo Object Storage** with **TagSpaces**, you can build your own privacy-respecting, self-managed cloud system — a personal alternative to Dropbox or Evernote. You maintain **full control** over your data, stored safely under **EU GDPR standards**. While Contabo’s management tools are still developing (for example, limited per-bucket permissions), it remains an excellent choice for users who value **data sovereignty**, **cost efficiency**, and **GDPR compliance**. --- :::info Congrats You now have your own cloud-based TagSpaces location hosted in the EU! ::: --- ## E2E encryption with Cryptomator Evernote's recent [change in its pricing plans](https://blog.evernote.com/blog/2016/06/28/changes-to-evernotes-pricing-plans/), restricting non-paying users to only two machines, have been an eye-opener to many. Even though the cloud-crazed hype is trying to convince us otherwise, with all the marketing tools at its disposal, keeping your private data in the cloud, and especially via vendor-locked solutions such as Evernote, had never been a good idea. With such vendor-locked, proprietary services, you do not own your own data, and have no control over its storage, meaning access to your own notes might be severely limited at any time, as it happened just recently. [TagSpaces](https://www.tagspaces.org/) had long been offering an alternative, self-hosted note-taking solution. Its capable RichText (HTML) and MarkDown editors and previewers can easily replace proprietary software, the plain, flat-file storage paradigm allows total control, and unrestricted access. With the help of third party cloud storage providers, such as Dropbox or Google Drive, you can also easily keep your notes in sync. Keeping your own files in your own cloud account is undoubtedly a better solution, but it still does not alleviate the problem of storing plain files on other people's computers (which is what servers, and the whole "cloud" really are.) To be reasonably safe, the best bet is to encrypt your data, before sending it off over the Internet. ## Encryption made easy Encryption might sound daunting to the everyday user, and rightly so. It is a broad topic, there are many solutions, and implementations, often targeting the advanced user, or even the expert. If you just want to secure your notes, it might seem like a little too much work of work. And of course we all prefer an instant solution. This is where [Cryptomator](https://cryptomator.org/) comes into the picture. Cryptomator is a free and open source, transparent, client-side encryption solution, which makes encrypting your cloud hosted files effortless. The cross-platform software is available for Windows, Mac, Linux, and as an executable Java `.jar`. The platform is absolutely service agnostic: Your encrypted files can be used with any cloud storage provider, as the encryption/decryption happens on your local machine, with as password provided by yourself. Cryptomator integrates into your OS's file system, making encryption as easy as a drag and drop operation in your file manager. How much easier could it be? ## Your encrypted Evernote alternative From a note-taking perspective, the solution to replacing Evernote with its access-limit, vendor lock, proprietary file format, and "cloud only" approach (meaning "no Internet, no work", unless you buy premium, of course), is really simple with TagSpaces, and any cloud service you prefer. Add Cryptomator to the mix, and your notes are also secured. ### Setting up your encryption solution First you will need to install **Cryptomator**, which is as easy as downloading the latest version for your platform from the Cryptomator [download site](https://cryptomator.org/downloads/), and running the installer. Next, you will need to connect a new _vault_, which in Cryptomator's terminology, means a folder that you connect to the software to create a virtual drive. To connect a new vault: - Open Cryptomator - Click on the "+" icon on the lover left corner, and - Select "Create new vault" - In the file chooser, navigate to the local folder that is synced with your preferred cloud service - And type a name for your vault. Once you're done, your new vault should show up on the side pane of Cryptomator's main screen. The vault is now there but not functional, until you set up a password. this password will be used to generate the encryption keys, ensuring that you can easily encrypt/decrypt any file in the vault on ,multiple computers. - Enter, and confirm a new password - And press "Create Vault" ![new vault added](./e2ee-cryptomator/cryptomator-new-vault-added.png) Now your new vault is ready to use. To unlock it, you need to enter your password. In the "More options menu underneath, you can change the drive name to whatever you like, and opt to save your password, so that you will not need to enter it on the local machine, each time you want to unlock it. This might be good for single user computers, but you should remember it's always a security risk to store your passwords. ![unlock encrypted vault](./e2ee-cryptomator/cryptomator-unlock-vault.png) As you enter your password, your vault should be unlocked and automatically mounted on your system. Your File Browser application will most likely fire up, showing your vault mounted as a new `dav` network drive. You can just begin to copy or move files and folders onto this drive, and they will be instantly encrypted by Cryptomator, without you noticing anything. To you all the files and folders will appear as if they were stored in their plain for mat on your file system. You can also lock the vault any time from within Cryptomator by pressing "Lock" ![lock vault button](./e2ee-cryptomator/cryptomator-lock-vault-button.png) This will unmount the drive and make the vault's contents unacceptable to anyone locally. When you unlock the vault, you will have full access again. If open the folder where your vault is stored, you will only find encrypted data, inaccessible from outside Cryptomator's virtual device. ### Adding it to TagSpaces To complete your setup, [download](https://www.tagspaces.org/downloads/) and install TagSpaces for your platform, if you have not already done so. You can now easily access your vaulted files from within TagSpaces: - Make sure Cryptomator is running and the vault containing your files is unlocked. - Mount the drive, if you have to (although this should happen automatically) - And connect it as a new location in TagSpaces. ![connect-vault-to-tagspaces](./e2ee-cryptomator/cryptomator-connect-vault-to-tagspaces.png) > Important note: You should not be adding the folder in which the Cryptomator vault is located, but rather the virtual dav network drive, which Cryptomator creates. If you need more information about how to mount a drive, you should consult your operating systems's documentation, although Cryptomator should handle this step for you automatically. Now you can access all your notes inside your Cryptomator vault from within TagSpaces, wile storing them encrypted for both on- and off-line use. If you now synchronize the folder with your cloud service of choice, you can rest assured that your files are safe, private and always accessible, without having to worry about the next policy change from Evernote, or any other proprietary cloud based note-taking service. --- ## Syncing files between TagSpaces installations One of the most common questions I receive about TagSpaces, is about the missing files synchronization feature. The concerns of the users are that they spend an hour tagging their files on the laptop, but now they want to get the same results also on their tablet or desktop computer and vice versa. Our opinion here is that TagSpaces does not need sync functionality, because all the tags are saved in the names of the files or in the so called sidecar files, which makes this meta-information extremely portable between devices. You have to just to sync files and this problem is already perfectly solved by some many online services. This is one of the main differences between TagSpaces and other applications offering tagging on files. Most of those applications are using some kind of database to store the tags, which makes the transfer of this information challenging. Besides that, your tagging information in this case is locked by the vendor and you cannot migrate to another application or service without significant effort. Saving the tags in the file names make the information stick to your files, and you can find files based on the tags even with simple search functionality supplied with your operating system. For the synchronization of the tagged files with TagSpaces, you can use any "cloud" service like [Dropbox](https://dropbox.com) or projects like [Nextcloud](https://nextcloud.com), which provides sync clients. And since there are TagSpaces clients for Windows, macOS and Linux), your tagged files can be synced and used almost everywhere. Here is a short list of services which can be used for syncing tagged files and folders: - Dropbox - Google Drive - Microsoft OneDrive or other P2P projects like: - [Syncthink](https://syncthing.net/) - a good tutorial explaining details about the TagSpaces/Synching setup can be found on [Medium](https://attilaorosz.medium.com/syncronise-your-offline-notes-across-all-devices-without-the-cloud-1e82fa53d1f1) - Bittorentsync/Resilio E2E Encryption can be achieved with [Cryptomator](https://cryptomator.org/). You can details about how to setup in this [tutorial](/tutorials/e2ee-with-tagspaces-and-cryptomator). The following image shows a utilization of Dropbox in connection to TagSpaces. But this setup will most probably work with other service like Google Drive, MS OneDrive and other. ![Picture showing synching of tagged files with dropbox](/media/tagspaces-dropbox-sync.png) --- ## Customizing Folders # Turning folders into file based apps WIP ## Ways to customize folders - Choosing a default perspective - Choosing folder thumbnail - Choosing folder background color or gradient - Choosing folder background image - visible in the grid, list and kanban perspective - Adding folder description - Customizations in the grid and list perspective - Customizations in the kanban perspective - Customizations in the mapique perspective ## What you can achieve ### Turning folder into photo gallery ### Turning folder into a kanban board ### Turning folder structure into wiki --- ## Exposing local folders as object storage with S3Proxy ## Introduction The web version of TagSpaces can be used currently only with object storage as a backend. Such is offered by a countless cloud provider, starting with AWS from Amazon, Wasabi or R2 from Cloudflare. This is great if your files are located in the Cloud, but what if you want to connect your files from your NAS or other local shares, you will need local object storage server. And here comes [S3Proxy](https://github.com/gaul/s3proxy) in place. It is a web server, which can be used to expose local folders as S3 compatible buckets. ## Running S3Proxy as Docker container Running the S3proxy with Docker is the way we recommend, especially if you already use Docker to run the [TagSpaces Web](/tutorials/tagspaces-web-docker) application. ```docker showLineNumbers sudo docker run -d \ --restart=always \ -p 9000:80 \ --name s3proxy-local-fs \ -e S3PROXY_AUTHORIZATION=aws-v2-or-v4 \ -e S3PROXY_ENDPOINT="http://0.0.0.0:80" \ -e S3PROXY_IDENTITY="username" \ -e S3PROXY_CREDENTIAL="password" \ -e S3PROXY_IGNORE_UNKNOWN_HEADERS=true \ -e JCLOUDS_PROVIDER="filesystem" \ -e JCLOUDS_FILESYSTEM_BASEDIR="/data" \ -e S3PROXY_CORS_ALLOW_ALL="true" \ -v /Users/yourusername/buckets:/data \ andrewgaul/s3proxy \ ``` Here is a short explanation of the docker command parameters. The parameter on line **(2)** is optional and makes Docker starting TagSpaces automatically after restart. Line **(3)** maps the internal port `80`, specified on line **(6)**, to port `9000` of the host computer, so TagSpaces Web can be accessed on `localhost:9000` or `127.0.0.1:9000`. On line **(4)** the name of the docker container is specified. Line **(13)** maps the host folder `/Users/yourusername/buckets` to the internal `/data` folder, which is the root folder of the S3Proxy server specified on line **(11)**. :::info Every sub folder in the `/Users/yourusername/buckets` folder is served as a separate bucket by the S3Proxy service, so the name of the sub folder should be used later as bucket name in TagSpaces. ::: Line **(5)** is specifying the s3 authorization version, for TagSpaces Web and Desktop app you will need `aws-v2-or-v4`. On line **(7)** you should specify the username and on line **(8)** the password. Please change them according to your needs. The local filesystem is specified as file backend on line **(10)**. Line **(12)** disables the CORS restrictions, so you can access the S3 service from any host running TagSpaces. This is not always recommended and can be restricted with other parameters from the S3Proxy [Dockerfile](https://github.com/gaul/s3proxy/blob/master/Dockerfile). Line **(14)** specifies the name of the Docker image for the S3Proxy project, as published on [Docker Hub](https://hub.docker.com/r/andrewgaul/s3proxy/). ## Running S3Proxy as standalone program You can start S3Proxy directly on your computer. On Linux or macOS you will need the program which can be downloaded from GitHub. You should make the `s3proxy` executable file with following command: ``` chmod +x s3proxy ``` And run it with the appropriate configuration file: ``` ./s3proxy --properties s3proxy.conf ``` The content of the s3proxy.conf could be the following: ```conf showLineNumbers title="s3proxy.conf" s3proxy.endpoint=http://127.0.0.1:9000 s3proxy.authorization=aws-v2-or-v4 s3proxy.identity=username s3proxy.credential=password s3proxy.ignore-unknown-headers=true s3proxy.cors-allow-all=true jclouds.provider=filesystem jclouds.filesystem.basedir=/Users/yourusername/buckets ``` More details for installation and running the application on Windows can be found on the official [webpage](https://github.com/gaul/s3proxy) of the project. ## Connecting to TagSpaces Now it’s time to connect your s3proxy bucket to **TagSpaces**. 1. Open **TagSpaces**. 2. Click the **New** button and select **New Location**. 3. In the dialog, set the **Location Type** to **Object Storage**. 4. Fill in the required fields: - **Location name** – any name you prefer - **Access key** and **Secret key** – as created earlier - **Bucket name** – the name of any sub folder of the bucket folder, which was specified in the previous steps - **Endpoint URL** – the URL with port of the s3proxy server, it could begin with `http` or `https`, depending on the utilization of SSL certificate Once everything is set, click **OK** to create the location. ![Connecting S3Proxy bucket in TagSpaces](/media/locations/create-s3proxy-location.avif) ## Serving S3Proxy with SSL certificate :::info This is an important and recommended configuration, which is currently not covered by this tutorial. More details can be found here: https://github.com/gaul/s3proxy/wiki/SSL-support ::: ## Other use cases with S3Proxy With S3Proxy you are able to connect some other cloud storage providers which does not support S3 directly. Some examples are: - Azure Blob - Backblaze B2 - Google Cloud Storage - Rackspace Cloud Files The corresponding configuration files can be found here: https://github.com/gaul/s3proxy/wiki/Storage-backend-examples We haven't tried out all of them with TagSpaces, so any feedback will be valuable for us. --- ## How to use Garage buckets as locations [Garage](https://garagehq.deuxfleurs.fr/) is an open-source distributed object storage system compatible with the **S3 API**. It allows you to **self-host your own S3-compatible storage**, either on a personal server, a NAS, or even across multiple devices. This makes Garage a perfect solution for **privacy-focused users** or teams who want to keep their data local while still benefiting from a modern, S3-compatible setup. In this tutorial, we’ll show how to connect a Garage bucket as a **TagSpaces location**, enabling you to browse and manage files directly from your own Garage instance. You can find Garage’s full setup guide here: 👉 [Garage Quick Start Documentation](https://garagehq.deuxfleurs.fr/documentation/quick-start/) Below is a condensed version of the essential setup steps. ## Creating the config file First, create a Garage configuration file `garage.toml` on macOS or Linux. ```toml cat > garage.toml < You can now browse and tag files stored in your Garage bucket directly from TagSpaces. ## Conclusion By integrating Garage with TagSpaces, you can create your own fully self-hosted, S3-compatible file system — perfect for privacy-conscious users, home servers, or offline NAS setups. This setup allows you to enjoy the flexibility of TagSpaces’ metadata and tagging features while keeping your data under your control — no external cloud providers needed. Garage + TagSpaces = your personal, private cloud. ☁️🔐 --- ## How to start # Getting Started with TagSpaces Welcome to **TagSpaces**, your privacy-friendly file manager and organizer. This guide will help you get started quickly after downloading and installing the app. --- ## Launching for the First Time When you start TagSpaces, after you accept the software license, you’ll be greeted by the **Welcome Screen**. From here, you can: - Create or connect a **location** (a folder you want to manage with TagSpaces) - Explore the **intro tour** to understand the interface - Open existing folders on your computer or cloud storage :::tip TagSpaces never uploads your data anywhere by default. All your files stay where they are — on your local drive. If your location is on object storage, then your files stay in this storage, unless your download them. ::: --- ## Understanding “Locations” A **location** is simply a folder from your computer, an external drive, or an S3-compatible cloud bucket. TagSpaces connect automatically some of your standard folders like the **Downloads**, **Documents**, **Music** and **Desktop**. The **Locations** are visible on the left area of the application window. The standard locations are fully optional you can remove them or create new locations pointing to folders which contain files you want to manage in TagSpaces. **To create a new location:** 1. Click the **“New button”** on the top left part of the main screen, and the choose **New Location** from the menu. 2. Click the folder icon to to choose a folder from your file system, which will be the root of your location. 3. Choosing the folder from your file system 4. Give the location a recognizable name. TagSpaces takes automatically the name of the chosen folder as name for the location. You can change this name to something else in this dialog. 5. Now you can browse, tag, and organize all files inside that location directly within TagSpaces. :::info Connecting cloud locations TagSpaces can connect to folders located on object storage. The object storage can be hosted on a [NAS](/tutorials/folders-as-objectstorage-with-s3proxy) or in the Cloud like on [AWS S3](/tutorials/s3-bucket-locations), [Contabo](/tutorials/contabo-storage) [Wasabi](/tutorials/wasabi-locations) or [Cloudflare R2](/tutorials/cloudflare-r2-storage). ::: --- ## Tagging Your Files and Folders Tags are at the heart of TagSpaces. They help you organize and find files faster. The following video how you can apply tags to files and folder: - By adding tags from the tag library using drag and drop - By dragging tags from one file and dropping them onto another - By using the tagging dialog to add and remove tags You can group tags by category in [tag groups](/ui/taglibrary#tag-groups) — for example: 🧾 _Document Type_, 🎨 _Project_, 🌍 _Location_, or 📅 _Year_. > ⚙️ **Tagging method:** Choose between storing tags in filenames or in sidecar files (`.json`). > Adjust this in **Settings → Tagging Method**. --- ## Creating Notes and New Files TagSpaces includes built-in editors for: - **Markdown** (recommended for note-taking) - **Plain text** - **HTML** (for formatted documents) - **Audio** (for dictation of audio notes) **To create a note:** 1. Click the **“+ New”** button. 2. Select the type of file you want to create 3. Change the desired template (optional step) 4. Start typing Your note is saved as a regular file in the current folder. --- ## Exploring Perspectives **Perspectives** define how your files are displayed: | Perspective | Description | | ------------------------------------------------------ | ----------------------------------------------- | | 🗂️ [Grid](/perspectives/grid) | Visual tile layout | | 📋 [List](/perspectives/list) | Table-like view with sorting | | 🖼️ [Gallery](/perspectives/gallery) | Ideal for image collections | | 🗺️ [Mapique](/perspectives/mapique) | Display geo-tagged files on a map | | 📊 [FolderViz](/perspectives/folderviz) | Visualize folder structures and tag connections | | ✅ [Kanban](/perspectives/kanben) | Manage tasks as cards in a board | Switch perspectives using the **Perspective Switcher** in the toolbar. ![Changing perspectives for a folder](/media/core/perspective-switch.avif) --- ## Syncing Files Across Devices TagSpaces works with any file synchronization service: - Dropbox - Google Drive - Nextcloud - Syncthing - S3-compatible storage Connect the same folder as a location on multiple devices to keep tags and notes synced. --- ## Customization and Themes Personalize your workspace: - Light and dark modes - Adjustable language and default perspectives - Custom folder background colors - Tag color customization --- ## Next Steps Now that you’ve created your first location: - Add and tag files - Write your first Markdown note - Try switching perspectives - Install the **[TagSpaces Web Clipper](https://www.tagspaces.org/products/webclipper/)** to save content from the web > 🚀 **Pro Tip:** Upgrade to TagSpaces Pro for advanced perspectives, geo-tagging, and automation with local AI integrations. --- ## 💡 Additional Resources - [Tutorials](/tags/tutorial/) - [Community Forum](https://tagspaces.discourse.group/) - [FAQ](https://www.tagspaces.org/faq/) --- ## Use custom map tile services in TagSpaces Pro :::info This article is work in progress ::: TagSpaces uses the free OpenStreetMap service as a default digital map. It works fine for the most of the cases, but since the service is free, they can not guaranty that it we always accessible and that it can serve all the request coming to it. Depending on this how much you relay on the digital maps in TagSpaces, it might make sense to configure an alternative map tile server solution. They are many such services available online and we found [Maptiler](https://www.maptiler.com/) to be one which is very reliable, easy to configure and offering many map themes. Of course everything comes with its price, luckily they offer a free plan so you can try it with no costs. Another option you have is to setup your own map tiles server. I will discuss this option briefly at the end of the second half of this tutorial. ## Using map tiles from Maptiler In order to start with Maptiler you will need to [create an account](https://www.maptiler.com/cloud/plans/) for this service. https://cloud.maptiler.com/geocoding/ ![](custom-map-tiles/maptiler-map-overview.png) ![](custom-map-tiles/maptiler-urls.png) ## Setting up your own map tile server DockerImage https://github.com/Overv/openstreetmap-tile-server https://hub.docker.com/r/overv/openstreetmap-tile-server http://download.geofabrik.de/ ## Adding map tile servers in TagSpaces ## Other resources - [Self Hosting a Google Maps Alternative with OpenStreetMap](https://wcedmisten.fyi/post/self-hosting-osm/) - a deep dive into the topics of self hosting OpenStreetMap --- ## Overview # Tutorials and Guides - [How to start](/tutorials/how-to-start/) - [Collaboratively using tags and tag groups](/tutorials/sharing-tags/) - [How I manage my ever growing collection of photos?](https://www.tagspaces.org/blog/photo-management-process/) - [Using TagSpaces with other users or on many devices](/tutorials/using-tagspaces-collaboratively/) ## Advanced topics - [Synchronize Your Offline Notes Across All Devices Without the Cloud](https://attilaorosz.medium.com/syncronise-your-offline-notes-across-all-devices-without-the-cloud-1e82fa53d1f1) - [End to end encryption with Cryptomator](/tutorials/e2ee-with-tagspaces-and-cryptomator/) - [Use custom map tile services in TagSpaces Pro](/tutorials/map-tiler-tutorial/) - [Exporting and organizing photos from Flickr](https://www.tagspaces.org/blog/organize-flickr-export/) ## Hosting files in an object storage - [How to use AWS S3 buckets as locations](/tutorials/s3-bucket-locations/) - [How to use Contabo buckets as locations](/tutorials/contabo-storage/) - [How to use Wasabi buckets as locations](/tutorials/wasabi-locations/) - [How to use Cloudflare R2 buckets as locations](/tutorials/cloudflare-r2-storage/) - [Exposing local folders as object storage with S3Proxy](/tutorials/folders-as-objectstorage-with-s3proxy) - [How to use MinIO buckets hosted on NAS Server](/tutorials/setup-minio-bucket-nas/) - [How to use Garage buckets as locations](/tutorials/garage-storage/) ## Web version of Tagspaces - [Using TagSpaces Web with Docker](/tutorials/tagspaces-web-docker/) - [Setup TagSpaces Web on a Web Server](/tutorials/setup-tagspaces-web/) --- ## Prepare custom packages ## Introduction get zip or tag.gz package unpack the tagspaces package install asar ``` npm install -g asar ``` go to resources folder create app subfolder and extract the content of the asar file to the app folder ``` asar extract-file app.asar app ``` delete the app.asar files edit the app.html in the main folder ```HTML TagSpaces Desktop Note that this is a server side and not an end to end encryption. ![Create S3 bucket encryption](/media/aws/aws-s3-create-encryption.png) Leave the default setting for access. ![Create S3 bucket access settings](/media/aws/aws-s3-create-access.png) Review the settings and click the _Create bucket_ button. ![Review S3 bucket](/media/aws/aws-s3-create-overview.png) Once you have successfully created the bucket you should see the following screen. ![Create S3 bucket success](/media/aws/aws-s3-create-success.png) ## Step 2 - Set the CORS settings of the bucket This is an optional step, needed only if you want to access the bucket from the web version of TagSpaces. ![Create S3 bucket](/media/aws/aws-s3-cors.png) The JSON config, can be copied from the section bellow. ```json [ { "AllowedHeaders": ["*"], "AllowedMethods": ["GET", "PUT", "POST", "HEAD", "DELETE"], "AllowedOrigins": ["*"], "ExposeHeaders": ["ETag"] } ] ``` > You can remove the _PUT_ and _DELETE_ lines, if you want to disable the writing and deleting operation from TagSpaces Custom. > It is recommended to put in the _AllowedOrigin_ line, the domain from which you will access this bucket. E.g.: https://example.com ## Step 3 - Create user for accessing the bucket. Accessing the bucket with the credentials from your main account is not recommended. That's in this section we will guide through the process of user creation in the AWS IAM service. After successfully creating the user here, you will be able to use it for accessing the bucket from TagSpaces. As first step the [AWS IAM](https://console.aws.amazon.com/iam/) service should be opened. ![Open IAM service](/media/aws/aws-iam-start.png) Here you can click on the **Users** section, ash shown in the screenshot. ![IAM service overview](/media/aws/aws-iam-overview.png) Then you have to click on the **Add user** button, in order to start the user creation process. ![IAM create user](/media/aws/aws-iam-create-user.png) And enter the **name** and select the type of access for this user. In order to use this user for API call, you have to enable the **Programmatic access**. ![Set user name in IAM](/media/aws/aws-iam-user-name.png) In the next steps you have to set the permission for this user, by creating a custom policy. Please select the **Attach existing policies directly** and then click on the **Create policy** button. ![Set user policy in IAM](/media/aws/aws-iam-user-policy.png) In newly opened browser tab with the policy editor, click on the JSON section. ![Create user policy in IAM](/media/aws/aws-iam-policy-creation.png) There you can enter and adjust your policies. The following JSON snipped, is a policy for a user who can just list and retrieve object (read-only user) from the **your-bucket-name** bucket. You should adjust the name of the bucket to suite your setup. Policy for read-only user: ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetObject"], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "s3:GetAccountPublicAccessBlock", "Resource": "*" } ] } ``` Policy for user with admin/write access: ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:ReplicateObject", "s3:GetObjectAcl", "s3:GetObjectVersionAcl", "s3:PutObjectTagging", "s3:DeleteObject", "s3:GetBucketWebsite", "s3:GetBucketNotification", "s3:GetReplicationConfiguration", "s3:ListMultipartUploadParts", "s3:PutObject", "s3:GetObject", "s3:RestoreObject", "s3:ListBucket", "s3:GetBucketPolicy", "s3:GetObjectVersionTorrent", "s3:AbortMultipartUpload", "s3:GetBucketRequestPayment", "s3:GetObjectTagging", "s3:GetMetricsConfiguration", "s3:PutObjectAcl", "s3:GetBucketPublicAccessBlock", "s3:ListBucketMultipartUploads", "s3:PutObjectVersionTagging", "s3:GetBucketVersioning", "s3:GetBucketAcl", "s3:PutInventoryConfiguration", "s3:GetObjectTorrent", "s3:GetBucketCORS", "s3:GetBucketLocation", "s3:ReplicateDelete", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "s3:GetAccountPublicAccessBlock", "Resource": "*" } ] } ``` :::caution The list of allowed actions in the previous JSON file is only a suggestion. The actions can be reduced, to just those which are really needed for your use case. ::: Once you are ready and have attached the newly created policy to the user, you can finalize the process. On the last screen you will see the **access key ID** and the **secret access key** of the just created user. ![User creation success IAM](/media/aws/aws-iam-user-success.png) ## Step 4 - Upload files to the bucket The easies way to upload files to your bucket is to use the build upload functionality, as seen in the next screenshot. But first you should create a folder in the bucket, which will serve as a root folder. You can name if for example _rootfolder_. ![Create S3 bucket root folder](/media/aws/aws-s3-create-rootfolder.png) Now you can upload files using the web interface. ![Create S3 bucket](/media/aws/aws-s3-upload.png) Alternatively you can use the AWS CLI (command line tools), with the following command. aws s3 sync local-bucket-folder s3://your-bucket-name/rootfolder This will sync all files and folder from your local folder called _local-bucket-folder_ to the sub folder with the name _rootfolder_ in the bucket your bucket _your-bucket-name_ You can find out how what is _AWS CLI_ and how to install it for your operating system from this [link](https://docs.aws.amazon.com/en_pv/cli/latest/userguide/cli-chap-welcome.html). ## Step 5 - Create cloud location in TagSpaces Start TagSpaces and click on the **Connect a location** button from the locations section. Then you should select the _AES S3 Object Store_ radio button, as shown in the following screenshot. ![Create S3 location](/media/aws/tagspaces-create-s3-location.png) Here you should enter the following parameters: - **Location Name** - this is a free text with which you will refer your location in this TagSpaces installation - **Location Path** - is the name of the root folder from the location we have previously create - **Access Key** - is the key of the IAM user - **Secret Access Key** - is the secret key of the IAM user - **Bucket Name** - self explaining ... - **Region** - is the region of hosting for your bucket Once you click **OK** the location will be create and its content should be listed in TagSpaces. There are some advanced settings with can be useful for S3 locations. - **Open this location in read-only mode** - this will switch the UI interface of TagSpaces in readonly mode. It is particularly useful for location to which the IAM user has only read-only access. - **Switch to manual index creation with persistent index** - this option will disable the indexing of the location on its opening. Instead it will try to load the previously create index file. This is useful for large locations with many files, where the initial indexing could take a lot of time. --- ## Setup SabreDAV version :::caution Deprecated functionality: The here described functionality is not supported actively anymore. ::: ## Introduction Since a long time, i search for good Option, to save my Notes, Documents and PDF Manuals on my own Server. So far, i used Evernote but as with many other such Services, it comes the day where you think about Security and Privacy. On the other side we get spoiled with the Pleasant for the Users and no one wants live without them. In this respect, the self-hosted Service should have similar features in one form or another. I have seen various Services for Notes self-hosting, but i found nothing for me, what makes me really happy. With some of them the Installation was really difficult, with others some important features are missing and with the rest of them, the performance on my good old Raspberry Pi2 war horrible. Then i have found TagSpaces. It looks quite interesting, as far as the feature set is concerned. What at first deterred me, was that there it seems to be no Server Backend. So I wanted to forget TagSpaces, until I noticed that there is probably a server part, even if in some unusual form. On GitHub there is a client that can directly access a WebDAV server, such as NextCloud. ## SabreDAV I had already tested NextCloud but i wasn't happy with it. Its horrible slow and full with unnecessary functions, so that i moved to SabreDAV, since NextCloud is based on an older Version of SabreDAV. SabreDAV runs very fast on my Raspberry Pi2, as opposed to NextCloud, as long as you use a MySQL database as the Backend. There are no performance differences when comparing WebDAV from Nginx and SabreDAV. For example, the transfer of a file with 300kb other NextCloud took 14 to 50 seconds. Using the WebDAV module from Nginx, the same file takes 3 - 5 seconds. With SabreDAV it takes also only 3 - 5 seconds. SabreDAV is set on my Server that it does not use its own authentication, it relies on here with the possibilities of the Webserver. In my case, this is Nginx. The Main Reason for this is that I also use CalDAV and CardDAV over SabreDAV and Windows 10 Client's can only work with the HTTP Basic method. So you specify the following in the corresponding PHP file: $authBackend = new \Sabre\DAV\Auth\Backend\Apache(); This Backend is also chosen if you use a different Webserver than Apache. A little further up in the PHP file you define the path to the files, which should be shared via WebDAV. This path can be defined relatively easily for each different user: $publicDir = '/path_to/webdav_folder/'.$_SERVER['PHP_AUTH_USER'].'/files'; As shown in the example, the global variable contains \$\_SERVER['PHP_AUTH_USER'] username for the currently logged in User. This allows each user to use his own files. A tip: Sharing would be possible with Symlinks in this case as well. The complete PHP File could look like the following: ```php setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); require_once '../vendor/autoload.php'; $authBackend = new \Sabre\DAV\Auth\Backend\Apache(); $nodes = [ new \Sabre\DAV\FS\Directory($publicDir), ]; $server = new \Sabre\DAV\Server($nodes); if (isset($baseUri)) $server->setBaseUri($baseUri); $lockBackend = new \Sabre\DAV\Locks\Backend\File($tmpDir . '/locksdb'); $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend)); $server->addPlugin(new \Sabre\DAV\Browser\Plugin()); $server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend)); $server->exec(); ``` In the same PHP file you can of course add other Backend’s for CalDAV and CardDAV, which I have omitted in this example, because this is all about WebDAV and TagSpaces. ## Nginx Of course Nginx also needs a small adjustment. I would highly recommend to use WebDAV Sharing only via SSL (free certificates provides for example Let's Encrypt). Additionally we have to adapt the PHP handling for SabreDAV. In my case, I use a corresponding location container for my DAV services. You do not need much, my looks like this: ``` location ~ ^/sabredav/ { auth_basic "Secured Area"; auth_basic_user_file /path_to/.htpasswd; location ~ ^(.+\.php)(.*)$ { try_files $fastcgi_script_name =404; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param REMOTE_USER $remote_user; } } ``` With the both auth_basic directives I set the small on Notes which appears on the Login Box in the Browser and the path to the hidden file .htpasswd. We will generate this file later. This file contains the credentials for each individual user. SabreDAV works a lot with path information, so the corresponding lines are enormously important, otherwise SabreDAV does not work as expected. Particularly important is the penultimate line fastcgi_param REMOTE_USER \$ remote_user; At least for me, this was a stumbling block. As you can see, I use PHP7 from the Jessie-Backports. If you still use PHP5, the location container has to be adapted accordingly. ## User Management Now we have to create the htpasswd file or add Credentials to it if if the file already exists. I use apache-utils from Raspbian (Debian), but there are other ways to generate the credentials. Since it is a pure text file, the editing is not too difficult. With the apache-utils you create a new file with the first user as follows: htpasswd -c /path_to/.htpasswd username The program then asks twice for the password to be used and then stores the record in the file. If you want to change an already existing users or add a new user, leave the parameter -c simply away. If you want to delete a user, use the -d switch. Now its time to Reload the Webserver: systemctl reload nginx You should now be able to log in to the WebDAV URL with a browser. If this works, you have access to your shared Files. Make sure that all files belong to the Webserver-User. On Debian / Ubuntu this should be www-data. Otherwise, you may not be able to access your files for reading or writing. ## TagSpaces Let's go to TagSpaces. The installation is extremely simple. Change your path to the root directory of your Webserver. Now simply download the archive: wget https://github.com/tagspaces/tagspaces/releases/download/v2.7.0/tagspaces-2.7.0-web.zip Now its time to extract the Archive: unzip tagspaces-2.7.0-web.zip This creates a subdirectory "tagspaces" with all the necessary files. With the Browser, you can now access the TagSpaces directory. There will be no password query, because the server knows nothing about it yet. ## Nginx again You have to take care that not everyone can access your notes. We must now protect this directory with a password. Reopen your Nginx configuration file and add a location container for the TagSpaces directory. For me, this looks something like this: ``` location /tagspaces { auth_basic "Secured Area"; auth_basic_user_file /path_to/.htpasswd; } ``` As you can see, I use the same auth_basic variables as with the SabreDAV location. I use the same Credential File. Since these Credentials are already entered, its enough to save the changes to the Nginx Config and reload the Server: systemctl reload nginx Now please close the browser Window so that the session ends locally. If you reopen the Browser with the URL of TagSpaces, the browser asks for the WebDAV Credentials. Enter the Credentials for WebDAV. Now you can access TagSpaces and add a new Location. In my case this is a subdirectory of the WebDAV Share. In my case sabredav/files/Notes. If you enter this Location, TagSpaces will nit ask again for Credentials since you have already established a corresponding session. From now on, you can manage your notes online via TagSpaces. If you want, there are TagSpaces Clients for the Desktop or your Mobile Devices. Thanks to WebDAV Protocol, the files can be synchronized with any program. On Android, I use FolderSync, at Windows you can have the WebDAV share directly connected as a drive (there also exist special sync clients) and with Linux, a WebDAV Share can be seamlessly integrated into your directory structure. --- ## MinIO Buckets Hosted on NAS Server This tutorial will guide you through setting up a self-hosted object storage using [MinIO](https://min.io) on a QNAP NAS system. We will show how to set up TagSpaces Pro Web on a web server and connect it to your MinIO server. Docker container apps will be used for installation, which are available on NAS server operating systems. For QNAP NAS, the app is called **ContainerStation**. Please install it before proceeding if it's not already installed. ## Installing the MinIO Docker Application :::caution Starting from October 2022, MinIO no longer supports the gateway mode, which exposed existing file and folder structures as S3 object storage. For more information, refer to their [documentation](https://min.io/docs/minio/linux/operations/install-deploy-manage/migrate-fs-gateway.html). ::: To install the current Docker image for MinIO, go to the "Create" section of ContainerStation and search for _minio_ in the _Docker Hub_ tab. ![MinIO's console login](tagspaces-web-nas/qnap-installing-minio-container.png) Click the **install** button, which will be labeled **create** if the image is already installed. You can find the official MinIO Docker image at: [`https://hub.docker.com/r/minio/minio`](https://hub.docker.com/r/minio/minio). ## Setting Up MinIO on NAS with Docker You can easily run MinIO using the container app that runs Docker in the background. Open an SSH connection to your NAS and execute the following command: ```bash sudo docker run -d \ --restart=always \ -p 9000:9000 \ -p 9001:9001 \ --name minio-container-name \ -e MINIO_ROOT_USER=username \ -e MINIO_ROOT_PASSWORD=password \ -v /share/DataS3:/data \ minio/minio server /data \ --console-address :9001 ``` Explanation of the Parameters - `--restart=always` - Ensures the MinIO Docker image starts automatically after your NAS system restarts. - `-p 9000:9000` - Exposes the MinIO server on both network interfaces (port 9000). - `-p 9001:9001` - Opens another port for the MinIO console. - `--name minio-container-name` - Sets the name of the Docker container; this name will appear later in the Docker management interface on your NAS. - `MINIO_ROOT_USER` and `MINIO_ROOT_PASSWORD` - Define the username and password for the MinIO admin user; these should be changed to secure credentials for your production system. - `/share/DataS3` - Represents the local directory on the NAS. - `/data` - The folder mapped to `/share/DataS3` that is exposed by MinIO. - `minio/minio` - The official Docker [image](https://hub.docker.com/r/minio/minio) provided by MinIO, available on Docker Hub. - `--console-address :9001` - Specifies the network interface where the MinIO service dashboard is exposed. ## Testing If MinIO is Running You can now open your browser and enter the IP address of your NAS, appending port 9001 at the end. This will direct you to the login screen for the MinIO Console, which serves as the administration panel for monitoring your installation and managing buckets, users, groups, and policies. ![MinIO's console login](tagspaces-web-nas/minio-console-login.png) After logging in, you should see the MinIO dashboard, displaying basic information about your installation. ![MinIO dashboard](tagspaces-web-nas/minio-dashboard.png) Navigating to the **Buckets** section will show a list of all buckets, which are actually subfolders within the exposed NAS directory. ![MinIO buckets](tagspaces-web-nas/minio-buckets.png) In my case, `/share/DataS3` is the exposed folder in the Docker script, with `Photos` and `Music` being subfolders, as shown in the buckets section. ![The folder exposed in MinIO as seen in the QNAP file manager](tagspaces-web-nas/exposed-folder-in-qnap.png) ## Managing Your MinIO Docker Instance on QNAP NAS To manage your Docker container, use the **ContainerStation** app in the QNAP management console. ![MinIO docker in the QNAP Container Station](tagspaces-web-nas/container-list-qnap.png) By navigating to the container, you can view further details, including a console log showing messages from the MinIO server. ![MinIO docker in the QNAP Container Station](tagspaces-web-nas/qnap-container-station-minio.png) ## Creating a User for Accessing MinIO It is not recommended to use the MinIO admin user for accessing the bucket. Below are steps to create users with restricted permissions. First, navigate to the **IAM Policies** section and create a new read-only policy for the `Photos` bucket. ![IAM policies in Minio](tagspaces-web-nas/minio-iam-policies.png) To define this policy, you can paste the following code into the JSON editor of the policy. Both elements in the `Resource` section of the JSON below are necessary. This policy is named `PhotosRO`. ```json title="Policy with read only access to the 'Photos' bucket." { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetObject"], "Resource": ["arn:aws:s3:::Photos", "arn:aws:s3:::Photos/*"] } ] } ``` Now it's time to create a new user. Navigate to the **Users** section and click on the **Create User** button. Here, you will enter an `Access Key` (which acts like a username) and a `Secret Key` (essentially the password). Also, in the **Assign Policies** section, select the `PhotosRO` policy you previously created. ![Creating user in the MinIO console](tagspaces-web-nas/create-user-minio.png) ## Configuring TagSpaces Pro and TagSpaces Pro Web Once the user has been created, you can configure TagSpaces Pro to connect with the MinIO server. 1. Open TagSpaces Pro and create a new cloud location by clicking **Create New** and then click on the **New Location** menu item. 2. In the dialog, select the **Object Storage** option and click the **Advanced Mode** button at the bottom of the dialog. 3. Fill in the following details: - **Location Name**: A custom name that helps you identify this location later in the location manager. - **Location Path**: Leave this empty as it is not currently supported by TagSpaces for MinIO connections. - **Access Key**: Enter the access key of the MinIO user. - **Secret Access Key**: Enter the secret access key for the user. - **Bucket Name**: Enter the name of one of the subfolders within the main folder hosted by MinIO (as seen in the previous screenshot). - **Endpoint URL**: Specify the URL and port where your MinIO instance is running. - **Location ID**: This is automatically generated but can be changed if needed. It must not be left empty. ![Setup MinIO location in TagSpaces](tagspaces-web-nas/create-minio-locations.png) Once configured and saved, TagSpaces should connect to the MinIO instance and list the files within it. ## Common Pitfalls ### Connection Issues If you are running your MinIO server over HTTP, you will need to allow **insecure content** in the settings for the TagSpaces Pro Web page in the Chrome/Chromium browser. ![Enable insecure content in Chrome](/media/chrome-insecure-content.png) If you are using Firefox, this relaxing of settings is not possible, so you need to ensure both TagSpaces Pro Web and MinIO are either using HTTPS or both are on HTTP. :::caution Running TagSpaces Pro Web over HTTP is not recommended! - It is strongly recommended to set up an SSL certificate for your MinIO server to ensure secure HTTPS connections. - It is also highly recommended to set up an SSL certificate for the web server hosting the TagSpaces Web App so that connections are secured over HTTPS. ::: ### CORS Issues Some users have reported CORS-related issues with MinIO servers installed on Synology NAS systems. For more details, please refer to this GitHub [issue](https://github.com/minio/minio/issues/11111). Feel free to contact us if you have any questions or suggestions! --- ## Setup TagSpaces Custom :::caution ⚒ This tutorial is work in progress ::: ## Introduction Overview - User management - Cognito - File hosting - S3 - Configuration data for the location and tag libraries - DynamoDB - Access to DynamoDB - GraphQL - Amplify, Cloudformation ## Initial setup of the amplify project Before you start it's need to install amplify CLI: `npm install -g @aws-amplify/cli` Clone the tagspaces amplify repository git clone https://github.com/tagspaces/tagspaces-amplify.git GitHub username and access key will be provided by the TagSpaces team 1. Clone TagSpaces Repository `yarn ts-clone`. 2. Init amplify project in a cloud `amplify init`. - Environment name - this could be something like this: your-project-prod or your-company-name-dev - Group name - e.g.: project-name-group1, this is the id and the tenant used in the configuration of the dynamoDB bellow. 3. Publish it `yarn amppublish` - this will make `amplify push` create storage and functions && `amplify publish` Zipping artifacts and deploy it to the cloud. Amplify cli will create user files S3 bucket and you can find the bucket name in generated tagspaces/app/aws-exports.js -> "aws_user_files_s3_bucket": "tsdatastorage165054-dev" To create user to access your bucket created from amplify: https://docs.tagspaces.org/tutorials/s3-bucket-locations#step-3---create-user-for-accessing-the-bucket ## Create IAM user for accessing the buckets With custom policy allowing access only to the needed buckets Don't forget to replace the bucket name in User Policy json. ## Configuring the default locations and tag library Open [DynamoDB](https://eu-central-1.console.aws.amazon.com/dynamodb) and insert records in `Extconfig...` and `TagGroups...` tables. Important entries in both tables are `id` and `tenant` (ts-demo in the following example), which is actually a Cognito group. Using the groups you can have separate configuration for different group of users. So users assigned in Cognito to a given group will see the locations and tag groups configured with the group name as id and tenant. Create group ![](setup-tagspaces-enterprise/cognito-create-group.png) Assign group to user ![](setup-tagspaces-enterprise/cognito-assign-group-to-user.png) Create entries in the dynamoDB tables: ![](setup-tagspaces-enterprise/dynamodb-create-items-in-tables.png) ### Locations ```json { "id":"ts-demo", "tenant":"ts-demo", "createdAt":"2021-01-28T20:04:50.849Z", "IsFirstRun":false, "Locations": [ { "name":"Your first AWS S3 location", "uuid":"uuid", "accessKeyId":"XXXXXXXXXXX", "secretAccessKey":"YYYYYYYYYYYYYYYYYY", "bucketName":"tsdatastorageXXXX-dev", "watchForChanges":false, "disableIndexing":false, "fullTextIndex":false, "type":"1", "path":"", "isDefault":false, "isReadOnly":false, "region":"eu-central-1" }, { "name":"Your second AWS S3 location", ... } ], "updatedAt":"2021-01-28T20:04:50.849Z" } ``` Describe isNotEditable ###### Tag Library ```json { "id":"ts-demo", "tenant":"ts-demo", "createdAt":"2021-01-28T20:04:50.849Z", "updatedAt":"2021-01-28T20:04:50.849Z", "replace":true, "tagGroups":[ { "title":"Tag Group #1", "textcolor":"#ffffff", "color":"#008000", "uuid":"159a64bc-15ec-44d0-85ee-1215c157420d", "children":[ { "textcolor":"#ffffff", "color":"#008000", "title":"tag1", "type":"plain" }, { "textcolor":"#ffffff", "color":"#008000", "title":"tag2", "type":"plain" } ] }, { "title":"Tag Group #1", ... } ] } ``` :::tip You can find the `group` which have been configured in the file `team-provider-info.json` located in the folder `./amplify/backend/` ::: ## Upgrading to a newer release of the TagSpaces Enterprise To update execute `yarn ts-update`. In order to update the tagspaces-pro repository you should use the tagspaces-amp username and the provided personal access token. ```bash TagSpacesDev:~/environment/tagspaces-amplify (eu-west-2) $ yarn ts-update yarn run v1.22.10 $ cd tagspaces && git pull && cd extensions/tagspacespro && git pull && cd ../../.. Already up to date. Username for 'https://github.com/tagspaces/tagspacespro': tagspaces-amp Password for 'https://tagspaces-amp@github.com/tagspaces/tagspacespro': .... Done in 10.71s. ``` Then you should execute `yarn amppublish` in order to deploy the changes in the amplify service. This command will call internally amplify publish, which will trigger the build of the TagSpaces Enterprise. ```bash TagSpacesDev:~/environment/tagspaces-amplify (eu-west-2) $ yarn amppublish yarn run v1.22.10 $ yarn update-graphql-schema && yarn graphql-codegen && amplify publish $ amplify api gql-compile GraphQL schema compiled successfully. Edit your schema at /home/ec2-user/environment/tagspaces-amplify/amplify/backend/api/tagspaces/schema.graphql or place .graphql files in a directory at /home/ec2-user/environment/tagspaces-amplify/amplify/backend/api/tagspaces/schema $ amplify codegen ✔ Generated GraphQL operations successfully and saved at tagspaces/app/graphql ✔ Code generated successfully and saved in file tagspaces/app/graphql/API.ts ✔ Successfully pulled backend environment dev from the cloud. Current Environment: dev | Category | Resource name | Operation | Provider plugin | | -------- | --------------------------------- | --------- | ----------------- | | Auth | tagspacesdf5c4ca5 | No Change | awscloudformation | | Hosting | amplifyhosting | No Change | awscloudformation | | Function | tagspacesdf5c4ca5PostConfirmation | No Change | awscloudformation | | Function | tsTriggerFunction | No Change | awscloudformation | | Function | tsSheduleFunction | No Change | awscloudformation | | Api | tagspaces | No Change | awscloudformation | | Storage | tsDataStorage | No Change | awscloudformation | ``` ## Upgrading the version of the tagspaces-aws layer The tagspaces-aws layer provides a lambda function for creating and updating the index used for the search and a separate lambda function for creating thumbnails from image files. ``` amplify function update ``` ![update amplify functions](setup-tagspaces-enterprise/amplify-configure-function.png) ## Setup custom domain ![custom domain](setup-tagspaces-enterprise/amplify-custom-domain-2.png) ![custom domain](setup-tagspaces-enterprise/amplify-custom-domain-3.png) ![custom domain](setup-tagspaces-enterprise/amplify-custom-domain-4.png) ![custom domain](setup-tagspaces-enterprise/amplify-custom-domain-5.png) ![custom domain](setup-tagspaces-enterprise/amplify-custom-domain-6.png) ## Further notes On a Cloud9/EC2 setup, the regular build requires still `electron` which do not works OOTB, so the following command should be executed to install `chromium` package, which enables the electron package. ``` sudo amazon-linux-extras install epel -y ``` ``` sudo yum install -y chromium ``` If you are using Cloud9 for the deployment of the TagSpaces Enterprise the minimal requirements for the EC2 instance is t3.small (2GB RAM 20 GB disk space). In case of a JavaScript heap out of memory error, you can set the following environmental variable. `export NODE_OPTIONS=--max_old_space_size=1024` --- ## Setup TagSpaces Pro Web Since version 5 of TagSpaces, we offer a free web version of the application. The setup of the free web version is the same as the setup for TagSpaces Web Pro and is described in this [tutorial](/tutorials/setup-tagspaces-web). --- ## Install on TagSpaces Web # Install TagSpaces Web on a Web Server ## Introduction TagSpaces Web is a web based single page web application. For hosting it you need a web server able to host static content such as .html, .png, and .js files. This tutorials explains you how to setup the "App Hosting" area located in the upper right part of the following deployment architecture diagram: ![Deployment architecture of TagSpaces Web Pro](/media/tagspaces-pro-web-software-architecture.png) ## Download and Unpack The package can be downloaded from the link our [download page](https://www.tagspaces.org/downloads/). If you have purchased the PRO Web version, the download links are available in the email you have received from our payment provider after purchasing the product. The downloaded package is a ZIP archive file which can be unpacked with this command: ```bash $ unzip tagspaces-web-5.x.x.zip ``` The extracted files will be located in `./web` folder. Change the ownership of all files in the web folder to your www user. In the following example the www user is called `www-user`, but this is not mandatory and on your system this user has probably another name. ```bash $ chown -R www-user:www-user ./web ``` ## Place the app in your web server TagSpaces Pro Web can be installed on any modern web server offering static hosting of files like Apache or nginx. Copy the content of `./web` to a folder which is hosted by your web server e.g. `./www`. So listing this folder should look something like this: ```bash ~/www $ ls -all total 1476 4096 Sep 17 10:29 . 4096 Jan 15 20:42 .. 4096 Sep 17 10:29 assets 4096 Mär 6 2020 dist 6038 Sep 17 10:29 index.html 51519 Sep 17 10:29 logo.svg 1004 Sep 17 10:29 manifest.json 4096 Sep 24 2019 node_modules 3859 Sep 17 10:29 offline.html 452 Sep 17 10:29 pwa.js 2066 Sep 17 10:29 sw-config.js 1129 Sep 17 10:29 sw.js 1305364 Sep 16 2019 third-party.txt ``` :::caution Due to the current implementation, please make sure that you place the app files in the root folder of the web server. Using sub folders is currently not supported. ::: ## Securing the TagSpaces Web Installation It is highly recommended to use HTTPS for connection to your TagSpaces installation, especially if your installation is available on the Internet. In order have HTTPS connection you will need to setup a valid ssl certificate. You can use such for free from provider such as [Letsencrypt](https://letsencrypt.org/). Setting up a SSL certificate is not in the scope of this article. :::tip **Use static hosting**: In order to reduce the attack vectors it is recommended to configure your web server to deliver only static content by disabling the support of PHP, Perl, ASP.Net, Java and other similar server side scripting language and frameworks ::: ## Setup Basic Access Authentication On a Apache or nginx web servers you can setup very easily a **[basic access authentication](https://en.wikipedia.org/wiki/Basic_access_authentication)**, so not everybody knowing the URL of the installation can access the application. This is an optional step, which can be also exchanged with another way for securing the folder hosting the app. ### Create a .htaccess file You can go to the folder which contains the TagSpaces web app and create a `.htaccess` file with this command: ```bash $ touch .htaccess ``` This file should have the following content: ``` AuthType Basic AuthName "Access to the staging site" AuthUserFile /path/to/.htpasswd Require valid-user ``` Replace in this file "/path/to/.htpasswd" with path on your system where you plan to place this file. ### Create a password file In order to create file with user name and password pairs you will need the **htpasswd** command, which is part of **apache2-utils** (Debian, Ubuntu) or **httpd-tools** (RHEL, CentOS) packages. On Debian based Linux distributions you can install **apache2-utils** with the following commend: ```bash $ sudo apt install apache2-utils ``` Create a password file with a initial user. Run the **htpasswd** utility with the **-c** flag (to create a new file), the file pathname as the first argument, and the username as the second argument: ```bash $ sudo htpasswd -c /path/to/.htpasswd youruser ``` Press Enter and type the password for _youruser_ at the prompts. Create optional additional user-password pairs. Omit the -c flag because the file already exists: ```bash $ sudo htpasswd /path/to/.htpasswd yourseconduser ``` You can confirm that the file contains paired usernames and encrypted passwords: ```bash $ cat /path/to/.htpasswd youruser:$apr1$KkxMK/X2$AO2PMst7VdGgNCFKUTSit1 yourseconduser:$apr1$glNPbNg1$XvScMyvG6/TH6PX8jhoU.1 ``` ## Configure the web app The TagSpaces web app can be configured with an external configuration file called **extconfig.js** located in the root path of the installation. With this file you can configure for example a custom logo and colors or you can deliver predefined locations and tag library to your users. A documentation of all supported options in this configuration file can be found [here](/dev/external-config). :::tip You can use the property [**ExtSaveLocationsInBrowser**](/dev/external-config#saving-locations-in-the-browser) in order to enable the persistence of the location's configuration in the local storage of the user's browser. This is especially useful if you for security reasons do not want to place location configuration (containing access and secret keys) in the extconfig.js. Once enabled the end-user can configure location in her browser and they will be available the next time she uses the app. ::: This **extconfig.js** is not part of the installation so it have to be created manually. The specification of this configuration file is [here](/dev/external-config). ```bash $ touch extconfig.js ``` After this command the installation folder should look like this: ```bash ~/www $ ls -all total 1476 4096 Sep 17 10:29 . 4096 Jan 15 20:42 .. 4096 Sep 17 10:29 assets 4096 Mär 6 2020 dist 6038 Sep 17 10:29 index.html 34520 Sep 17 10:29 EULA.txt 51519 Sep 17 10:29 logo.svg 1004 Sep 17 10:29 manifest.json 695 Sep 17 10:29 extconfig.js <---- 4096 Sep 24 2019 node_modules 3859 Sep 17 10:29 offline.html 452 Sep 17 10:29 pwa.js 2066 Sep 17 10:29 sw-config.js 1129 Sep 17 10:29 sw.js 1305364 Sep 16 2019 third-party.txt ``` ## Updating the web app installation When a new version of the app is available, you just need to unzip the content and replace the files in the `www` folder of the web server. So if the this folder is mounted in you manager, you have to delete the files selected in the following screenshot and place the new files from the archive there. ![File to replace by upgrade](../tutorials/tagspaces-web-nas/files-to-replace-by-upgrade.png) :::caution You should not delete `extconfig.js` if you using one for configuring TagSpaces. Be careful not to delete also special folders such as `Recently-Snapshot` or `@Recycle` if you are hosting the app on a NAS system. ::: ## Connecting your files to TagSpaces Web After the setup of the web version, you will need to connect the so called locations containing the files you will manage with the application. The web version can currently connect only object storage (S3) locations, such as offered by Amazon AWS and Wasabi or hosted on you NAS with the help of MinIO. The following tutorials will help you with the setup. - [Connect AWS S3 buckets as location](/tutorials/s3-bucket-locations) - [Connect Wasabi buckets as location](/tutorials/wasabi-locations) - [Expose local or server folder as object storage with S3proxy](/tutorials/folders-as-objectstorage-with-s3proxy) - [Install MinIO and connect buckets from there as locations](/tutorials/setup-minio-bucket-nas) --- ## Collaboratively using tags and tag groups ## Introduction A common requirement for many TagSpaces users is sharing tag and tag groups across computer networks and devices. This article runs through the steps required for setting up TagSpaces in order to use a shared tag groups. It will guide you through the process of exporting the tag groups, editing them in externally and re-importing or reusing them in other installations. After understanding how TagSpaces handles tag groups you will be able to achieve the following use cases with our application: - Sharing tag groups with other TagSpaces users on a shared network drive or shared Dropbox / Google Drive / Syncthing accounts. - Using the same tag groups in other installation of the application on platforms such as Android But before we start, let's define some terms from the TagSpaces jargon. **Tag Library** is a collection of tag groups, which can be opened by clicking on the button located in the bottom left cornet of the application. A **Tag Group** is a collection of tags (3). For clarification you can see the screenshot bellow. So let's assume you want share the tag groups with the names "TagGroups for Sharing 1" and "TagGroups for Sharing 2" with your colleague which is also using TagSpaces in order to have a common base for tagging on collaborative projects. As a preparation steps you can define these tag groups and put the needed tags in there, with the desired names and colors. Of course you can change them later, but at this point is much easier as you can use the TagSpaces user interface. ## Exporting the existing tag groups After adding all the needed tags and specifying their colors you are now ready to export them. Just click the three dot menu on top right area of the tag library and select "Export Tag Library". In the following screen you can select which tag group you want to export. After clicking on the export button, a file saving dialog will appear, asking you to select a location where to save the file with the exported tag groups. This is files a called "tsm[20160807~131454].json", where the date/time stamp in the tags reflects the date and the time of the export. More on the export file format can be found in the [file format specification](/dev/metafileformats#taggroupsexport). ## Editing and cleaning up the exported library (optional step) This step can be skipped if you do not need to make changes to the exported tags, otherwise you have to open the json file in some text or json editor and do the changes manually. TagSpaces has a powerful build in json editor, with which you can edit the exported json files. We assume here that we want to share only the two previously mentioned tag groups "TagGroups for Sharing 1" and "TagGroups for Sharing 2". So we will open this file with the json editor in TagSpaces and delete the unneeded tag groups or adjust some tag names. To achieve this you have to open json file with TagSpaces and click on the edit button as shown in the following screenshot. ![view tsm json export file](sharing-tags/tsm-json-view.png) Then you can navigate to the tag groups element and make some changes there, see the next screenshot for clarification. Following our initial intention, we have to delete all the tag groups located above the "TagGroups for Sharing 1". You can use the menu of the tag groups elements for achieving this steps. Don't forget to click in the save button in order to persist your changes. ![edit tms json export file](sharing-tags/tsm-json-edit.png) Some other possible operation in the export file are: - Adding additional tags to an existing tag group - Duplicating an existing tag group and making changes to the contained tags - Changing the names of the tags and the tag groups - Changing the colors of the tags ## Distributing the library ### Direct import in the tag library In tag area of TagSpaces you will find a button, which once clicked will trigger the tags import functionality of the application. After selecting the file and clicking the "open" button, a dialogs will appear asking you to choose the json files, which should be imported. This dialog is shown on the next screenshot. This method has the drawback that once imported in another TagSpaces installation, these tags are disconnected from the source tag library, so any changed done in the source application, will **not** be reflected in the instance where the tags were imported. ## Closing remarks Currently you can not use any of the described methods for transferring **smart tags**, because they relay on a tighter integration in core of the application. --- ## Install TagSpaces Web on Cloudflare In this tutorial you will learn how to install TagSpaces Web or TagSpaces Pro Web on a **Cloudflare Pages**. **Cloudflare** is a cloud provider, offering with their [**Pages**](https://pages.cloudflare.com/) product a completely free way for hosting static web pages, with https support and unlimited bandwidth. ## Register a free account on Cloudflare Go to [Cloudflare Pages](https://pages.cloudflare.com/) and sign up for a new account. ## Install Wrangler 2.0 CLI Wrangler is command line application offered by Cloudflare for managing the deployments. Install it globally with the following command: ``` npm install -g wrangler ``` :::info You will need **node.js®** on your computer in order to user the **npm** command. You can get it from here: https://nodejs.org/en/download/ ::: ## Authenticate Wrangler with your Cloudflare account Open the terminal or command prompt and execute the following command to connect wrangler to your Cloudflare account. ``` wrangler login ``` ## Unzip tagspaces-web package Extract the content of the **TagSpaces Web** or **TagSpaces Pro Web** package to a folder from which you will later manage the deployments and open a terminal / command line prompt there. ## Create new deployment Execute the following command and follow the instruction to create a new Cloudflare deployment. ``` CLOUDFLARE_ACCOUNT_ID=YOUR_ACCOUNT_ID_HERE npx wrangler pages publish web ``` Here **web** is the folder of the unzipped tagspaces' package. :::info Replace the YOUR_ACCOUNT_ID_HERE with the account which you will get from Cloudflare. ![Cloudflare account ID](/media/cloudflare-account-id.png) ::: **That's it!** Go to https://your-project-name.pages.dev and you should be able to access TagSpaces Web. ## Some further optional steps ### Setup a sub-domain to the deployment The needed steps are described in here: https://developers.cloudflare.com/pages/platform/custom-domains/ ### Restrict the access with password You can follow this tutorial to achieve this: https://dev.to/charca/password-protection-for-cloudflare-pages-8ma :::info If you need a solution, where the files are behind a login, you may take a look on [**TagSpaces Custom**](https://www.tagspaces.org/products/custom/), where we offer a setup based on AWS services supporting user management, 2FA, automatic indexing and countless customization possibilities. ::: --- ## Install TagSpaces Web with Docker # Using TagSpaces with Docker This guide provides instructions for using **TagSpaces Lite Web** and **TagSpaces Pro Web** as Docker containers. The Docker container is based on [Alpine Linux](https://www.alpinelinux.org/) and uses [nginx](https://nginx.org/en/docs/) as the web server. ## Get Docker {#getdocker} Install Docker for your operating system from https://docs.docker.com/get-docker/. ## Using TagSpaces Lite Web with Docker {#tagspaces-lite-web-docker} ### Get the TagSpaces Lite Docker image {#tagspaces-image} You can download the latest TagSpaces Docker image from [hub.docker.com](https://hub.docker.com/r/tagspaces/tagspaces-lite-web) or directly from the Docker Desktop app: ![Getting the TagSpaces image from Docker Hub](tagspaces-web-docker/getting-tagspaces-image.png) Click the `Pull` button to download the image locally. Alternatively, you can use the following command in your terminal: ```bash docker pull tagspaces/tagspaces-lite-web ``` ### Run the image Once the image is downloaded, you can run it in the Docker Desktop app: ![Run the TagSpaces Docker image for the first time](tagspaces-web-docker/running-tagspaces-image.png) These steps will create a TagSpaces container in your local Docker repository. Alternatively, you can run the following command in your terminal: ```bash docker run -dp 127.0.0.1:9000:80 tagspaces-lite-web:6.0.0 ``` `9000` is the port on your local machine where the TagSpaces Web app will be accessible. ### Testing in the browser If everything is set up correctly, open your browser and navigate to [http://localhost:9000](http://localhost:9000) or [http://127.0.0.1:9000](http://127.0.0.1:9000). You should see TagSpaces Web. ![TagSpaces Web first start](tagspaces-web-docker/tagspaces-web-first-start.png) ## Using TagSpaces Pro Web with Docker {#tagspaces-pro-web-docker} ### Download TagSpaces Pro Web package Customers who have purchased TagSpaces Pro Web can download the package from the links provided in the purchase confirmation email. ### Unzip the package Use your preferred tool to unzip the package. On macOS and Linux, you can run the following command in your terminal: ```bash unzip tagspaces-web-pro.zip ``` This will create a folder called `web` in your current directory (e.g. `/Users/username/Downloads`). ### Creating the container Get the _tagspaces-lite-web_ Docker image as described [here](#tagspaces-image). Next, use the Docker Desktop app to create a new container from the tagspaces-lite-web image by clicking "Run" in the image area. ![Run the TagSpaces Docker image](tagspaces-web-docker/running-tagspaces-image.png) ### Configuring the container In the "Run a new container" dialog, open the optional settings and configure the following options: - **Container name** - Something like "tagspaces-pro-web". - **Port** - A different port than the one used for the Lite version. - **Volumes** - **Host path** - The path where you unzipped the Pro Web package (e.g. `/Users/username/Downloads/web`). - **Container path** - Set to `/usr/share/nginx/html`. ![Configuring the Pro container](tagspaces-web-docker/configuring-pro-container.png) ### Testing in the browser After running the container, open [localhost:9100](http://localhost:9100) in your browser. TagSpaces Pro Web should now be loaded. ![TagSpaces Pro Web first start](tagspaces-web-docker/tagspaces-pro-web-first-start.png) ## Enable location configuration data to be stored in the browser By default, TagSpaces Web does not store location information in the browser to avoid leaving sensitive data in external browsers. In order to enable storing the location data in the browser, you have to edit the `extconfig.js` which is located in `/usr/share/nginx/html` and uncomment the line shown in the next screenshot. ![Adjust extconfig.js to enable local storage](tagspaces-web-docker/adjust-extconfigjs.png) Reload the application in your browser and now on your location data will persisted in the local storage of your browser. If everything went well you should see the extconfig under this URL: http://localhost:9000/extconfig.js in your browser. ![Extconfig.js in your browser](tagspaces-web-docker/extconfig-js-browser.png) :::tip After exchanging the docker image with a newer version, please make sure to enable this setting before loading the updated version in your browser, otherwise you will loose the stored location data in the browser. ::: ### Clear local storage of the browser :::warning After enabling this feature, and save location data with access keys to s3 buckets in a browsers not used only by you (e.g. in an Internet café or on PC of a colleague ...), please make sure to clean the local storage of the browser once you leave this browser, otherwise persons using this browser after you will get access to these buckets. ::: Step to clear the local storage for the TagSpaces web app in the Chrome browser. 1. Open develop's mode (e.g. with the F12 key) 2. Navigate to tab _Application_ 3. Click the _Clear site data_ button ![Clean local storage for TagSpaces web app](tagspaces-web-docker/clean-local-storage-chrome.png) In other browsers the steps are similar. ## Connect various S3 object storages as locations Both versions of TagSpaces Web can connect to S3-compatible object storage. Here are some tutorials for connecting TagSpaces with popular services: - [AWS S3](/tutorials/s3-bucket-locations) - Cloud service - [Wasabi](/tutorials/tagspaces-web-wasabi) - Cloud service - [S3Proxy](/tutorials/folders-as-objectstorage-with-s3proxy) - Self-hosted - [Minio](/tutorials/setup-minio-bucket-nas) - Self-hosted - Cloudflare R2 - Cloud service ## Adding basic authentication To prevent unauthorized access, you can add basic authentication. Below are steps to configure this using the [Nginx documentation](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/). :::warning Make sure the [extconfig.js](/dev/external-config) file is inaccessible to unauthorized users, especially if it contains access keys for S3 object storage. ::: ### Create a password file Ensure `apache2-utils` (Debian/Ubuntu) or `httpd-tools` (RHEL/CentOS/Oracle Linux) is installed, then create a password file: ```bash sudo htpasswd -c .htpasswd user1 ``` Create additional user-password pairs. Omit the -c flag because the file already exists. ```bash sudo htpasswd .htpasswd user2 ``` ### Copy the password file to the container ```bash sudo docker cp .htpasswd tagspaces-lite:/etc/nginx/ ``` ### Modify the nginx configuration file Add the following lines to the `server` section of the nginx configuration file in the Docker container: ```bash auth_basic "TagSpaces Web"; auth_basic_user_file /etc/nginx/.htpasswd; ``` The configuration file is located at `/etc/nginx/conf.d/default.conf`. ![Adding basic auth to nginx](tagspaces-web-docker/adding-auth-nginx.png) ### Restart the container After saving the changes and restarting the container, an authentication dialog will appear in the browser. Log in with the credentials created earlier. ![Basic auth dialog in Chrome](tagspaces-web-docker/basic-auth-browser.png) ## Add custom TagSpaces configuration TagSpaces can be partially configured using an external [configuration file](/dev/external-config) called `extconfig.js`, placed in the root folder of the application. To add this file to the container, use the following command: ```bash sudo docker cp ./extconfig.js tagspaces-lite:/usr/share/nginx/html/ ``` The configuration file can include your locations or a custom tag library. ## Further Options ### Installing an SSL certificate from Let's Encrypt SSL certificates are needed for both your TagSpaces installation and the object storage service (e.g., Minio, Zenko). A helpful tutorial for Ubuntu and Apache can be found [here](https://davidaugustat.com/web/set-up-lets-encrypt-on-intranet-website). ### Installing a self-signed SSL certificate TBD --- ## Setup publicly available TagSpaces Web on Wasabi In this tutorial you will learn how to install TagSpaces Web or TagSpaces Pro Web on a Wasabi bucket and files from another bucket publicly. This is usefull if you wish to make a folder with file publicly available and integrate it on your website, similar to the [demo web page](https://www.tagspaces.org/demo/) of TagSpaces. **Wasabi** is a provider of AWS S3 compatible object storage, with an attractive fixed [price model](https://wasabi.com/cloud-storage-pricing), where the customer do not have to pay for download(egress) traffic. This tutorial can be used to make a similar setup with other S3 providers such as [AWS S3](https://aws.amazon.com/s3/). ## Hosting the TagSpaces web app In order to have the TagSpaces Web application on the Internet, you will need a place or service which will host the application's file. In our case this will be a S3 bucket which which we will create in the folloing steps. - Login to Wasabi console and go Buckets section - Click on the **Create Bucket** on the top right corner and give the following information: - Bucket name: **my-tagspaces** - you can change the name something suitable for your use case - Region: **us-west-2** - choose a region which is near to the potential customer of the application - After creating the bucket go to its Settings by clicking the button with gear icon. ![](data:image/png;base64,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) - Go to the **Policy** tab and enter there the following securty policy. This way you will make the content of the bucket publicly asccessible. If you have used different name for the bucket you have to adjust it in the **Resource** section. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::my-tagspaces/*"] } ] } ``` - Extract the content of the TagSpaces Web package to a folder on your computer - Clicking on the **Uplad Files** button and drag the content of the **web** folder to the area which will appear. - After the content of the folder is analysed you have to confirm the upload process. - Once the upload is ready you TagSpaces Web application will be available unter this url: https://my-tagspaces.s3.us-west-2.wasabisys.com/index.html :::info An alternative way to setup a TagSpaces (Pro) Web instance is to use Cloudflare Page, which is described in this [**tutorial**](/tutorials/tagspaces-web-cloudflare). ::: ## Hosting your file in a public bucket In this section a bucket for hosting your publicly available files will be created. - Go again to the **Buckets** section and create a new bucket. - For this turorial we will use **my-cloud-files** as the name of the bucket. Of course, you can choose here a more suitable name. - Choose an appropriate hosting region, which can be the same as the app's bucket. - Confirm the bucket creation by click on the **Create Bucket** button. ## Setup read-only access to the files bucket Here we will create a user whose access and secret keys will be available publicly, so all Internet users can access the **my-cloud-files** bucket in a read-only mode. ### Create read-only policy Go to the **Policy** section and create a new policy called **TagSpacesReadOnlyPolicy** with the following content. The policy restricts the user to just list and get object (e.g. files) from the bucket **my-cloud-files**. ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetObject"], "Resource": [ "arn:aws:s3:::my-cloud-files", "arn:aws:s3:::my-cloud-files/*" ] } ] } ``` Do not forget to adjust the name of the buckets in the **Resource** section to reflect the name of the buckets you want to manage with the policy. ### Create read-only user Go to the user's section and creata a new user, by clicking on the **Create User** button. You can the user **my-ts-admin**. Choose the **TagSpacesAdminPolicy** policy in the creation wizard for this user, as shown in the following screenshot. ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAJyCAYAAADZ+jZlAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAApdEVYdENyZWF0aW9uIFRpbWUATW8gMDkgSmFuIDIwMjMgMTk6MTI6MzIgQ0VUKpsWkQAAIABJREFUeJzs3Xd4FFXfxvHvsumEkEIaCSEh9BJ6aFKVpiACdniwYFesoD4+FuwidizYsaGiVBEEpPfeCSWNkJCEkt7bvn9E9t1IgASy2QTuz3V5aXZmzjmz+3Pn3tkzswaTyWRCREREREQAqGPrAYiIiIiI1CQKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCwoIIuIiIiIWFBAFhERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCwoIIuIiIiIWFBAFhERERGxYGfrAYiI5OXns3r9Zrbt2kdsXDzpmVnY29vh5eFO21bN6dOjKy2bhdp6mLXGXROewd7eji/ee71C6z/yzGTy8vL56sM3rTwyEantYo4eAyCkcaMKrZ+dk8O+iMN069zBmsOqcgrIImJTq9ZvZsbPs0nPyMTBwZ7moSG0btmMoqIikk6c4q/la1j892o6d2jLY/fdST3XurYecoVM/3YmS1au5fP3XsOngZethyMicslijh7jhTffB+DV/z5xwZCcnZPDC2+8T0xcPBPuHceA3j2qY5hVQgFZRGzmh1nzmLNwCe713XjgztsY0LsH9vb2ZdZJTUtn9sIlLFq2ik++/oFnH3vARqMVERGTyURObh4vvPn+eUOyZTiujTQHWURsYtmqdcxZuITgoEDefeU5Bg/oc1Y4BvBwr889Y2/m+ace5qG7x9pgpCIiAqXTKl577klcnJ3IzsnlhTff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O4dxt4zk0XvH8cnXP/LSWx/StEljbhs1nKWr1lFYVIS93blLw8vDnf89+RDf/zKHuX8upb5bPUZeO5Ce4WffDk5qh6u6dcHJ0ZHf5i/m9z8WY29nR/PQEF797+MENvQ753aPjP8PX/04ixff+gCjsQ49unbi7jE3mpffeP0QEhKTeOmtD/Fp4EmP8E7ExMWXaaNFs1CmfvwlySdP075NS+68rXR71dmVITgokKcn3MsPs+bx3a9zCWzox/+eeJDQf27Vdj4tmzXhobvH8Ou8P5k+42eaBDdi8jOP4lq37lnrNg1pzKRH7mXm7AXMmrcIP58G3PufW/DycAfgv489wBff/8LEF9/E3t6erh3bMfbmG6p8f6X6GI1G7rhlFO9++jWD+/fGu4EnL06cwFc/zmLii29St64LA/v1onvnDuZtwjuG4eBgT49ybm96hpOT4wXb6dC2JYlJJ8zfxAU3CsDby5P2bVpab4elShlMJlP5EwxFRKzozH2Qp7z4NM2b6itHERGpOXSeX0RERETEggKyiIiIiIgFTbEQEREREbGgM8giIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCwoIIuIiIiIWFBAFhERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCwoIIuIiIiIWFBAFhERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBeRaYN6iZdx27+N89cMs82NvT/uCkeMe5InnX7fhyEREREQu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meW3j77efFZ4xNBr2LB1B8cSErlrwjPUc3UhJTUdgL49w3F2cqJRgD83jbiWWfP+5HBkDP97/V1zWwaDgaiYo3QMa3PR43172hdl/nZycuSph8bj6106dcNoNPLw+LG88f5npKaln7X+tl17adG0CQDNQ0M4eCSKYwmJTHrpLSZNuJee4Z1Ztmo92Tm5PPLM5LP6z8/Pr/BYe4Z3Yu6fSzmWkMiTL7yBh3t90tJLn6+Gfr60a92iMrsuIiIicsUyTp48eXJ1debk5EjfXt0oKioiPbP0VmnOTo60aNaE8WNv4pq+vczr1nerR7dO7UlNzyAlNY28vHwCG/oxathgxt40wnxP33atmhPo78fplDQys7NxdHCgTctmTLh3nPkM6q59ERyKjMbRwYGR1w067xijY4+xdece899GYx28vTzp1a0zj913pznwnuHv602nsDakpqWTlpEJGAgOCmTMjdczYuhA83rNmjTmeFIyKanp1HOtS9+e4YS1aUmAvy8Jx5PIyy+gcWBDxt06ii07dgOloTo0JIj1W7YTfzwJ9/puDBnQB+Csx+yMRnr36EJBQSGnU9PIyMjEy9OD/r27M+HecdTVD4WIiIiIVIjBZDKZbD0IEREREZGaQrc1EBERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiodoCcmTMUUaOe5BHnplc5vH3p3/LyHEPsmjZquoaioiIiIjIOekMsoiIiIiIhcs6IJeUlNh6CCIiIiJSy9jZegD/FpeQyDc/zuJwVCyOjg507RjGnbeOwsXFGSidqvHtzN+JionDw70+A/tdxcjrBmIwGHhpyofs2X+QUcMGs3zNBm66fihrNm7lcFQM9427lfmL/yYjM4vuXTrw8PixGI1G8vLy+e7XOWzatou8vHyaBDdi/JibaBIcBMDoOx8u7advL/5cthKTycRNI4bSwNOT736ZQ1Z2Nt27dOShu8diNJZ+3lizcSu/zV/EyVMpNPTzYcyNI+jcoS0A0778nu279/Hm8xPx9/OxzZMsIiIiIudUo84g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s3LdJqr6+vLAuOEArN6wha8XLuHBe0c48xRERERE5Crn9Fks+vXqwYatO5n55TzuHNwfg8EAQOypBLy9vAhv1AAAFxcXBvfrxcZtOwHIys6mWlU/+366dWpPl47tnN19EREREbnKOXUEGcDDw53bbunGpm27aH99S/vymNg4jhyP4tWp79uXFVqtBAcFAtCnR1fe/WQWB3+LpP31rbi+ZXN7mBYRERERuVQMNpvN5uyDHjp8hE3bdvHImLvty9Zv2UFyShrDBt52wW2TU9PYeyCC1Ru2cu/wO2jRrMnl7q6IiIiIXEMqzYNC6oQEc/jIsTLXR/x+lMJCK4H+NejdoyvPPvEg3/3wkxN7KCIiIiLXgkoTkOuH1sFSWMjaTdvsy3buPcDeg78BsGnbLjZv32Vfl5CYXKwmWURERETkUqg0JRYAOWdz+XzufE4lJIEBGtWvx+g7B+NqMpGbl8fnc78nJe00AJ4e7jw8+i6FZBERERG5pCokIIuIiIiIVFaVpsRCRERERKQyUEAWEREREXGggCwiIiIi4kABWURERETEgQKyiIiIiIgDBWQREREREQcKyCIiIiIiDhSQRUREREQcKCCLiIiIiDhQQBYRERERcaCALCIiIiLiQAFZRERERMSBArKIiIiIiAMFZBERERERBwrIIiIiIiIOFJBFRERERBwoIIuIiIiIOFBAFhERERFxoIAsIiIiIuJAAVlERERExIECsoiIiIiIAwVkEREREREHCsgiIiIiIg4UkEVEREREHCggi4iIiIg4UEAWEREREXGggCwiIiIi4kABWURERETEgQKyiIiIiIgDBWQREREREQcKyCIiIiIiDhSQRUREREQcKCCLiIiIiDhQQBYRERERcaCALCIiIiLiQAFZRERERMSBArKIiIiIiAMFZBERERERBwrIIiIiIiIOFJBFRERERBwoIIuIiIiIOFBAFhERERFxoIBciqwz2Tz+/CQeGDuOuPjES77/yTM+4e6HnmLj1p2XfN8iIiIi8s+YnHmwB8aOIy09o9gyTw8P6tQO5tZuN9GzaycMBoMzu1Sq6Ng4TiUkAfDb78eoXavmJdu3xWJhx54D2Gw2du47SJcbb7hk+xYRERGRf86pAbk0uXl5HDkWxZFjUUREHmXsw/dVdJdoHt6Yfr17kJeXT+cObS/pvk0mEw+NupODh39nSL/el3TfIiIiIvLPGWw2m81ZBzs3gtyiaWNGDrsDgMwzZ5j/488cOxEDwKTnx9KqefjfPobVasVgMFSKkWgRERERufJUyAiyj483jRuG2b8OC63Dg0+OB2DP/gh7QE47nc7XC5aw9+Bv5JzNJbR2LYYNvJ3217cEIC8vn7seehKA0XcOZvP23RyPjuW9tyayav1mfly+ioZhoQzq24tvFy0lKTmVkFo1+dd9d+Pm5sr/vvqOY1ExVK9alQG39eS2nt0AiI2LZ+z41wB4YewjdGjbCoCk5FS+XriEiMgjnM3NIzgwgD49u3HrzTfZA3l52ox69BnOZOfQr3cP/u+eYfbX4Zc1G1ixegPxScl4eXrSttV1jBw2kKp+vgCs37KDdz+ZhcFgYNorL/D5199zLCqGGtWqMmzg7XTv3NG+r/L0Q0RERERKqvASC4CqvlUwGo1YrVZy83IBSM/I5LlXpnA6PdPe7lhUDJNnfMJzTzxIx3Ztiu3jq/k/YLVaATAa/wyAMXHxTPtwJucGyqNj45j83qcUFhaSdSYbgMTkFD6bM496dUJo2rhhqX3MyMziuVemkHUmG1eTCXd3d6Ji4/h41tecSkhizN1DytWmLJ9//T3Lfllj/7qgwMzqDVs48FskUye9gJ9vFfs6m83GS29OJzcvD4CEpBTe/9+XNAgLpW5I8D/qh4iIiMi1rsJnscjOySkWbuuG1AJg7vc/cjo9Ey9PD54f+zDTX3+RVs3DsdlszJ63qMR+3FxdGTqgDw+NuhM/X1/7crPZzLCBt/Pf11+kZ9dOQFH4rhkYwNRJL/D82IdxcSl6Gbbu3FtmP7fu2kvWmWzc3Fz55J3X+fKjqfTseiMAy1evp7DQWq42pYmKjeOnX9cCcFOHtrzz2nj+NeYeXFxcSEk9zbzFy0ps06ZlM6ZOeoEnHhyFwWDAZrOxY/e+cvdVREREREpXISPIW3fuZdCof5VYHuBfnR5dO2Gz2di2qyis9unZjY5tWwNw5+D+7I+IJCk5laSUVPyq/DmqOnRAH4b071Nin1V8vLlrcD8AbrulG6s3bAFgcL/eNKwfSkNCqRtSi6jYONJOZ5TY/hw3V1cALJZCjpyI4obWLbn/nuEM6X8bUDRqXZ42pb8ee7DZbLi6uvLomHvw8vKkfmgdfvv9KOu37GDrzr08PPquYtvcf/dQalSvRsP6oXy3+CeSU9NISTtd7r6KiIiISOkqRYmFi4uRG9q04v9GDsPL04OMzCzO5haVDyxa9guLlv1SYpv0jMxiAdnTw+Mvj+Nq+vN0z40aA7j+ESjzzQVlbtup/fUsWb6K2FMJTJnxKZ4eHjRt3IAeXW7kpj9muihPm9IkJqcCEBRQAy8vT/vyhmGhrN+yg8ysM/ZyilLPy7XovMxmyz/qh4iIiIhUUEBu0awJo0YMwmAoGnUNDKiBu5ubfb3ZYrH/O8C/Or4+PiX2cS7UOounhwdTXxnHTyvXsmXHHo5Hx7LnQAR7DkRw5HgUY+4eWq42pTlXH+3i4lJseaH1z1IIA+Uf9f27/RARERGRiprFwtuLhmGhZa6v5ueLq6srZrOZ61texyP3/VleUFBgxs2tKBzn5eVf9r6ecyI6ljM5Z2l/fUsG9e1FRmYW//vyO7bs3MOyX9cycthATp5K+Ms2pQX7oAB/ABKTUsjLy8fDwx0ouqEQwLeKj33Zpeqrs3/BEBEREblSVPhNeqUxmUz2qdxWrtvEkhWriYtPZN+hw4x7fRpLVqx2ep9+WrmOSVNmMOW9z8g5m0tVP18a1i8K+TabDUthbJlUcgAAIABJREFUYbnalKZju6Ia6/yCAj6a9TXRsXGs3rCFTdt3F1t/KfsqIiIiIqWrFDXIpRlz1xAijxwnLT2DWd8sYNY3C+zr3Fxd6d+7h1P7M/C2W9iycw8nTyUw5onnqeLjZZ+Crlun9nh6eJSrTWkahoXSp2dXVqzewMatO9m4dad9XY3q1bhrcP9L3lcRERERKV2lDcg1qldj6isv8O2iZezad5CsM9n416hGl443MHRAH6c/7KJu7Vq8/fLzfLNwKYcOHyEnJ5fQOiH06HIjfW+9udxtyvLQqDsJqRnEL2s3kpicipenB9e3bF7sQSGXsq8iIiIiUjqnPmpaRERERKSyq5Q1yCIiIiIiFUUBWURERETEgQKyiIiIiIgDBWQREREREQcKyCIiIiIiDhSQRUREREQcKCCLiIiIiDhQQBYRERERcaCALCIiIiLiQAFZRERERMSBArKIiIiIiAMFZBERERERBwrIIiIiIiIOFJBFRERERBwoIIuIiIiIOFBAFhERERFxoIAsIiIiIuJAAVlERERExIHJ2QfcHxHJd4t/Iir2JF6eHoQ3asCo4YMICvR3dldERK4oaafTeeDJ8cWW+Vbx4YY2LRg57A6q+vn+5T4SklJ49NmJhAQH8cGUSWRkZvH0xDdpUC+U8U/96y+3n/jWdBJTUvnvay/i4+31t89FRKQyc+oI8u79h3h16vscPnKMan6+GAxGtuzYw/g3ppGdk+PMroiIXLGMRiONG4TRuEEYVquN1Ru2MnHyu5gtloveV15+PplZ2SSnppWrfXLqaTIysigoMF/0sURErhROHUH+/OvvsVqtjLl7CAP63ILVamXahzPZunMvK1ZvZOiAPiW2sVqtGI2qBBEROcfDw50pLz8HwNmzuTw98S1Onkpgx+793NSh7UXtq2ZgADPffRMPD/dytZ/+xouYzRZ8q/hcdL9FRK4UTgvIJ08lkJCYjI+3F31v7Q4UjYIM7tcbV1dX3N3dAPj+x+V8s3AJvbp3JiLyKHVCavH8vx8i8uhx5sxbRFRMHNWr+dGrexcG3nYLBoOBr+YvZtGyX7n/nmH0792D5NQ0Hv7PS9QMDODjaa/a99m1U3uOR8WSnJpGmxZNeeLB0fY/ES5YsoJf124k60w2IbVqcvfg/rRtfZ2zXh4Rkb/Fy8uTFs2akJicQkJSCgCn0zOZOfc79h86jLu7O+1at2D0nYPx9vIssf35JRdQ9Ne+ufN/4FRCEoEBNRjSvw/dO3cE4InnXyEtPYNZ70+hqp8vWWey+d9X37HnQARurq60a92C++4aYj+Wrq0iciVy2tBsYnLRhbtmYAAuLi725Q3DQnnqkTH0792jWPtf124iKSUND3c34hOTmDh5Br8fiyIstA7ZOWeZM28RC5euuKg+bN25l4ZhdakZ6M+OPQf48rtFAKxav5mvF/yIt7cXvbp3JiExmcnvfcqphKR/eNYiIpeX2WLh2IloAAIDamC2WJg4+V227tyLf43quLu5sXLdJqZ+8L9y7S8hMZm33v2Ek/GJNG4QRlp6Bu99Nof9EZEl2lqtVl6d+j6btu2iZmAAfr5VWLV+Mx99PhfQtVVErlxOG0HOzc0DikY7ADIys/h6wRL7+uCgQAb362X/um2r63j+3w/h6urK/776DrPZzIhBfblzUD+SklN57PlJLFr2K0P6lyzLKMuAPj0ZOWwgmVlneODJ8azbtJ1H7rub49GxANx+y83cevNNNG3ckGNR0eQXFFyKUxcRuaTy8vIZ99o0oGjwISMzi0D/GtzQpgW79h7kVEIiLZo25pUXnsRSWMjTE95k/6HDHIuKwdvrwjfWLf11DYWFhTxw73D63tqdbbv3MWXGp2zdsYdWzcOLtT14+AjHo2Np2Tycfz84Chvw8uQZbNm5h9y8PF1bReSK5bSA7OHhAUBOztmi/589y6r1m+3rwxs1KBaQmzSsj6urKwAxsacAaNOiGQBBgf7UCQkmOjaO+MTyj0S4uxWVcfj5ViHQvwbxiUmczsikc4d2rFy3mY9nfc2q9Ztp2TycPj26EeBf/R+csYjI5WG1Wok8ehyDwUD1qn50ufEGRg4biKeHB9Eni66Xra5risFgwNVkotV1TTl5KoHjUTG0bN70gvs+N7rbpGF9ADq2bc2CWR9iNBpKtI2KOQnAgYjIErNrJKWk6doqIlcspwXkWjUDAUhITsFsNhMSXJPFX37M3gMRvDrtgwtua3It6qbB8OcF2mazARQr17gYhYWF9n83D2/E9Ndf5Je1G9mz/xALlixn+ap1TH/9JV3IRaTS8fLy5OtP/lvqOlfTuevlnxV0Nus/u166uJRejXfuOtq29XX06dG12LrAGtXxqhOia6uIXJGcVoNcu1ZNateqydmzuSxY+ot9+dk/Si8upG5IMAD7Dh0GIPV0OnHxiXh4uBPoXwMP96LR6TPZ2QBkZp0pdT/pmZkAJCWnkpyahpubK9Wr+vHd4p9YsmI1I4cO5KOpr9Kz643knM21H09E5EpRt3bR9fJAxGFsNhuFhVYORR75Y12tv9w+JDgIgKPHowGIiDzK2HGvFiuJ+/NYRfuLPRlPs8YNade6BYEB/nh6eODl5alrq4hcsZw6zduD947g1WkfMP+Hn1i/eTveXp7ExMUDRTeXlKV/756sWLOReYuWcSAikrj4RAoLCxlxR1+MRiMNwuoC8MPPq/j9WBTHo2JK3c+K1RuIiokjMTkFm81Gzy6dMBqNFJgLWLV+M4nJKYQ3asD+Q5EYDAbq16tz6V8EEZHLqF3rFtStXYv9EZH8Z8KbmM2WoprkZk1o3CDMPtNFWfre2p1f127ki28WsG33Po5HxZBzNpdRIwaXaHt9y+sIq1ubqNg4Hn/hFerWrsXhI8cIqFGDD6a8rGuriFyxnDrBcMvm4bzywlhaNGvCmexsTiUkEVq7FqPvHMzjD9xb5nYB/tWZ+MzjNAiry+/HojAajQwbeBtD+vcG4PqWzRnQpyfubm6cPJVA7/P+1HdOh7atycvP52xuLh3btWHk8DsAuHvIAAb36018YhI/Ll+Fj7cXzzz2AA3q1b30L4KIyGVkNBp56T+P0f76liQmpZCekUGXG2/gmcceKNf2IcFBjBv7L0KCg4iIPIqPjzeP3n9PqVOzubgYmfT8WG6+qQNms5nDR47RpEEYT/1rDKBrq4hcuQy2c8W8V7Fz8yDfPWQAwwbeVtHdEREREZFKTI+oExERERFxoIAsIiIiIuLgmiixEBEREREpL40gi4iIiIg4UEAWEREREXGggCwiIiIi4kABWURERETEgQKyiIiIiIgDBWQREREREQcKyCIiIiIiDhSQRUREREQcKCCLiIiIiDhQQBYRERERcWCq6A6IiIhzWa1WcnNzycvLo6CgAIvFgtVqrehuyVXMaDRiMplwc3PDw8MDT09PjEaN0UnlZbDZbLaK7oSIiFx+ZrOZrKwssrOzK7orIvj4+ODr64urq2tFd0WkBAVkEZFrQHp6OllZWRXdDZESfH19qVatWkV3Q6QYBWQRkauY2WwmNTWVgoKCiu6KSJnc3Nzw9/fXaLJUGgrIIiJXqfz8fJKTk1VfLFcEo9FIYGAg7u7uFd0VEc1iISJyNTKbzQrHckWxWq0kJydjNpsruisiCsgiIlej1NRUhWOpcPn5+eTn55e7vdVqJTU19TL2SKR8NM2biMhVJj09XTXHUiEsFgspKSkkJyeTk5NTbJ23tzeBgYEEBARgMpUdPwoKCkhPT9eNe1KhVIMsInIVMZvNxMfHV3Q35Bp0+vRpjh07hsViuWA7k8lEw4YNqV69+gXb1apVSzftSYVRiYWIyFVEU7lJRUhOTiYyMvIvwzEUjTJHRkaSnJx8wXb6LEtFUkAWEblKWK1WPQREnO7cyPHFOnbsGKdPny5zfXZ2turopcIoIIuIXCVyc3MrugtyjbFYLCXCcfXq1UutMTaZTCXKKv6qJEOfaakouklPROQqkZeXd1Ht33jjDQ4ePEhhYSHJyckEBwcDMHDgQO66666LPv7Ro0d599137aOCffv2ZeTIkRe9n0ttzJgxnD59Gjc3NwDatWvHU089Zf/6n3jppZfo2rUrvXr1wmq1MmvWLH766ScKCgpo3rw5Tz/9NIGBgRfcx/Lly9m1axcTJkwo9zmEhoby9NNP29+z0iQmJvLoo4+yaNEikpKSePrpp5k7d+7fO9EypKSkFAu41atXJzw8nJycHCIiIuzrTCYTzZs3x9vbm8jISPtn5NxNfWWdR15eHt7e3pe0zyLloYAsInKVuNiZK1588UWgKEjdd999zJs37x8df/z48Tz11FN06tSJnJwcnnjiCYKDg+nZs+c/2u+lMGHCBNq1a0dBQQETJkxg3rx5jBo16pIeY86cORw8eJA5c+bg7e3N999/z7PPPsusWbMwGv/5H2zPnQPAvHnzePXVV/n444/LtW1QUFC5216M8+uIs7KyyMnJwdvbm+bNmxMREQFgD8c5OTklaosdfzk7n2ZjkYqigCwicpUozw1S5bVp0ya++OILrFYrfn5+vPzyy1SvXh2z2czUqVPZu3cvAQEBGI1G+vbtS+/evcnMzCQoKAgomtLrhRdewGAwEBERwRtvvEG9evXIzMzEw8ODiRMn4ufnR3R0NNOnTyczMxOj0ciTTz5Jy5YtAfjhhx+YP38+RqOR5s2b8+yzz2IymVizZg1ffvklVquVJk2a8Nxzz+Hq6srq1auZOXMmRqORBg0aMH78eDw8PIqdl5ubG506dWLPnj0AnDhxgmnTppGTk0PVqlUZN24cNWvWLLNfFouFd955h127dhEYGFisBGDx4sW8++67VKlSBYARI0awdOlSDh48SKtWrejRowcjRoxg+/bt5ObmMmHCBJo1a1bs/Rs0aBDvvfceYWFh7Nmzh/fff59Zs2aVeH969erF//73PwAyMzOZMmUKUVFRuLm5cf/999OtW7di7R1Hky0WCzNmzGDnzp2YTCbuuOMOhg4dyrhx42jfvj2DBg0iLy+PO+64g3nz5lG1atUyPyfnT+VmsViIiIiwB+LmzZvbPw/njyqXtY/z9ydSEVSDLCJylbiUNzQdOHCAqVOnMnv2bJo1a8b3338PwJIlS0hJSeHbb79l2rRpZGZmAkWPCX7uued45plneOedd9i5cyeNGjWiUaNGQFEt6YsvvsiHH35IWFgYs2fPth/n/vvvZ/bs2TzyyCN89NFHQFG5xty5c/n444/56quvKCgo4McffyQuLs6+/Msvv8RoNLJs2TIApk6dyrvvvsvcuXOpXr0627ZtK3FeOTk5rF69mqZNm2K1Wnn55Zd54YUXmDNnDn369LEfv6x+LVu2jPj4eL799lvefvtt+wjnmTNnyMzMpF69esWOV69ePU6ePGn/ulGjRnzxxRcMHTqUb775plhbk8lEr169WLNmDQAbNmygT58+Jc7BZrPxyy+/0KRJEwCmT59OWFgY3377rf01iIuLK/O9Xbx4MSkpKXzzzTd89tlnLFy4kBMnTtC3b19Wr14NwPbt22nduvUFw3FZDwA5F5LPjSRfKBz/1b50k55UFI0gi4hICV26dGHatGkUFBSQlJREixYtADh48CC9evXCZDJhMpkIDQ21b3PLLbfQsWNH1q1bx5dffsnHH3/MO++8A0DVqlXttaTdu3dn+vTpAHTs2JGZM2cye/Zs8vPzycjIAGDv3r107NgRPz8/AF544QUKCwtZvnw5ycnJPProo0BRsDrXplu3bkyePJmbb76ZkSNH4u/vb+/bW2+9hYeHBwkJCQwYMIDhw4cTHR1NfHw8L7/8MlAUxs71sax+7du3j969e9vP//xAfD6DwYDj4wbat28PFNUQnwvCjvr27cuECRO4//772bJlC5988kmJczAYDISFhTFx4kQAtmzZYq8tDgwMpGPHjuzatYuOHTuW2qc9e/Zw6623YjQa8fLyYubMmbi5uREaGsq0adNITU0tM5yLXCsUkEVErhJGo/GSjLiZzWbGjRvHRx99RN26dVm4cKF9pgKDwVBqPW1KSgpHjhzhpptuol+/fvTr14/XXnuNxYsX06FDh2JtLRaLPTROmTKFnj17cvvtt3PixAnGjx8PUGIWBHd3d/u/O3ToUOoNbePGjeP48ePs2rWLJ554gnHjxtnLNcaNG0e7du2YOXMmqamp9nPw8/MrtYShrH6V1jeAKlWq4OvrS3R0NPXr17cvj4qKYsiQISXaA5T2nK769evj5eXFsmXLqFevXrFZH86dw/nc3NwwGAz2r61WK2azudRjltZ/x5vgevXqxcqVKzl48CAvvPBCmfuA4u/J+ft3rDk+d4xzNcmljSKXta9LUbst8nfokycicpW40ON7L0Zubi75+fn4+vpiNpvZunWrPcy1bt2aX375BYvFQk5ODtHR0fbt3njjDQ4fPgwUhezTp0/j6+sLQFpamn3mguXLl9uDa1pamv3P+Bs2bCh2nB07dthv6Jo+fToLFy6kTZs2bNmyhdjYWABWr17NoUOHSElJYfTo0QQFBTFixAg6dOhgrzN2NHLkSHbs2MHvv/9OnTp1MBgM/Prrr0BRPfLSpUv/sl/nvj7/qYV33HEH77//Pjk5OdhsNhYsWIDBYLCfa3ndfvvtfPjhh/Tu3btc7Tt27MiPP/4IFP2ism3bthK/lDhq27Ytq1atwmq1kp+fz8MPP8zRo0ftx54zZw4dOnQo11Pszp9h4vxwHBERUazconnz5hcM6Oe7VJ9pkYulT56IyFXCzc3tktz17+vry5gxYxgzZgx+fn40a9bMPoVc3759OXz4MCNGjCAwMBBXV1dcXFwICAjg9ddf59133yU9PR2j0UjHjh254447+P3333F1dWXy5MmcPHmSWrVq2csDHn30Uf773//ywQcf0L59e4xGI4WFhdSvX5/Ro0fz+OOPY7FYaNeuHQMGDMDV1ZX//Oc/jB8/HrPZTGhoKOPHj6dq1aoMGzaMJ554gry8PEJCQrjvvvtKnJuHhwcPP/wwM2bM4KOPPuLNN99k+vTpzJo1C09PT5599tkL9qtfv35ERkby0EMP4ePjU2yEc8yYMXzxxRfce++9WCwWwsPDmTp16kWPgt588818+umndOnSpVzt//3vfzNt2jT7lHqPPfYYdevWJTExsdT2/fv3JzY2llGjRmGz2Rg+fLi9VrxevXr4+/uXO5wHBgYSFRVl/9rX17fUmmPHG/d8fX2LPSDkQtPgXYqp+ET+DoOttL/xiIjIFScnJ4fU1NTLeozMzExiYmJo2bIlOTk5jBkzhsmTJxcrKzhfREQE06ZNK7WUQUpaunQpR44c4emnn3b6sWNiYpg4cSJz5swpV3uLxcKePXtKzIWclZVVopTCZDKVCMfu7u60atWqzJFif39/zYMsFUIjyCIiVwlPT8/Lfgyr1cq8efOYMmUKBoOBO++884LhWC7OuHHjSEpKYtq0aU4/9rx585g/f759dL88TCYTDRs2JDIy0r6srMdHWyyWEuvCwsIuWEbhjM+0SGk0giwichVJS0sjOzu7orsh15jk5OQSj5z+Kw0bNrxgeYWPjw81atT4p10T+Vt0k56IyFXk3E1xIs4UGBhIeHh4uW6qc3d3Jzw8/C8fwa3PslQkjSCLiFxl0tPTSzzOV8QZLBYLKSkpJCcnl3hCnre3N4GBgQQEBPxlkPb19aVatWqXs6siF6SALCJyFUpISLgkM1qI/BPnnpBX1jzHpXFzcyM4OPhydUmkXFRiISJyFfL399dDFqTCubu7X1Q4NhqNxZ6AKFJRdPUUEbkKubq6EhgYqJAsVwyj0WifW1ukoqnEQkTkKmY2m0lNTVW5hVRqbm5u+Pv7KxxLpaGALCJyDdCNe1JZ6YY8qYwUkEVErhFms5msrCzNkyyVgo+PD76+vho1lkpJAVlE5BpjtVrJzc0lLy+PgoICLBYLVqu1orslVzGj0YjJZMLNzQ0PDw88PT1VHy+VmgKyiIiIiIgD/fomIiIiIuJAAVlERERExIECsoiIiIiIAwVkEREREREHCsgiIiIiIg4UkEVEREREHCggi4iIiIg4UEAWEREREXGggCwiIiIi4kABWURERETEgQKyiIiIiIgDBWQREREREQcKyCIiIiIiDhSQRUREREQcKCCLiIiIiDhQQBYRERERcaCALCIiIiLiQAFZRERERMSBArKIiIiIiAMFZBERERERBwrIIiIiIiIOFJBFRERERBwoIIuIiIiIOFBAFhERERFxoIAsIiIiIuJAAVlERERExIHJ2Qe02WzOPqRcJIPBUNFdEJFrhH4mVKyLvd7r/ZLLpbJlD4PNCZ/28w+hb7DK6/wPaGX7wIrIlU8/EyqH8l7v9X7J5VYZs8dlH0E+943k+A1V1r+lYpT1QTQYDNhstkrxQRWRq4N+JlSsi73e6/2Sy6WyZ4/LGpAdv7HK+rdUDuc+iAaDodiHsrJ8UEXkyqefCZVDea/3er/kcqvM2eOyBeTzv5nO/We1WvXNVQk5fkiNRmOl+6CKyJVNPxMqj/Jc78/R+yWXU2XOHpclIJd2IbRarQC4ubkpaFViNpsNs9mMzWbDaPxzkpOK/qCKyJVLPxMqp7Ku9+e3Ofd+HT2Zyfy1sez9PY18c6GTeytXK3dXF9o0qcHw7nVpVMev0mSPy3KTXmm/cULRhVCuDAUFBQD23+gc/xMRuRj6mVC5nX+9d+QYjsd9slfBWC4bd1cX3nqkjT0kV3T2uOzzINtsNiwWCyaT02eUk3/AZDJhsVj0JzQRuaT0M6HyudD1/tz79d2aGIVjuazyzYV8tyam0mSPSx6Qz69dKiwspLCwsMw/30jlZDQa7e+d7lgWkb9LPxMqP8fr/bnRfQCr1Wpfvu/I6QrsoVwr9h05XWmyx2W5Qp3/5zSz2Xw5DiOX2bnaNMf/REQuln4mVH6O13ur1Wq/Ge/c+6XRY3GGfHNhpckeTimxKCzUN9aV6Pzf4ERE/in9TKicyrre6/0SZ6ss2eOyBuTzb8iQK4vjCIKIyD+lnwmVV2nXe71fUhEqS/a4bAG5ok9MLi29nyLyT+gacuXQeyWVRUV+FnWXhIiIiBSjkCzXOgVkEREREREHCsgiIiIiIg4UkEVEREREHFwFjzKycfrESb5dGcvWmLNkWFwIqhNA716NGdzEo8wTzNi5mzHfZnDjmG4816KUVoVpvP/qTlZ41GPK0+FcV+yJqIVsmLWKKacb8vFTDahb7NeM8vbHRuqmnYxekIallP65Nm3B1w/Vxs8AhaeO8tg7UdQZfQsvttLvNCIiF+u1WXvZtD/R/rWXh4la/l4M6laPW24IKXO7lTtOMe2bA7zyYFs6Ng8ss12B2cq8VcdZuzuelIw8/Hzc6NKqJqNvb4ynu4u9XXTCGR6esomXxrShS6ua9uUJaWcZ+9+t1KtVhTcfuQGTi/MfrVtRmodV4+7eDQmv64erycjRuCzmrjjK3iNpxdoN6laPRwY1tX9dYLaSePos6/cm8P2aKPIL/pyObkCXUB4b0qzU4+2KTOXFT3aWWB5YzZMvJ97MovVRfPZDZLF1PdvV4rmRrS54Hp8sPszi9dEATBjThs4O76+jL5b9znerTpS5nzpB3swc15XXZ+1lo8NnFv48r+EvriYzp8C+vGFtX0bf3phGdXzxdDdx4lQWC9ZGsflAUrHty9uvBiG+fPTsTfZ1VquNlIw89h87zZc/HyElI6/sF+IqcYUHZBtp+w/yny8TsDUOZdiQagQa84ncHcXcz7Zz6v4bebK5GyUuM7Z8tu5OI9dqZfueFLKvC8bn/9u78+go6gQP4N/qM00SSDrkHkJCQiAhEHJxyKhAQHSAHVRQ5nmBvll1PNDZVZd11JldfY7rsY6yq6LOUxwYV2G8URACIkQgBwlJSMgJObpzH+To7vRR+0fspjvdIQcJ6Q7fz3t5kKpK9a+7qn/1rV/96lcD1EWmxvN4KyMUr984BfKxKI/UF2s3xiJtkuOaJL6T4X311I9ERGMuyF+Fh9f3haYegxnH8uvx8s7TUCqkDmHV3sHsur5/s+oGDMhmi4itb53EOW0XNqRHISLYB+fru/DpwUqc03bixQcXQLhEfd6tN+HZ7TnwmSTHM5uTrqpwvGhOEJ65Nxl5pc3YtrsIgiAgPS0cLz6Yhie2nURBhfMT/P78UT569CbIZRLMipiCjSuiERfp7zL0Wpe1195pcFmW9NQwCAKwPDkM7315FhbLxRsV88ta8ey7Obbf775pJrwUUmz/4mKQPl/f6bC+xjYdtu0+4/Q61Q1dA3waIxMf5Y+XH16AM1XtePeLEhjNIhbFB+LZe5Px+seF+PZ4zYjL9X8HKlFU1QaJAIRN9cb65VFInT0Vv/3zj+jqmdgP/PHsgKxvxo5/aKCPn4s3N4cj6OfG1cWJAfD7n2N47+vzWBs3EzH9Gl3FtnpkVEqQGD8ZJcUanOgORbqP65eQSkRUZBTj8/kLsSFkkEprJOURFIiKDcLCKSP6BIiIaIhUSikW2oXcpUmh2PT8YfyYV+8yILd0GJBX1oqFc4LwU2EjuvUmeHs5Hza/OlqNwso2/PeWRYiP8gcAXDM3GFFhvnju3RxkFjRgybxgl2UyW0T8519z0dppwF8eXwzfSYM3xUwUcpkEW25PQF5ZC/6wPRvWgTMO5WrxxuOL8dCt8Xjgv446/V1uSbOt9fRofj06e4y4b+0sRIb64py2c8BlB5OeGo6TZ5qwID4QybEByC5pts1r7tCjueNiq+k/XTsdPioZThQ1Drg+ncF8yfmj5ebrI9HRZcTWt7JgMveNWX3klBZyuRSb1sTiuxO1DqOSDKdcZTUdDssWVbXhL48vxvKUMHz54/nRfSNuxqOv1+tKNTjaqUL68jBbGAUASLyxdEEAvDvbUdzef6gaEdrd+0aXAAAOg0lEQVQ8DYplU7H61+GYa2lBRqEBAw1o458YieXe7fj4sxpoBxkrfWTlISKi8SAIgFIuhb7X9ZPiMnI0UMoleHTDHFgsIo7kaV0udzCrDokzA2zh2GphfBCC1SqUnG8fsAzbdhehoKIVz25Owi8CvUf+ZjxQUmwA1JOV+Pj7CtiPKieKIvadqEWgv9eQThiKKtsAACFq1YjLEhsxBdOCvfHJwUqU115A+iW63bgbhVyCbr3RFo6tvjhyDgez6uClGL2od7a6HSaziJCAkX/WnsKDA7KIek0n9LLJmB3u3LLrvzAFnzyfhrXqfvMs3fjh1AUoY4ORHBSEJdFAQXY9mgbIrYJ3IDatDYG8rAzv5OgHDNIjLo8ootdogs5gvvjTawGfW0RENLpE9PVb7TVa0N7Vi537ylHd0I3V10xzufzB7DqkxQViqp8XEmcG4GCWxuVylZpOzJw22Wm6IAA7nl2K+9bOcvl3uzOqsDezBg9vmIPEmQEjfl+eKjq87zMrq+lwmvf1sWrcuvUAOodwGT88sK+PYssF564TSoUUKqXjjyvpqeFo6zSgsLINR/PrsWRu8IDLDpUgwOm1lfLLW6crmacbEBHsg/vXxUGlvHiFo7CyDdu/KIHO4HgCeDnlCvJXQSYV0NLhupvKROLRXSy69SaICjkmDWN/M2u1OKyRYP6yqfAW5Fg4zx9v7dHgSHME1ge66kIhQJ00C5uyj+GNr88iMy4RSwbojjGS8sDciref/x5v20+Th+APLybhWo/eOkRE7qW6vgtrn9jnMG3jimiHbhdWVZpOVGk68ZuV0QCAXyaG4M1PC9HQqkOwXUtlj94Ek9kC9WTlsMryU2EjMrI1UE9WIj3Fc1orR9NkbwV0BtOALfgDUSqkUJmkkMskmBPlj3vXzELJ+XaXQfuj55Y6TVv12LcOv0slApYmh+JYfj1EUcSPefXYtDoWS+aF4EBW3bDKZi8i2Aefv3SDw7TT5a14YtuJEa/TlX0nahE6dRI2LJ+B1ddMQ2ZhIw7naHDiTCNcPe9lOOVSyCVQKaUQBAHTgrzx4C3x6NabkJHj+mRxIvHoCCY43343CBFluVrUyAOwcbYcAgD/+BDM+UcRDuV145aVPq6b1AUVVt4cg4OvlGD73nAkbvB3tdQIygNAOgXrN8Vhsf2VNUGBiNE/ySQiuqqFBkzCU3f1jURgNFmQX96CXfsrEKxW4Vf9WpEPZNdBIZdgQXxfeP7lvGBs212EjByNLTRfjoNZdZg/MwCnK1qx/YtiPLx+zmWv82rRP/RmFzfhlV0FLpd9Znu20016/aXMngo/H4VtxIjapm6c03ZiRVr4ZQXk+hYdXt6Z7zCtW3fpsozUB9+UYm9mDVakhWFpchiWJaegou4C/uOvuahv0Y24XP1H7qht7MbW/z2JNhet9RONRwfkSSoZhF4jeswAhhIoTW04nNcDxYwozJGaoTMAUKqRNl3AezlaVKY739BnJQ2MwO9WaLDluzPYlboIs0ejPAAgyBAW4Y8E3qRHRDSmFHIJ4iL9bL/Pi1FD26LDju/KHAKyKIo4nKPFvJi+bg86gxkKuRTxkX44kFXnEJBVSikkEgHtnUO7EcwqLS4Qf/ptCnbuK8fOfeVImR2IxQkDDyM3EXXrjVApZVAqpA5DtA3GGnonecnw3H0pyC9vRdsAI1OcPd8x6E166anh6NIZUVZzwdat4nhRI25Pn4GpU7wcbs4bDoPRjMKf+0dfCY1tOuzaX4Fd+yswN1qNrXfPx9P3JOGR1zJHXK4P95bidHnfSCKP/2Yu6lt6cLbauaV+IvLggCwgNNQHXqYOlGlFXDfdsfW2I/c0/nWfBRseTMQNfn3zDBUa/NgmQtdSiLueKnRcnUSLw9UxiIkcqBVYgqilc3DLqePYs6cSEr/+84dfHiIiGl/TgrxxMKsOJrMFMmlfC0leWatt1IJ1T+13+pvS6g7ERvS1agiCgOkhPi4v74si8OhrmViUEIQ7VsU4zFu16BeQSgTcuSoGeaUteO3vp/H2k9ciYMrwump4sipN34gTMeGTUVTlGNhWpIXjjlUxeOS1TKfhxOxD774TtbgtfQa+OVaN7kFail1RKWVYPDcISrkUe15c4TR/WUooPs2oGvZ6L4eht+8uJF9v5xsUrTct6o19JxQqpRT3/CoWmQUNtiALAAUVrfg0oxIP3BwHf1/lgCcQg6lp6LaF6Y++LcPWu+cjYYb/FQ3+48WDb9IDvGJDcY1PDw4crkerfT8bUYejJxugkXhjxmRrGDUjL6cRraog/PPvFuHVR+1+HohFkrwHR3LbcMnbAeRTcPst0xBUfx6flzjfRje88hAR0Xg7W93x841HFw+HB7LqoFLK8MojCx2OFS89tAAKuQQHsh0vuy9PCUNeWQvKay84TD9V2ozSmg5EhfkO+PoSiYB/uysRFgvw8s58l31GJ6rs4mZc6DZi/fIoh+mCANy0eBr0BvOgY+3u2lcOpVyKDekzRlSGa+eHQCmX4tW/F+Bf3jju8DNeo1k0tevR3tXrNO62IAhYlBCEc9pOW4u7vteMZSlh2LDc+f37+yohiiKMptG57f+HU1pUaTuxeY3rm04nGg9uQQbgFYh7bg5F3t8K8OQHXbg1eQr8LHqcPXUen5cpsPLe6Yi21nn6Jhwq6oU6cTrWxPrD8RzdF2sTzuGFfA3y16iRqnB+KStV9Ezcn9aI547rnM8uhlMeK9GIc+VNyO73oBBB5YOESJVdOUW01TYjW+EYsAUfXyROG/iJgURE1EfXa0Z2cRMAwGC0IOtME34qaHB4Opuh14xjpxuwLCUUc6PVTutYMjcYh3O1uH9dHKSSvvr45usjcSSvHk+/nYWNK6MRolbhfEMX9hyqQursqVic4HoMZKsgtQpbbpuDFz7Mw6cZlbhthGHP0xiMZry5uwj/fvd8PLM5CYdytVDKJbg+KRTxkX5DupmtuUOPbzKrse66SHz+wzm0dzl2p0iMDXDqg9ytM6L4XN/Qe+mpYaht7Mb+E7VO6/4msxpbbkvAjHBfVNZ1Os0fjEohRWpcoNP0+pYe1DZ2D/h3oihix95SPHpbAp7ZnISjpxsgkQhYmRaOmPDJ+OP7uXbLAu98Vown70zE8/en4odTWvToTZg93Q+3LI1CRrYGXTrHk4yRlwv4cG8Z/nhfMhbEB+LkmaahfAwey8NzlYCpSXPxqpcPPthfi/f/VgGdRIGwiEDc9UAsfj3z4lPrLhRpkKWbhJsWqOF8AUuG1IUhUJ+qx6HS2UhNuMTHIsiRtnoWrjuTD+fhy4deHhvzBXz5UTa+7F+i6bPwzpYZ+IUtUFtQ8H0O+t+GYP9IaiIiGlhjqw5Pv5MNoG/847DASXjs9gTcuOhi/+PMggboDCbctMj10G83Lp6GQ7laZBU32Vr45DIJXnpoAXbsLcUnByvRpTMiJGAS1l0XifXLoy75FD2r65JCkV3SjA/3lmL+zABbF46J7sjPge6OG6Lx1J2J6DGYUF7Tgcde/2nIfV0//r4CNy2eho0ro/H2Z8UO856+Z77T8mU1HXj41UxMneKFxBg13v/qrMv1HsrpOxFakRaO7XUlLpe5lCC1Ci/cn+o0fc+hKocn8LnyTWYNunQmrF8Whd9vnAuzRUTxuTb8/o3jtnBvlZGjQXOHHhuWz8AD6+Igk0mgbenB+1+VuHyYx+WU66eCBpyt7sCm1bHIKm6a0Fc8BFEc3bcniiJEUYTFYoHFYoHRaERXVxeCgy99Bk3up6GhAT4+PpDL5ZBIJJBIJBAEAcJQansiIvCY4Cms9b1MJrPV8aIowmQyoaurC3e/mDvIGohGx46tyW6RPTy6DzIRERER0WhjQCYiIiIissOATERERERkhwGZiIiIiMgOAzIRERERkR0GZCIiInLA0YroajdmAZlfromF25OILgfrEM/BbUXuYjz3xTFtQbaOW8cvm2fi9iOi0cQ6xX252jb205Ry6TiWjq4WSrnUbeqJK9LFQhAEmEymwRckt2EymcZ95ySiiYnHBPcyWH0vCALmxfhdwRLR1WpejJ/bZI8xCcj26V8QBEilUjQ3N4/FS9EYaW5uhlQqddqWRETDxWOCe+tf3/d/eplUKsWq5ClsRaYxpZT37Wfukj1GPSD3vzwjlUohlUphMBhQWVkJg8Ew2i9Jo8h+O1m3Xf9tSkQ0VDwmuC9X9b1EcjEWSCQS2/SIIC88tCYQybF+DMo0qpRyKZJj/fDQmkBEBHm5TfYQRFEUR3uloijafiwWC4xGI7q7u9Ha2orW1lZ0dnait7fXtgyNL+sZmkKhgK+vL9RqNdRqNby9vW3PQh/vMzki8lw8JriPodT39ri9aKy4e/aQjdWKrW9GIpFAJpNBpVLBz88PMpkMvr6+MBqN/GK5EUEQIJfLoVKp4OPjA5VKBZlM5rCDEhGNFI8J7mOw+t4etxeNJXfOHmPSggzA9sWxnmGazWaYzWb09vbCZDLBYrHwy+VGrP3OZDIZFAqFwyUO6w7KkExEI8VjgvsYSn1vxe1FY8mds8eYBWTAuUK0v8RmP5/Gn33rjqvO8QzHRHS5eExwD0Ot77m9aKy5c/YY04AMOH7B+k/r/38aHwN1hHeHHZSIJhYeE8bXcOt7bi8aK+6ePcY8IAPOXyB+odxX/x1yvHdQIpp4eExwD0Ot77m9aKy5Y/a4IgHZHr9Y7s8ddkwiujrwmDC+hlvfc3vRWHG37HHFAzIRERERkTu7Io+aJiIiIiLyFAzIRERERER2GJCJiIiIiOwwIBMRERER2WFAJiIiIiKyw4BMRERERGSHAZmIiIiIyA4DMhERERGRHQZkIiIiIiI7DMhERERERHYYkImIiIiI7DAgExERERHZYUAmIiIiIrLDgExEREREZIcBmYiIiIjIDgMyEREREZEdBmQiIiIiIjsMyEREREREdhiQiYiIiIjs/D9laDEzep4EnwAAAABJRU5ErkJggg==) After clicking the **Create User** button, the user will be created and a key pair will be generated. Copy the generated key pair for a later use. The copied text will look like this: access-key= MYACCESSKEYRO secret-key= MYSECRETKEYRO ## Setup admin access and policy In this section we will create a admin user, who will be able to manage the files in the **my-cloud-files** bucket and updating the app in the **my-tagspaces** bucket. You can also create separate users for managing the both buckets. ### Create admin policy We have to create an admin policy with rights to administrate these two bucket. To do this you to go to the **Policy** section and create a new policy called **TagSpacesAdminPolicy** with the following content. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:GetObjectAcl", "s3:GetObjectVersionAcl", "s3:DeleteObject", "s3:GetBucketWebsite", "s3:GetBucketNotification", "s3:GetReplicationConfiguration", "s3:ListMultipartUploadParts", "s3:PutObject", "s3:GetObject", "s3:RestoreObject", "s3:ListBucket", "s3:GetBucketPolicy", "s3:GetObjectVersionTorrent", "s3:AbortMultipartUpload", "s3:GetBucketRequestPayment", "s3:PutObjectAcl", "s3:ListBucketMultipartUploads", "s3:GetBucketVersioning", "s3:GetBucketAcl", "s3:GetObjectTorrent", "s3:GetBucketCORS", "s3:GetBucketLocation", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::my-tagspaces", "arn:aws:s3:::my-tagspaces/*", "arn:aws:s3:::my-cloud-files", "arn:aws:s3:::my-cloud-files/*" ] } ] } ``` Do not forget to adjust the name of the buckets in the **Resource** section to reflect the name of the buckets you want to manage with the policy. Depending on your needs you can reduce the granted actions in the policy above. ### Create admin user Go to the user's section and creata a new user, by clicking on the **Create User** button. You can the user **my-ts-admin**. Choose the **TagSpacesAdminPolicy** policy in the creation wizard for this user, as shown in the following screenshot. ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAJyCAYAAADZ+jZlAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAApdEVYdENyZWF0aW9uIFRpbWUATW8gMDkgSmFuIDIwMjMgMTk6MTA6MjggQ0VU6VLa6AAAIABJREFUeJzs3XdUVNfexvHvOFQpUqQJooi9YMcWa6yJxpIejSnGdNPbTTXVJKabYrppJjGxxhI19t67WAARQcBC723eP4jzDhEVlGFAn89ad12ZOWfvfZhf5jyc2WePwWQymRAREREREQBq2XoAIiIiIiLViQKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCwoIIuIiIiIWFBAFhERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCzY2XoAIiK5eXmsWreJrTv3EhMbR1pGJvb2dnh7etC6RVN6detM8yahth5mjXHXhGext7fjqw/eLNf2Dz87kdzcPL75eJKVRyYiNd2Ro8cACGlQv1zbZ2VnszfiEF06trPmsCqdArKI2NTKdZuY9utM0tIzcHCwp2loCC2bN6GwsJDEE6f4e9lqFv2zio7tWvPovXfi5upi6yGXy9Tvp7N4xRq+/OANfOt623o4IiKX7MjRY7w06UMAXv/f4xcMyVnZ2bz01occiY1jwvix9OvZrSqGWSkUkEXEZn6aMYdZ8xfjUced+++8lX49u2Fvb19qm5TUNGbOX8zCpSv57NufeO7R+200WhERMZlMZOfk8tKkD88bki3DcU2kOcgiYhNLV65l1vzFNAwO4v3XnmdQv15nhWMAT4863DPmJl588iEevHuMDUYqIiJQMq3ijeefoLazE1nZObw06UPz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zSN5ZPxYPvv2Z155+2MaN2rAraOGsWTlWgoKC7G3O3dpeHt68MITD/Ljb7OYvWAJddzdGHnNALqHn70cnNQMV3XphJOjI3/MXcSffy3C3s6OpqEhvP6/xwiq53/O/R4edzvf/DyDl9/+CKOxFt06d+Du0TeYn7/husHEJyTyytsf41vXi27hHTgSG1eqjWZNQpn86dcknTxN21bNufPWkv1VZ1eGhsFBPDNhPD/NmMMPv88mqJ4/Lzz+AKH/LtV2Ps2bNOLBu0fz+5wFTJ32K40a1mfis4/g6uJy1raNQxrw9MPjmT5zHjPmLMTfty7jb78Zb08PAP736P189eNvPPXyJOzt7encvg1jbhpR6ccrVcdoNHLHzaN4//NvGdS3Jz51vXj5qQl88/MMnnp5Ei4utRnQpwddO7Yz7xPePgwHB3u6lbG86RlOTo4XbKdd6+YkJJ4wfxLXsH4gPt5etG3V3HoHLJXKYDKZyp5gKCJiRWfWQX7n5Wdo2lgfOYqISPWh6/wiIiIiIhYUkEVERERELGiKhYiIiIiIBV1BFhERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCwoIIuIiIiIWFBAFhERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCggi4iIiIhYUEAWEREREbGggCwiIiIiYkEBWURERETEggKyiIiIiIgFBWQREREREQsKyCIiIiIiFhSQRUREREQsKCCLiIiIiFhQQBYRERERsaCALCIiIiJiQQFZRERERMSCArKIiIiIiAUFZBERERERCwrIIiIiIiIWFJBFRERERCwoIIuIiIiIWFBAFhERERGxoIAsIiIiImJBAVlERERExIICsoiIiIiIBQVkERERERELCsgiIiIiIhYUkEVERERELCgg1wBzFi7l1vGP8c1PM8yPvTvlK0aOfYDHX3zThiMTERERufzYVVVH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XLiQ2NhYateuzeTJk3F3d2fmzJn2Ud6ePXsycuRItm3bRl5eHi+++CJNmzYtsX+rV69Ohw4dOHz4MB06dGD58uXMmTMHgAYNGvDUU09RpUqVYss4biclJYXJkyeTkJCAm5sbjz32GD4+Pjz11FP8+OOPGI1GPvvsM3Jzc/n3v/993vf67Fu5mc1mIiIi7IG4WbNm9vf07FHlc63j7PWJXGlUgywicpW4lBdD7d+/n2nTpjF79myaNm3K999/D8CiRYtITk7mm2++Yfr06WRmZgJFjxh+5plnePrpp3nrrbfYsWMHDRs2pGHDhkBRHerzzz/PBx98QGhoKLNnz7Zv595772X27Nk89NBD9hHWI0eOMHfuXD766CO++uorCgsL+fnnn4mNjbVPnzNnDkajkcWLFwMwbdo0Zs6cydy5c6levTpbt261v54lS5bQt29f+vbta28PsHjxYuLi4vjmm2948803S4x29uzZky+//JKbb76ZKVOmMGnSJHtoX7duXan7rmHDhnz++ecMHz6cr7/+utQ2KSkp7Ny5k8aNGxMVFcWHH35o73tgYCDvv//+ed+ft99+m3bt2jFv3jxefPFFXn75ZcLCwqhRowZ79+4FYP369fTr1++86znXA0DOhOQzI8nnC8cXWpcu0pMrkUaQRUSkhG7dujF9+nQKCwtJTEykRYsWABw4cIA+ffrg7OyMs7MzISEh9mVuuukmOnfuzNq1a5kzZw4fffQRb731FgBVq1a1lzX06NGDGTNmANC5c2dmzZrF7NmzKSgoICMjA4A9e/bQuXNnfH19gaL6YYvFwtKlS0lKSuKRRx4BikLZmTbdu3dnypQp3Hjjjdx11134+fkBsG/fPjw9PQkNDQUgMzOT48ePU79+ffbu3Uvfvn3tr6devXrF9kN4eDgAYWFhhIaG2rcVEhJCenp6qfuuY8eO9jarV6+2Tz98+DB33nknAG5ubowcOZL27dszf/58OnfubO/v8OHDue+++877/uzevZunn34agNDQUL788kugqO579erVBAYGYrPZaNSo0XnXIyKlU0AWEblKGI3GSzJaZzKZGD9+PB9++CF169Zl4cKF9rscGAwGjMaSf3xMTk7m8OHDXH/99QwcOJCBAwfy6quv8uOPP9KpU6dibc1mM2eeUTV16lR69erFzTffzPHjx+0X0J19BwU3Nzf7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C4NarYYoihBFEYIgQBhKbU9EBB4TgoWrvlepVO46XpZl2Gw2dHd345HXTg+yBKLRsXtHdkBkj6Dug0xERERENNoYkImIiIiIFBiQiYiIiIgUGJCJiIiIiBQYkImIiIiIFBiQiYiIyANHK6I7nd8CMneu8YXrk4huBeuQ4MF1RYFiLLdFv7Ygu8at484WnLj+iGg0sU4JXL7WjXKaVi2NYenoTqFVSwFTT9yWLhaCIMBmsw0+IwUMm8025hsnEY1PPCYElsHqe0EQMC814jaWiO5U81IjAiZ7+CUgK9O/IAiQJAktLS3++Cjyk5aWFkiS5LUuiYiGi8eEwNa/vu//9DJJkrAmexJbkcmvtGrndhYo2WPUA3L/yzOSJEGSJFgsFlRXV8NisYz2R9IoUq4n17rrv06JiIaKx4TA5au+F8UbsUAURff0pJgQPLkuGtlpEQzKNKq0agnZaRF4cl00kmJCAiZ7CLIsy6O9UFmW3S+HwwGr1QqTyYS2tja0tbWhq6sLfX197nlobLnO0DQaDcLDw6HX66HX6xEaGup+FvpYn8kRUfDiMSFwDKW+V+L6In8J9Oyh8teCXV9GFEWoVCrodDpERERApVIhPDwcVquVO1YAEQQBarUaOp0OYWFh0Ol0UKlUHhsoEdFI8ZgQOAar75W4vsifAjl7+KUFGYB7x3GdYdrtdtjtdvT19cFms8HhcHDnCiCufmcqlQoajcbjEodrA2VIJqKR4jEhcAylvnfh+iJ/CuTs4beADHhXiMpLbMr3aewpW3d8dY5nOCaiW8VjQmAYan3P9UX+FsjZw68BGfDcwfpP6/9vGhsDdYQPhA2UiMYXHhPG1nDre64v8pdAzx5+D8iA9w7EHSpw9d8gx3oDJaLxh8eEwDDU+p7ri/wtELPHbQnIStyxAl8gbJhEdGfgMWFsDbe+5/oifwm07HHbAzIRERERUSC7LY+aJiIiIiIKFgzIREREREQKDMhERERERAoMyERERERECgzIREREREQKDMhERERERAoMyERERERECgzIREREREQKDMhERERERAoMyERERERECgzIREREREQKDMhERERERAoMyERERERECgzIREREREQKDMhERERERAoMyERERERECgzIREREREQKDMhERERERAoMyERERERECv8PKLniB2Zw15EAAAAASUVORK5CYII=) After clicking the Create User button, the user will be created and a key pair will be generated. Copy the generated key pair in save place for a later use. The copied text will look like this: access-key= MYACCESSKEYRW secret-key= MYSECRETKEYRW :::caution Please do not share the access key for this user, since it has a full access to the both buckets. ::: ## Preparing extconfig.js Create a file called **extconfig.js**, copy the content from bellow in it and upload it to the root of the **my-tagspaces** bucket. ``` window.ExtLocations = [ { "uuid": "f15de534-4326-40c3-9f6a-3547azb97518", "type": "1", "name": "My Cloud Files", "path": "", "paths": [ "" ], "endpointURL": "https://s3.us-west-2.wasabisys.com", "accessKeyId": "MYACCESSKEYRO", "secretAccessKey": "MYSECRETKEYRO", "bucketName": "my-cloud-files", "region": "", "isDefault": true, "isReadOnly": true, "disableIndexing": true, "fullTextIndex": false, "watchForChanges": false, "maxIndexAge": 600000, "creationDate": "2023-01-12T17:35:21.451Z", } ] ``` :::caution Please make sure that you put here the **readonly** key with the very limited security policy, since this file will be publicly available. Be aware that, by having the readonly keys publicly, anybody can easily download all the files from the my-cloud-bucket. ::: ## Workflow for syncing files using Rclone All photos can be collected in one folder on a local computer and synced via scripts on a regular basic to the **my-cloud-photos** bucket. - Download and install Rclone from: https://downloads.rclone.org/ - Unzip the file and place rclone(.exe) in a folder from which you want make the sync - Create a new text file called `rclone.config` with the following content: ``` [mycloudfiles] type = s3 provider = Wasabi access_key_id = MYACCESSKEYRW secret_access_key = MYSECRETKEYRW endpoint = s3.us-west-2.wasabisys.com acl = private ``` - Create a new text file called `syncmyfiles.cmd` with the following content: rclone sync "MyCloudFiles" "mycloudfiles:my-cloud-files" -v --config=rclone.config - In the previous command the **MyCloudFiles** is the name of the folder which content will be synced to the bucket. Other examples could be **D:\Photos\MyCloudFiles** or **../MyCloudFiles**. - Run the syncmyfiles.cmd on a regular basis in order to sync your local photos with the cloud ``` ├── MyCloudFiles ├── rclone(.exe) └── rclone.config ``` ## Integration in web page URL of the TagSpaces Web installation on Wasabi: https://my-tagspaces.s3.us-west-2.wasabisys.com/index.html You can integrate it on any HTML web page using similar iframe code: ``` ``` --- Created in TagSpaces on 2023-01-12. --- ## Using TagSpaces with other users or on many devices One of the most common questions we receive about **TagSpaces** is whether it supports file synchronization between devices. Users often ask: > “I’ve just tagged hundreds of files on my laptop — how do I see the same tags on my tablet or desktop?” Our philosophy is that **TagSpaces doesn’t need its own sync feature**. Why? Because all metadata — including tags, colors, and descriptions — are stored **directly in the file names** or in accompanying **sidecar files** (located in the `.ts` folders). That means your tagging information _travels with your files_. If you synchronize or share your files using existing tools, the tags go with them automatically. This design avoids vendor lock-in and ensures your tags remain portable, transparent, and under your control — even outside TagSpaces. Most other tagging apps use an internal **database** for storing tags, which makes migration difficult and locks your metadata behind a proprietary format. In contrast, TagSpaces lets you retain ownership of your tagging data — forever. ## Using shared network folders The simplest way to collaborate or use TagSpaces across multiple devices is to work from a **shared network folder** — for example, a file share on your LAN or NAS. You just have to connect the shared network folder or drive as location in TagSpaces. ```mermaid flowchart subgraph LAN[A local network - LAN] direction TB subgraph PC1[Windows PC] direction RL TSLoc1["TagSpaces Location: Photos"] TSLoc2["TagSpaces Location: Projects"] end subgraph NAS[NAS e.g. Synology, QNAP] direction BT SF1["Shared Folder: Photos"] SF2["Shared Folder: Projects"] end subgraph MAC1[Mac Laptop] direction RL TSLoc3["TagSpaces Location: Photos"] end TSLoc1 <-->|connected| SF1 TSLoc2 <-->|connected| SF2 TSLoc3 <-->|connected| SF1 end style LAN fill:#e8e8e87d ```
Using TagSpaces with shared network folders
On Windows, you can mount a shared network folder as a drive with a specific letter using a command like this: `mount \\ServerIP\ShareName Y:` :::tip This is the recommended method for connecting a network location in TagSpaces, as it provides a stable and consistent path. Alternatively, you can also use the direct UNC path (\\ServerIP\ShareName), which should work as well. ::: ✅ **Advantages** - Easy to set up within a home or office network - Multiple users can view and edit tagged files simultaneously - All metadata (file names and sidecar files) remain consistent ⚠️ **Drawbacks** - Usually not exposed to the internet without a VPN - Not accessible from **TagSpaces Web** or mobile apps, since they work with **object storage** only This setup works great for small local teams or households sharing a single network drive. ## Using cloud sync services For most users, the easiest cross-device setup is to use a standard **cloud sync service** such as: - [Dropbox](https://dropbox.com) - [Google Drive](https://drive.google.com) - [Microsoft OneDrive](https://onedrive.live.com) - [Nextcloud](https://nextcloud.com) These tools automatically synchronize files — and thus your TagSpaces tags — across all your devices (Windows, macOS, Linux). You can even access the same files through **TagSpaces Web** if the service exposes S3-compatible access or if you use local sync clients. ```mermaid flowchart subgraph Internet[Internet] direction TB subgraph PC1[Windows PC] direction RL TSLoc1["TagSpaces Location: Photos"] TSSync1["Synced Local Folder: Photos"] SyncSW1("Sync Software e.g. Dropbox Client") TSLoc1 <-->|connected| TSSync1 TSSync1 <-->|connected| SyncSW1 end subgraph CloudService[☁️ Cloud Storage Service e.g. Dropbox] direction BT SF1["Cloud Folder: Photos"] end subgraph MAC1[Mac Laptop] direction RL TSLoc3["TagSpaces Location: Photos"] TSSync3["Synced Local Folder: Photos"] SyncSW3("Sync Software e.g. Dropbox Client") TSLoc3 <-->|connected| TSSync3 TSSync3 <-->|connected| SyncSW3 end SyncSW3 <-->|sync| SF1 SyncSW1 <-->|sync| SF1 end style Internet fill:#e8e8e87d ```
Using TagSpaces with shared network folders
✅ **Advantages** - Simple setup with desktop apps - Real-time synchronization - Reliable and well-supported ⚠️ **Drawbacks** - Your data is stored on third-party cloud servers - Limited control over privacy depending on provider If you value convenience and cross-device consistency, this is the most seamless option. ## Using p2p sync services If you prefer to stay cloud-free but still want automatic synchronization, try **peer-to-peer sync tools** such as: - [Syncthing](https://syncthing.net/) – Open-source, private, and cross-platform. A great step-by-step guide for setting up TagSpaces with Syncthing can be found in this [Medium article](https://attilaorosz.medium.com/syncronise-your-offline-notes-across-all-devices-without-the-cloud-1e82fa53d1f1). - [Resilio Sync (formerly BitTorrent Sync)](https://www.resilio.com/) – A proprietary but efficient peer-to-peer alternative. ```mermaid flowchart subgraph Internet[Internet / LAN] direction TB subgraph PC1[Windows PC] direction RL TSLoc1[TagSpaces Location: Photos] TSSync1[Synced Local Folder: Photos] P2PC1(Peer to peer sync software) TSLoc1 <-->|connected| TSSync1 TSSync1 <-->|sync| P2PC1 end subgraph MAC1[Mac Laptop] direction RL P2PC3(Peer to peer sync software) TSLoc3[TagSpaces Location: Photos] TSSync3[Synced Local Folder: Photos] TSLoc3 <-->|connected| TSSync3 TSSync3 <-->|sync| P2PC3 end P2PC1 <-->|p2p sync| P2PC3 end style Internet fill:#e8e8e87d ```
Using TagSpaces with peer to peer synced folders
✅ **Advantages** - Your files never leave your trusted devices - End-to-end encrypted and decentralized - Works great for local networks and private sharing setups ⚠️ **Drawbacks** - Slightly more complex setup than cloud sync - Not always ideal for users without always-on devices This approach combines **privacy** with **convenient sync**, ideal for power users and privacy advocates. ## Using object storage on the internet If you prefer a modern cloud architecture or want to use TagSpaces Web on mobile devices, consider using **S3-compatible object storage**. TagSpaces Pro supports connecting such storage as locations. Common services include: [Amazon S3](https://aws.amazon.com/s3/), [Contabo Object Storage](https://contabo.com/) or [Cloudflare R2](https://www.cloudflare.com/r2/). Each of these can be connected directly to TagSpaces through its “Object Storage” location type. See our dedicated tutorials for setup details: - [Using Cloudflare R2 with TagSpaces](/tutorials/cloudflare-r2-storage) - [Using AWS S3 with TagSpaces](/tutorials/s3-bucket-locations/) - [Using Contabo Object Storage with TagSpaces](/tutorials/contabo-storage) - [Using Wasabi with TagSpaces](/tutorials/wasabi-locations) ```mermaid flowchart subgraph Internet[Internet] direction TB subgraph PC1[Windows PC] direction RL TSLoc1["Photos - S3 location in TagSpaces"] TSLoc2["Projects - S3 location in TagSpaces"] end subgraph MD1["Browser on iOS / Android / Mac"] direction RL TSLoc4["Projects - S3 location in TagSpaces **Web**"] end subgraph S3Service1[AWS S3] direction BT SF1["Object Storage Bucket: Photos"] end subgraph S3Service2[Contabo] direction BT SF4["Object Storage Bucket: Projects"] end subgraph MAC1[Mac Laptop] direction RL TSLoc3["Photos - S3 location in TagSpaces"] end TSLoc1 <-->|connected| SF1 TSLoc2 <-->|connected| SF4 TSLoc4 <-->|connected| SF4 TSLoc3 <-->|connected| SF1 end style Internet fill:#e8e8e87d ```
Using TagSpaces with S3 services
✅ **Advantages** - Accessible globally and ideal for remote collaboration - Compatible with **TagSpaces Web** and **mobile** - Scalable and backed by reliable infrastructure ⚠️ **Drawbacks** - Typically involves some setup and credential management - May incur cloud storage costs ## Using object storage on your NAS If you prefer self-hosting or need a private cloud, you can run your own **S3-compatible storage** locally on a NAS or server. Popular self-hosted object storage options include: - [MinIO](https://min.io/) – Lightweight and easy to deploy - [S3Proxy](https://github.com/gaul/s3proxy) – Converts local filesystems into an S3 API - [Garage](https://garagehq.deuxfleurs.fr/) – Distributed, open-source storage These can all be connected as S3 locations in TagSpaces, just like cloud providers — but under your full control. See our dedicated tutorials for setup details: - [Exposing local folders as object storage with S3Proxy](/tutorials/folders-as-objectstorage-with-s3proxy) - [Using Garage with TagSpaces](/tutorials/garage-storage) - [How to use MinIO buckets hosted on NAS Server](/tutorials/setup-minio-bucket-nas/) ```mermaid flowchart subgraph Intranet[Your local network] direction TB subgraph PC1[Windows PC] direction RL TSLoc1["Photos - S3 location in TagSpaces"] end subgraph MD1["Browser on iOS / Android"] direction RL TSLoc3["Projects - S3 location in TagSpaces **Web**"] end subgraph NAS1[NAS] direction BT subgraph S3Service1["S3 service: s3Proxy, Garage"] SF1["Object Storage Bucket: Photos"] end end TSLoc1 <-->|connected| SF1 TSLoc3 <-->|connected| SF1 end style Intranet fill:#e8e8e87d style NAS1 fill:#b4b4b47d ```
Using TagSpaces with local S3 services running on NAS/Docker
✅ **Advantages** - 100% self-hosted and private - Ideal for home servers or offices with NAS devices - Full control over performance, backups, and security ⚠️ **Drawbacks** - Requires some technical setup - Remote access might need VPN or port forwarding ## Using locally synced object storage If you want both **cloud storage** and **local file access**, tools like [Mountain Duck](https://mountainduck.io/) can sync S3-compatible storage as a **local folder**. This means TagSpaces interacts with files locally, while Mountain Duck keeps them in sync with your cloud storage in the background. ```mermaid flowchart subgraph Internet[Internet] direction TB subgraph PC1[Windows PC] direction RL TSLoc1["TagSpaces Location: Photos"] TSSync1["Synced Local Folder: Photos"] MND1(Mountain Duck Sync Software) TSLoc1 <-->|connected| TSSync1 TSSync1 <-->|connected| MND1 end subgraph CloudService[S3 Object Storage: AWS S3, Wasabi] direction BT SF1["Object Storage Bucket: Photos"] end subgraph MAC1[Mac Laptop] direction RL TSLoc3["TagSpaces Location: Photos"] TSSync3["Synced Local Folder: Photos"] MND3(Mountain Duck Sync Software) TSLoc3 <-->|connected| TSSync3 TSSync3 <-->|connected| MND3 end MND3 <-->|sync| SF1 MND1 <-->|sync| SF1 end style Internet fill:#e8e8e87d ``` ✅ **Advantages** - Full offline access and quick local performance - Seamless integration with cloud backups - Works with any S3-compatible service ⚠️ **Drawbacks** - Requires a paid license for Mountain Duck (or similar tools) - Slightly higher resource usage when syncing large datasets This setup is perfect for users who want reliable backups, cloud redundancy, and fast local editing. ## Using encryption with Cryptomator For **end-to-end encryption**, you can layer [Cryptomator](https://cryptomator.org/) on top of your chosen sync or storage setup. Cryptomator creates an encrypted vault that can be opened locally, synced via cloud or peer-to-peer, and used directly with TagSpaces. Check our detailed setup guide: 👉 [End-to-End Encryption with TagSpaces and Cryptomator](/tutorials/e2ee-with-tagspaces-and-cryptomator) ✅ **Advantages** - Protects your data and tags with strong encryption - Compatible with most cloud and object storage services ⚠️ **Drawbacks** - Slightly slower file access due to encryption overhead ## Backing up your data Whether you use local or cloud storage, regular **backups** are essential. Open-source tools like [Plakar](https://plakar.io/) or [Restic](https://restic.net/) can automate backups to a variety of destinations: - Cloud services (Dropbox, S3, R2, etc.) - Network folders - Local drives :::tip Always back up both your files _and_ the sidecar files (located in the `.ts` folders) — they contain TagSpaces-specific metadata. ::: ## Conclusion TagSpaces gives you the freedom to organize and tag files **your way**, across all your devices and platforms. Because your tags are stored with your files — not locked inside a database — you can freely choose your preferred sync, sharing, and storage strategy. Whether you use Dropbox, Syncthing, your NAS, or a self-hosted S3 service, TagSpaces adapts to your workflow — empowering you to collaborate privately, flexibly, and without losing control of your data. **TagSpaces: organize everywhere, own your data.** --- ## How to use Wasabi buckets as locations TagSpaces offers a way to connect S3 compatible object storage. Recently we figured out that this functionality works pretty well with the Wasabi cloud storage service and so I decided to write the following tutorial showing the steps needed to use TagSpaces with this service. [Wasabi](https://wasabi.com/cloud-storage-pricing/#three-info) is a affordable and reliable alternative to object storage offered by Amazon's AWS. By the time of writing the price is 5.99 $ per TB storage per month and they are not charging for download traffic(egress) or API calls. Which makes their offer in my opinion very attractive. In order to follow this tutorial you will need a Wasabi account. Luckily they offer a 30 days [trial period](https://wasabi.com/sign-up/), so you can test the service for free. ## Creating a bucket After creating the account and successful login, you need to create your first bucket. The buckets are places where you can store later your files. The creation is pretty easy, go to the bucket section and click on the "CREATE BUCKET" button. In the next screenshot you will see the bucket creation dialog, where you can define the bucket name (please don't use space there) and the region, which the physical location of the data center storing your files. I was pleased to see that since March 2022 there is the eu-central-2 region which located in Germany and GDPR compliant. ![Create a bucket in wasabi](wasabi-locations/create-bucket.png) After clicking the "NEXT" button you will see the a page where you can enable some optional feature such logging or object locking. ![Set options for the wasabi bucket](wasabi-locations/create-bucket-properties.png) When finish the bucket creation wizard the newly created bucket will appear in the bucket section. ## Create an access policy Policies are needed to grand certain users or user groups access to the specific buckets. In order to create a policy you have to open the policy section and click on the "CREATE POLICY" button, visible in the next screenshot. ![Listing the existing policies](wasabi-locations/policy-list.png) In the policy generation form which will appear you can give the policy a suitable name and description. Bellow you will find two policy templates in JSON format for read-only and for read-write access to the bucket. You can copy and paste them in the "Policy document" section visible in the following screenshot. You should adjust the bucket's name in the Resource section (highlighted) and optionally add or remove some actions. ![Creating a new policy](wasabi-locations/create-policy.png) :::tip From a security perspective it makes sense to have a separate policy for every bucket you want to make accessible in TagSpaces or other external tools. ::: ### Read-write policy for a bucket The following policy gives you a full access on the bucket. :::note In the policy bellow you have to replace `` with the name of your bucket. ::: ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucket", "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::" }, { "Sid": "AllowReadWriteObjects", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:GetObjectAcl", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::/*" } ] } ``` :::caution The list of allowed actions in the previous JSON file is only a suggestion. The actions can be reduced, to just those which are really needed for your use case. ::: ### Read-only policy for a bucket Depending on your use-case you may want to access the bucket in a read-only mode, with the following policy you can achieve this. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucket", "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::" }, { "Sid": "AllowReadObjects", "Effect": "Allow", "Action": ["s3:GetObject", "s3:GetObjectAcl"], "Resource": "arn:aws:s3:::/*" } ] } ``` :::note In the policy above you have to replace `` with the name of your bucket. ::: ### Policy with read-only access for a folder Sometimes you want to share just a folder or sub-folder and not the whole bucket with someone. For this use case you can use the following policy: ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListObjectsInFolder", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::", "Condition": { "StringLike": { "s3:prefix": ["", "/*"] } } }, { "Sid": "AllowReadObjectsInFolder", "Effect": "Allow", "Action": ["s3:GetObject", "s3:GetObjectVersion", "s3:GetObjectAcl"], "Resource": "arn:aws:s3::://*" } ] } ``` :::note In the policy above you have to replace `` with the name of your bucket and `` with the path of your folder or sub-folder. ::: ## Create a user So now you may want to create some users which are going to have access to the bucket created previously. In order to do this, you have to open the user's section in Wasabi console and click on the "CREATE USER" button shown in the next screenshot. ![Creating a new user](wasabi-locations/create-user.png) In the dialog which wll appear, you have to enter the user's name, click on the "Programmatic (create API key)" checkbox and press "NEXT". In the following section you can add the user to a group, which goes beyond the scope of this tutorial. So clicking one more time on the "NEXT" button will give you the ability to select the policy we have create in the previous section. This is very important step, since without a policy the user will have no rights on the bucket. ![Select policy](wasabi-locations/select-policy.png) In the next section the API access key and the secret key will be automatically generated. ![Copy the user's credential](wasabi-locations/copy-user-credentials.png) You can press the copy button in order to save the keys in for example the password manager of your choice. ## Connect the bucket as location in TagSpaces So now we are ready to connect the Wasabi bucket in TagSpaces. You should choose the **New location** menu item from the menu which will be opened after clicking the **New**-Button, visible on the next screenshot. ![Connect the bucket in TagSpaces Pro](wasabi-locations/connect-bucket.avif) Now you will be able to enter additional parameters needed for the connection: - **Type** - please choose here Object Storage from the dropdown - **Location Name** - a free text for the name of the location in TagSpaces - **Location Path** - optional parameter, where you can specify a sub-folder of the bucket as root folder for the location - **Access Key** - generated in the user creation step of this tutorial - **Secret Access Key** - generated in the user creation step - **Bucket Name** - as entered in the bucket creation step of this tutorial - **Endpoint URL** - as select in the bucket creation step (e.g., https://s3.eu-central-1.wasabisys.com/ for the eu-central-1 region of Wasabi) Once you confirm the dialog, TagSpaces will try to connect to the bucket and show the files and folders in the bucket. ## Conclusion In this tutorial we learned how using **TagSpaces** in combination with object storage service providers such as **Wasabi** will allows you to easily create and manage you own **scalable Dropbox like** application. --- ## Internationalization The user interface of TagSpaces application was translated so for in 26 languages by volunteers. For the coordination of the translation process we utilize the great service of [Transifex](https://www.transifex.com). Since TagSpaces is evolving fast, we need support for the translations of the existing languages and of course we are happy to see when new languages are added. If you want to support the translation efforts please create a Transifex account and apply for membership in the [TagSpaces project](https://www.transifex.com/projects/p/tagspaces/) there. The following table lists the languages in which the application is already translated. | ISO | Language | Language in English | | ----- | ---------------- | ------------------- | | en_US | English | English | | de_DE | Deutsch | German | | it | Italiano | Italian | | zh_CN | 中国的 | Chinese | | bg | Български | Bulgarian | | ja | 日本の | Japanese | | pt_BR | Português | Brazil | | pt_PT | Português | Portugal | | fr | Français | French | | sk_SK | Slovenský | Slovak | | es | Español | Spanish | | uk | Український | Ukrainian | | ru | Русский | Russian | | tr | Türk | Turkish | | cs | Čeština | Czech | | ca | Catalan | Català | | ko | 한국의 | Korean | | el | ελληνικά | Greek | | sv | svenska | Swedish | | nl_NL | Nederlands | Dutch | | zh_TW | 台灣 | Chinese Taiwan BIG5 | | hu | Magyar | Hungarian | | id_ID | bahasa Indonesia | Indonesian | | pl | Polski | Polish | | mt | Maltese | Maltese | | hy | հայերեն | Armenian | The order of the languages represents the order in which the translations were made by the contributors. --- ## Key Bindings Keyboard shortcuts are combinations of two or more keys that you can use to perform a specific task that would typically require more than one mouse click. They are very useful and can make it easier to work with your software, saving you time and effort as you work with TagSpaces and other applications. To use a keyboard shortcut, hold down one or more keys while pressing the last key of the shortcut. For example, to use the shortcut **Ctrl** + **C** on Windows and Linux or **Command** - **C** on macOS, hold down **Ctrl** button, press **C** and then release both keys. TagSpaces like a much of modern software also provides a range of keyboard shortcuts for better experience with it. Please find the list of the currently supported keyboard shortcuts bellow. ## Default keybindings ### General | Action | Key binding on Windows/Linux | Key binding on macOS | | --------------------- | ---------------------------- | -------------------- | | Show Keybinding Help | `F1` | `F1` | | Fullscreen mode | `F11` | `F11` | | Show developer tools | `F10` | `F10` | | Show location manager | `control + 1` | `⌘ + 1` | | Show tag library | `control + 2` | `⌘ + 2` | | Show search panel | `control + f` | `⌘ + f` | ### Working with documents | Action | Key binding on Windows/Linux | Key binding on macOS | | ---------------------------------------------------- | ---------------------------- | -------------------- | | Open current file or folder | `enter` | `enter` | | Rename current file or folder | `F2` | `F2` | | Delete current file(s) or folder(s) | `del` | `?` | | Tag current file(s) or folder(s) | `control + t` | `⌘ + t` | | Select/open the next document | `right` or `down` | `right` or `down` | | Select/open the previous document | `left` or `up` | `left` or `up` | | Select/Deselect all files | `control + a` | `⌘ + a` | | Edit the currently opened document | `control + e` | `⌘ + e` | | Save the currently opened document | `control + s` | `⌘ + s` | | Close the currently opened document | `control + w` | `⌘ + w` | | Open the properties of the currently opened document | `alt+enter` | `alt+enter` | ### Global keybindings These keybindings are available even if TagSpaces is currently not in focus, but running in background for example in the system's [tray](/ui/userinterface/#tray-menu). | Action | Key binding on Windows/Linux | Key binding on macOS | | ------------------------ | ---------------------------- | -------------------- | | Show TagSpaces | `control + alt + w` | `⌘ + alt + w` | | Create new text document | `control + alt + n` | `⌘ + alt + n` | | Open next document | `control + alt + d` | `⌘ + alt + d` | | Open previous document | `control + alt + a` | `⌘ + alt + a` | | Pause/resume playback | `control + alt + p` | `⌘ + alt + p` | ## Configuring the keybindings Most of the keybindings integrated in TagSpaces are configurable. To change them, open the **Settings**. In the settings dialog, open the tab **KEY BINDINGS**. Learn more in the [settings](/ui/settings#key-bindings) part of the documentation. --- ## Locations Overview # Locations A **location** is a folder on your local file system, serving as a root for listing subfolders, files, and documents. Typical locations could be folders where you collect your photos, store documents, ebooks, or music. ## Location Manager The **Location Manager** can be opened by clicking the case button (1) from the vertical navigation, or by pressing the _CTRL+1_ key combination. Once opened, you will see a list of the currently configured locations. Here you can open any location by clicking its name. You can add new locations by clicking on the **Connect new location** button (2). This will open the _Connect a Location_ dialog, similar to the [_Edit Location_](#local-locations) dialog. The torch icon (3) indicates the **Startup Location**, which is loaded automatically when the application starts. Clicking on a location name again will load the subdirectories within that location. These subdirectories will be displayed in the **folder navigation area** (5). ![Location manager](/media/location-manager.png) Locations with a cloud icon (6) are in an AWS S3-compatible cloud storage. See [Object Storage Locations](#object-storage-locations) for more details. The location with a light green background (4) is the **currently opened location**. The 3-dot button on the far-right side of each location in the Location Manager opens a **context menu** with the following options: - **Edit Location**: Opens the [_Edit Location_](#local-locations) dialog to change properties like the location name or path. - **Open in New Window**: Opens the location in a new window or tab in the web version. - **Show in File Manager**: Opens the location's folder in your operating system's default file manager (hidden for S3 locations). - **Duplicate Location**: Creates a copy of the location, useful for duplicating S3 locations with the same credentials. - **Refresh Location Index**: Manually triggers the indexing process (available only for currently opened locations). - **Move Up**: Moves the location up in the visual list. - **Move Down**: Moves the location down in the visual list. - **Remove Location**: Permanently removes the location from TagSpaces without affecting your files. - **Close Location**: Closes the location, reverting to the welcome screen. :::tip Avoid selecting large directories, such as your _home folder_, as location roots. Large directories can cause performance issues during the creation of the search index. On modern computers with SSD hard drives having a location with 50000 files is usually not a problem. The current upper limit for indexed files in a location is 200000. ::: ### Open Subfolders You can open a location's subfolders by clicking on the suitcase or cloud icon, depending on the location type. ## Location Types In TagSpaces, locations can be either **local** (on your computer or network) or **cloud-based** (e.g., AWS S3 Object Storage). The type of location is selected during creation. ### Local Locations Local locations point to a folder on your computer. This could also be a folder synced from Dropbox or connected to a network drive. Local locations include the following properties: - **Location Name**: The display name in the Location Manager. - **Location Path**: The file path on your computer. - **Startup Location**: Enable this to load the location automatically at application startup. Only one location can be set as a startup location. - **Enable full-text search for TXT, MD, and HTML files** : Indexes the content of text, markdown, and HTML files. - **Watch for external changes** : Monitors the folder and its subfolders for external changes (e.g., file creation or deletion). :::caution Connecting network drives (e.g., NAS systems) is not recommended due to potential performance issues from network speed and large file counts. ::: Clicking on `More Properties` reveals additional options: Additional options include: - **Open in Read-Only Mode** : Restricts the location to read-only access. - **Disable Thumbnail Generation**: Disables thumbnail generation, useful for cloud locations where downloading content is undesirable. This is disabled by default. - **Disable Indexing** : Prevents automatic indexing. Instead, TagSpaces attempts to load a pre-existing index file (`tsi.json`) from the location’s `.ts` folder. - **Index Validity Duration** : Set how long the location's [index](/search/#indexing) remains valid. - **File Tagging Method**: Customize the [file tagging method](/tagging#file-tagging) per location. This setting will overwrite the tagging method from the application [settings](/ui/settings#general). - **File to be opened on navigation to a folder** - Here you specify a name of the file which will be opened automatically on navigation to any folder in this location. Example files are Readme.md or index.html. This is useful to create a wiki-like user experience for the current location. - **Ignore Pattern** : Filter out certain file types or folders from being indexed. This feature uses [ignore-patterns](#ignore-patterns) described bellow. - **Location ID**: Modify or generate a new location ID. This is useful for [custom location IDs](#custom-location-ids). ### Object Storage Locations TagSpaces supports object storage from cloud providers like AWS S3, Wasabi, and Minio. These locations allow you to manage files in the cloud without downloading or syncing them. By doing so you get a fully functional file organizer, browser and navigator for this bucket, directly in TagSpaces. In addition to the properties of local locations, cloud locations include: - **Location Name** - the name of the location, which will be visible in the location manager - **Location Path** - the path in the bucket to which this location points - **Access Key**: The user’s access key. - **Secret Access Key**: The user’s secret access key. - **Session Token**: Used for debugging. - **Bucket Name**: The name of the cloud storage bucket. - **Endpoint URL**: The URL of the S3 service. Clicking `Advanced More` reveals additional settings: - **Region**: Specifies the AWS region hosting the bucket. :::caution "Watch for external changes in this location" is not available for cloud-based locations. ::: For a detailed guide on connecting AWS S3 locations to TagSpaces, read our [tutorial](/tutorials/s3-bucket-locations). In order to connect such location you will need to know the **bucket name**, the **access key**, the **secret access key** and the **data center location** for the particular bucket. If you have a location with a deep folder structure you can also specify the internal path to the files you want to manage in this location. :::tip For detailed instructions on how to connect an AWS S3 location to TagSpaces, read this [tutorial](/tutorials/s3-bucket-locations). ::: TagSpaces provides several additional features over the default AWS UI: - Direct file previews. - Direct editing of text-based files (HTML, MD). - Media streaming (audio/video). - File thumbnails. - Tagging and searching. Using these features, you can create a Dropbox or Evernote replacement with full control over your data. ### WebDav Locations This feature is not supported anymore. ## Advanced Features ### Monitor for Changes This feature is useful for network drives or folders synced with services like Dropbox, where changes (e.g.file/folder creations, renames or deletion) occur in the background while TagSpaces is running. When enabled, TagSpaces automatically reflects these changes in its interface. :::caution This feature is unavailable for cloud-based locations (e.g., AWS S3). ::: ### Manual Indexing For locations with many files, manual indexing speeds up loading times by disabling automatic indexing. You can enable this option when creating or editing a location. Instead of indexing, TagSpaces will load a previously generated index file (`tsi.json`). You can create this file manually by selecting **Refresh Location Index** from the context menu. ### Tag Extraction from Location The **Collect Tags From Current Location** menu item from the next screenshot, identifies unique tags from a location’s index and adds them to the current tag group. :::tip Make sure to update the location index before using tag extraction by performing a search. ::: ### Ignore Patterns You can configure **ignore patterns** in the advanced area of location properties. This excludes specific files or folders from the search index. Ignored folders are displayed grayed-out in the interface. ### Set File Tagging Method Per Location Choosing the tagging method for all locations at once is limiting and kind of inconvenient. Some locations contain files which do not have to be [renamed](/tagging/#file-tagging-based-on-filenames) for various reasons and here the [sidecar tagging](/tagging/#file-tagging-with-sidecar-file) was the recommended way. On the other hand, there are locations with files where the renaming of the file is not problematic and is even wanted since it sticks the tags to file more robustly. That's why we have introduced the ability to set the tagging method per location. This setting is available in the advanced area of the location's properties. ### Export and Import Location Configuration You can export location configurations and share them with others, which is particularly useful for complex cloud configurations. The export can be encrypted to secure credentials. This features allows you to share with you peers pre-configured locations. This is especially useful for [object storage locations](#object-storage-locations), where the configuration is more complex. Due to the fact the configuration can contains sensitive information like secret access keys for object storage buckets, the app support encryption of the exported file. A standard AES encryption algorithm is used for this feature. The process of exporting and importing location configuration is demonstrated in the following video. The format of the location's export is described in this [section](/dev/external-config#configuring-custom-locations). ### Custom Location IDs Locations in TagSpaces have internal identifiers. You can assign custom location IDs to locations in different environments (e.g., between computers) to keep paths consistent. This feature is particularly useful for cloud-based locations with shared folders. If the locations have the same internal ID on all TagSpaces instances, you will be able to use the [internal sharing](/sharing#internal-sharing-for-files-and-folders) of files and folders with your peers. :::info If you create a new location to a folder (e.g. synced with Dropbox or from network share drive), which was already used as a location in TagSpaces, the application will try to find the [location ID](/dev/metafileformats#folder-meta-description-format) and it will use it in this installation . ::: --- ## Settings Overview # Settings To access the settings dialog, click on the gears icon located at the bottom-left part of the app. The settings dialog consists of five tabs, which are described below. ## General Most common TagSpaces settings are accessible from the **General** tab. - **Interface language**: Choose your preferred language from the variety of translations available for TagSpaces. - **Color scheme**: Select between light, dark, or matching the operating system's theme. The last option will automatically switch between light and dark based on your operating system settings. - **Preferred light theme**: Choose the theme that will be used in light mode. - **Preferred dark theme**: Choose the theme that will be used in dark mode. - **Default perspective**: Set the default perspective that will be used for opening folders. - **File tagging method**: Specifies the default [file tagging approach](/tagging#file-tagging). - **Check for new version on startup**: The app will check for new versions on startup and notify you if available. - **Enable changing the tag order with drag and drop**: Experimental feature for reordering tags via drag and drop. - **Collect new tags in the tag library**: If activated, new tags will automatically be added to the `Collected Tag` group in the [tag library](/ui/taglibrary). - **Enable thumbnails generation**: Generates and stores persistent thumbnails in the `.ts` subfolder of the folder where the file resides. - **Default tag background color**: Set the default background color for newly created tags. Existing tags will not be affected. - **Default tag text color**: Set the default text color for newly created tags. Existing tags will not be affected. - **Move deleted files or folders to trash bin**: When enabled, deleted files will be moved to the Trash, Trashbin, or Recyclebin depending on your operating system, allowing easy recovery in case of accidental deletion. - **Show files/directories with a dot (.) in front of the name**: Allows browsing hidden files in UNIX-like systems (Linux, macOS, BSD, etc.). - **Max search results**: Limit the maximum number of files and folders displayed in perspectives and search results. ## File Types This section allows you to configure the viewers and editors that will open specific file types. - **File Viewer Dropdown**: Select the preferred [viewer plugin](/viewing-files/) for each file type (**1**). - **File Editor Dropdown**: Select the preferred [editor plugin](/editing-files/) for each file type (**2**). - **Color Coding**: Adjust the color of the file type by clicking on the colored area (**3**). - **Add New File Type**: Add a new file type that was previously unrecognized (**4**). ### Color-coded File Extensions In the [grid](/perspectives/grid), [list](/perspectives/list), and [kanban](/perspectives/kanban) perspectives, color-coded file extensions enhance visual recognition. For common file extensions, custom colors are predefined and displayed on the extension buttons in the file rows or cards. ![Color-coded file extensions in the list perspective](/media/settings/color-coded-file-extensions.jpg) ## File Templates Here is the place where you can manage the templates for creating new files. You can also select here the default template for every supported file type: MD, HTML or TXT. With the **reset template** button on the top you can restore the default templates delivered with the installation of the application. ### Managing templates Click on any template will open an area where you can edit it. Every template has the following attributes: - **Name** - the name of the template - **Type** - here you can choose between md for markdown, txt and html as target file formats - **Template Content** - the content of the template, here the following placeholder can be used: - **\{date\}** - will be replaced with the current date on file creation - **\{time\}** - will be replaced with the current time on file creation - **\{author\}** - will be replaced with the author on file creation. The author can specified in [tab advanced](/ui/settings#advanced) of the settings. - **\{createdInApp\}** - will be replaced with 'Created in TagSpaces' in the application language. - **File name template** - the template for the name of the created file, can have the following attributes: - **\{timestamp\}** - will be replaced with a timestamp of the file creation e.g. 20250930T123032 for 30th of September 2025 at 12:30:32. - **\{uuid\}** - will be replaced with a unique id. ## Key Bindings The **Key Bindings** tab allows you to view and customize keyboard shortcuts. Most key bindings are configurable. You can modify them by clicking on the field where the binding is listed. ### Modifier Keys - Use `shift`, `ctrl`, `alt`, `option`, `meta`, `command`, and `mod`. `mod` is a special modifier referring to the control key on Windows/Linux and the command key on macOS. ### Special Keys - `backspace`, `tab`, `enter`, `return`, `capslock`, `esc`, `escape`, `space`, `pageup`, `pagedown`, `end`, `home`, `left`, `up`, `right`, `down`, `ins`, and `del`. To assign multiple keys to a single operation, separate them by a comma (`,`). :::tip For more details, refer to the [Key Bindings section](/ui/keybindings) of the documentation. ::: ## Extensions This tab includes two sections: - **Core Extensions**: Lists the extensions packaged with the current version of the application. - **Installed Extensions**: Shows manually installed extensions. Once the **Developer Mode** is activated in the [Advanced](#advanced) tab, a button labeled **Install Extension** becomes available, allowing you to install extensions from a ZIP package. :::warning Install extensions only from trusted sources, as malicious extensions could pose security risks to your system. ::: ## Advanced The **Advanced** tab contains settings intended for advanced use cases. - **Enable mobile mode**: Switch the app to mobile mode for use on small screens or smaller app window sizes. - **Enable generating thumbnails and search index in a separate process**: Thumbnails and the search index are generated in a separate process by default for better performance. You can disable this and use the main app process, but this may negatively impact performance. - **Show warning on opening files externally**: A warning will appear when opening files with external programs to prevent accidental execution of malicious files (e.g., an .exe file on Windows). - **Tag delimiter**: The character used in the file names to separate the tags. Example: In the file name file1[TAG1_TAG2].txt , \_ is the delimiter. - **Prefix for tag container**: The character which is placed in the front of the tag container. Example: In the file name 'file1*[TAG1].txt', '*' is the prefix. - **Max collected tags**: the maximal amount of tags which will be collected in the "Collected Tags" tag group. - **Enable location tags** : Store tag groups outside the main tag library in the location itself. Learn more [here](/ui/taglibrary/#location-tags). - **Geo tagging format** : Choose from the following geo-tagging formats: - **PlusCode**: Encodes latitude and longitude coordinates into a short text representation, e.g., `8FV9P8RR+MW` for `47.741687, 7.342313`. - **MGRS**: Military Grid Reference System, which encodes coordinates like `4QFJ12345678`. - **Map tile servers** : TagSpaces uses OpenStreetMap-based maps for its geotagging features. You can add custom map tile servers here, including from [this list of common servers](https://wiki.openstreetmap.org/wiki/Raster_tile_providers) or your own server for an internet-independent geo-tagging system. :::caution Please respect the policies and terms of use of the map service providers. ::: - **Workspaces** : a place where you can manage [workspaces](/workspaces) for the application. - **Author**: a property which specifies an author's name, which can be inserted in the templates, by creating new files. On the desktop version this variable uses the user name of the operating system. - **Enable developer mode**: Enables some experimental new features and addition debugging. ### Additional Buttons - **Restore default settings**: Resets the app to its original settings, including connected locations and the tag library. Be careful, as this action cannot be undone without backups. - **Reload application**: Reloads the app, similar to pressing the browser reload button. ## AI / LLM Configuration Find out more about this tab in the [AI section](/ai) of the documentation. --- ## Tag Library The **Tag Library** in TagSpaces allows you to manage and organize tags, which you can use to categorize and label your files and folders. To access the tag library, click the tag icon (1) located in the vertical navigation bar on the far left side of the application. The tag library has its own [context menu](#tag-library-context-menu), which can be started by clicking the three dot icon on right of (2). The area marked with (3) represents a single [tag group](#tag-groups). On the top of (3) there is a three dot icon which will open the [context menu](#tag-group-context-menu) of this tag group. (4) show a collapse tag group. Every tag group can be collapsed by clicking on the arrow icon in front of the tag group's name. (5) shows a special tag group used for automatically collecting new tags used in the application. (6) shows a single tag. Every tag has its own three dot icon, which will open its [context menu](#tag-context-menu) ## Tags The primary purpose of TagSpaces, is tagging files and organizing them. **Tags** are organic and integral parts of TagSpaces. By default, tags are stored as part of the filename, which makes them easily transferable between file and operating systems, without any need to synchronize databases, or do any extra work. A file can organically hold its own tags, as long as changing the filename is permittable. :::tip If renaming files is not feasible, you can store tag information in a hidden sidecar file. This option is particularly useful for collaborative projects or files where the filename cannot be changed. ::: Tags can be anything from descriptive labels to categories, ratings, priorities, dates, timestamps, and smart tags. To learn more about TagSpaces' powerful tag management features, check out the [Tagging section](/tagging). :::tip Tag names should not contain **spaces**, **\\**, **/**, or **#**. Instead, use **-** or **\_** to replace spaces. ::: ## Tag Groups Tags are organized into **tag groups**, which serve as categories for tags with similar purposes or characteristics. Tag groups make it easier to navigate, select, and manage tags within the system. TagSpaces comes with several pre-defined tag groups that you can modify, delete, or expand as needed. The default tag groups include: - **Smart Tags**: These tags include various date-based tags and geolocation tags. Learn more in the [smart tags section](/tagging#smart-tags). - **Common Tags**: This group contains two predefined tags, _book_ and _paper_, offering a general idea of the group’s intended purpose. - **Getting Things Done (GTD)**: This group is based on the [GTD time management method](https://en.wikipedia.org/wiki/Getting_Things_Done). Predefined tags include _done_, _next_, _maybe_, and _waiting_, designed to enhance productivity. - **Priorities**: These are color-coded tags, making them easily recognizable at a glance. The predefined priority tags are: - _high_ - Dark orange background - _medium_ - Orange background - _low_ - Lime background - **Ratings**: These predefined star-rating tags come with a recognizable yellow background. As the `*` (asterisk) is considered a wildcard in most file systems (making it unusable in filenames), these tags provide a workaround for organizing files by rating. - **Collected Tags**: This group contains tags that don't belong to any other group. It's created automatically after the tag collection option is activated in the General settings tab. :::tip All tag groups, except smart tags, are optional and can be removed from the tag library if not needed. ::: ## Tag Library Operations The tag library menu contains the following options: - **Create Tag Group**: Opens a dialog for creating a new tag group. - **Reload Location Tags**: Reloads all location tags. - **Import Tag Library**: Starts the process of importing tag groups. Learn more in the [tag sharing tutorial](/tutorials/sharing-tags#distributing-the-library). - **Export Tag Library**: Initiates the export process for tag groups. Learn more in the [tag sharing tutorial](/tutorials/sharing-tags#exporting-the-existing-tag-groups). - **Help**: Opens this page. To create a new tag group, click **Create Tag Group** below the existing tag groups. This will open a dialog where you can specify a name and color for your tag group. Color coding helps distinguish between tags that share common characteristics. You can also specify the text color for better contrast depending on the background color. By selecting **Import Tag Library** or **Export Tag Library**, you can transfer predefined tags between instances of TagSpaces (e.g., on different computers). The process uses a `JSON` file, which allows you to share your tag library across different systems or collaborate with others. Learn more in the [Sharing Tag Libraries](/tutorials/sharing-tags) tutorial. ## Tag Group Operations Each tag group has its own context menu, accessible via the three-dot icon next to the group name. This menu provides the following options: - **Add Tags**: Opens a dialog to add new tags to the group. You can add multiple tags at once by separating them with commas (e.g., `tag1,tag2,tag3`). - **Edit Tag Group**: Allows you to rename the group, change the default background color, and adjust text colors. - **Move Tag Group Up/Down**: Reorders the tag group within the library. - **Sort Tag Group**: Sorts all tags in the group alphabetically. - **Search for tags from this group**: Search for files and folders tagged with at least one tag from this tag group - **Delete Tag Group**: Removes the group and its tags from the library. - **Collect Tags From Current Location** : Collects all tags used in the current location and adds them to the selected group. :::info Learn more about changing the default tag background and text colors in the [settings](/ui/settings/#general). ::: ### Adding tags to a tag group In this dialog you can enter a comma or space separated word which will added as tags to the tag group, for the which this dialog wa opened. ### Editing tag in a tag group In this dialog you can edit the tag **name** and **colors**. Here it is also possible to add an optional **description** for the tags. ### Drag and Drop Operations You can reorder tag groups in the library via drag-and-drop. Similarly, you can rearrange tags within a group using drag-and-drop. The following video demonstrates how this works: ## Tag Context Menus Each tag has its own context menu, accessible by right-clicking on the tag. The context menu varies slightly depending on whether it's accessed from the tag library or from a file. When accessed from the tag library, the options are: - **Show Files With This Tag**: Search for files and folder tagged with the selected tag. - **Apply Tag**: Applies the tag to selected files and folders in the browsing area. - **Edit Tag**: Lets you rename the tag or change its colors. - **Delete Tag**: Removes the tag from the tag group and library, but not from any files or folders it's applied to. When accessed from the file browsing area, the context menu options are similar, but with the addition of: - **Show Files With This Tag**: Search for files and folder tagged with the selected tag. - **Add Tag to Tag Group**: Opens a dialog to select the tag group where the tag should be added. - **Edit tag** - will let you change the tag's name for the tagged file and folder not in the tag library. - **Remove Tag**: Removes the tag from the selected file or folder. :::info Editing a tag's name or deleting it from the library affects only the library itself. Tags already applied to files will remain unchanged. However, if you change a tag's color in the library, the color will update on all files using that tag. This is because TagSpaces embeds tags into filenames. Learn more about [file tagging based on filenames](/tagging#file-tagging-based-on-filenames). ::: ## Smart tags Smart tags are an advanced feature in TagSpaces that offer **dynamic tagging** based on **date, time, or location** criteria. These tags automatically update based on real-time or geographic data, making them highly useful for specific tasks. ### Custom Timestamp Tagging TagSpaces offers several predefined timestamp-based smart tags that can be used to tag files with various levels of date and time precision. Some examples include: - **now**: Creates a precise timestamp down to the second (e.g., `20220111T143022`). - **today, tomorrow, yesterday**: Tags a file with the current, next, or previous day in `YYYYMMDD` format (e.g., `20170314`). - **month**: Applies the current month in `YYYYMM` format. - **year**: Tags the file with the current year in `YYYY` format. These smart tags are particularly helpful for maintaining a chronological order in your file organization. :::info Each newly created file automatically receives a smart tag equivalent to **now**. ::: For more advanced users, the **custom-date** smart tag allows you to add any custom date or time as a tag to your files and folders. ### Geo Tagging Geo tagging allows you to add geographic coordinates as tags to files, connecting them with specific locations. This is especially useful for associating documents or photos with places, whether for planning a vacation or referencing a site visit. When you apply a geo-location tag, a dialog will appear with an interactive map, enabling you to drop a pin on any location. The geographic coordinates will be stored in the [Plus Codes](https://plus.codes/) format, which is a compact way of representing geo-coordinates. ### Editing Smart Tags Smart tags can be edited or further refined to include more detailed information, such as date ranges. For example, geo smart tags can be modified using an editor that allows you to update the coordinates or description. In geo tagging dialog you can enter the latitude and longitude directly without the need of the map. To enable this you have to click on the advanced button in the dialog as shown in the previous screenshot. ### Date Ranges as Tags You can specify date ranges using the following formats: - **Year Range:** `2016-2018` - **Month Range:** `201605-201701` - **Date Range:** `20160531-20160603` - **DateTime Range:** `20160529T124532-20160529T154500` These date range tags help you organize and filter files based on time periods. ## Location Tags Location tags are particularly useful when sharing tag libraries with collaborators who access files stored in shared or synced folders. Enabling this feature allows users to see and work with the same tags across multiple systems. To activate location-based tags, open the advanced settings tab and check the corresponding checkbox, as shown below: Once activated, you will see a dropdown option called **Store Tag Group In** when creating new tag groups. This allows you to specify that the tag group should be stored in the `.ts` folder of the current location. This ensures that tags "travels" with the location when you copy or sync the folder, for example, when moving it to a USB stick or using Dropbox for syncing. In this way, location tags allow for portable and collaborative tagging, making it easier for teams to manage and categorize files in a shared environment. --- ## User Interface Intro # User Interface Introduction TagSpaces opens as a single-window application designed to maximize space usage, whether on large screens or small mobile displays. Its user interface follows Google's Material Design guidelines, making it adaptable and consistent across operating systems and platforms. This streamlined experience ensures ease of use across platforms, so once you're familiar with the features, you can use them anywhere. The image below shows a typical start screen, with a list of available locations on the left and the content of the currently opened folder in the center, using the default perspective. The application's user interface consists of the following main areas: 1. **[Left Drawer](#left-drawer)** - Open the [location manager](/ui/locations/) or [tag library](/ui/taglibrary/) and access other important app functionalities like [settings](/ui/settings). 2. **[Navigation and Search](#navigation-and-search)** - Use this area to search, switch locations, or navigate to parent folders. 3. **[Browsing Area](/browsing-files)** - The central section for browsing files and folders using various **perspectives**. 4. **[Common Actions Area](#preview-area)** - Access actions for the currently opened file or folder. 5. **[File](/files/#file-properties) / [Folder](/folders/#folder-properties) Properties** - View the properties of the opened file or folder. 6. **[File Preview](#file-preview)** - Preview and/or edit the current file here. ## Left Area The main user interface area is divided into three sub-areas: **Top Area**: Displays the app's logo and application version. Clicking the logo opens the **About dialog**, where you can check licensing details and new versions. Below the logo, the **Create New (1)** button opens a dialog to [create files](/creating-files), and the **Open Link (2)** button open new internal or external [link](/linking). The rightmost button **(3)** toggles between **light** and **dark** [themes](#dark-mode-and-themes). In the [TagSpaces Custom](https://www.tagspaces.org/products/custom/) version, this button can open the logged user's properties. **Bottom toolbar**: You can access here the following areas - **(4) [Location Manager](/ui/locations)** - Manage your locations here. - **(5) [Tag Library](/ui/taglibrary)** - Organize tags into groups. - **(6) [Quick Access](/quick-access)** - Access [stored searches](/search#stored-search-queries), [bookmarks](/bookmarks), and recently used files and folders. - **(7) Help** - Access area where you can get help, suggest features, give us feedback or contact support. - **(8) [Settings](/ui/settings#general)** - Access the settings dialog of the application. ## Navigation and Search The file browsing area displays files from the active folder in various views (list, grid, or kanban), depending on the active perspective. Learn more in the [perspective section](/browsing-files). - **(1)** - Toggles the [left drawer](#left-drawer). - **(2)** - The toolbar of the current [perspective](/browsing-files). - **(3)** - Navigate to the previously file or folder. - **(4)** - Opens [search](/search). - **(5)** - Displays parent folders as buttons, enabling navigation. - **(6)** - Displays the current folder's name, which opens the [folder menu](#folder-menu). - **(7)** - Switches the [perspective](/browsing-files) of the current folder. ### Folder Menu The folder menu includes options such as: - Reload, rename, or delete the folder. - Open the folder in the operating system's file manager. - Create new files, subfolders, or add files. - Import macOS tags (only on macOS desktop app). - Switch between different perspectives: [Grid](/perspectives/grid/), [List](/perspectives/list/), [Gallery](/perspectives/gallery/), [Mapique](/perspectives/mapique/), [Kanban](/perspectives/kanban/). - Access folder [properties](/folders#folder-properties). ## Preview Area When a file is opened, the main UI splits into two areas, with the right side becoming the **Preview Area**. TagSpaces supports displaying various file types, from markdown to PDFs and images. For more details, see [Previewing Files](/viewing-files/) and [Editing Files](/editing-files/). - **(1) Title Area** - displays the file's name, tags and extension, with options to [bookmark](/bookmarks) it. - **(2) Navigate & Close** - navigate between files in the current folder or search results, close the current file or folder. - **(3) Tab Switch** - between entry properties, entry [description](/folders#folder-description), [file revisions](/editing-files#file-revisions), [ai chat](/ai#ai-chat-in-folders) and links. A click on the tab title of the current tab will close it, providing more space for the file preview. - **(4) Editing options** - the edit mode for certain file type can be enabled here. A toggle for **auto-saving** changes in the currently edited file is located also in this area. - **(5) Entry Properties** - if opened it displays the properties of the currently opened [file](/files#file-properties) or [folder](/folders#folder-properties). - **(6) Preview & Edit Area** - displays the a preview of the current file. Some text based files like TXT, Markdown or HTML can be edited here. ## Dark Mode and Themes Themes can be changed in the [general settings](/ui/settings#general). ## Multiple Windows and Tabs TagSpaces supports multiple windows or tabs in the web versions. You can open locations, folders, or files in new windows/tabs, or start a new instance of the application. ![Opening a location in a new window](/media/open-new-window.avif) ## Scalable User Interface TagSpaces' UI is scalable, allowing you to adjust the zoom factor according to your screen. Access the zoom options from the **View** menu. Options include zoom in, zoom out, and resetting the zoom to its default. ![Zoom menu options](/media/core/zoomable-ui-menu.avif) - **Zoomed In Interface**: ![Zoomed In Interface](/media/core/zoomed-out.avif) :::tip In a browser, use the built-in zoom functionality. ::: ## Full Screen Mode The desktop app supports full screen mode, which can be toggled by pressing `F11` or selecting _View -> Toggle Fullscreen_ from the **Main Menu**. ![Toggle Fullscreen](/media/core/toggle_fullscreen.avif) :::tip In a browser, use the browser's full screen capabilities. ::: ## Tray Menu On Windows, macOS, and Linux, starting the desktop app loads a **tray menu** integrated into the operating system. The tray menu offers the following functionalities: - **Show TagSpaces** - `Ctrl+Shift+W` / `Cmd+Shift+W` - **Show Search** - `Ctrl+Shift+F` / `Cmd+Shift+F` - **New File / Note** - `Ctrl+Shift+N` / `Cmd+Shift+N` - **Open Next File** - `Ctrl+Shift+D` / `Cmd+Shift+D` - **Open Previous File** - `Ctrl+Shift+P` / `Cmd+Shift+P` - **Pause/Resume Playback** - `Ctrl+Shift+P` / `Cmd+Shift+P` - **Quit TagSpaces** - `Ctrl+Q` / `Cmd+Q` :::tip These key combinations are available globally and can be used even if TagSpaces is not in focus. They can be disabled in the [settings](/ui/settings#key-bindings). ::: --- ## Preview and Print Files TagSpaces supports the previewing of many file types without requiring external viewers. The application includes several viewer extensions: - [Media Player](/extensions/media-player) - Opens audio and video files. - [E-Book Viewer](/extensions/ebook-viewer/) - Opens eBooks in EPUB format. - [HTML Viewer](/extensions/html-viewer/) - Views HTML files, such as those saved by the [Web Clipper](/web-clipper). - [Image Viewer](/extensions/image-viewer/) - Previews images and photos in formats like JPG, GIF, WEBP, TIF, and TGA. - [Link Opener](/extensions/url-viewer/) - Opens bookmarks in URL, DESKTOP, or WEBSITE formats. - [Markdown Reader](/extensions/md-viewer/) - Previews Markdown files. - [MHTML Reader](/extensions/mhtml-viewer/) - Views webpages in MHTML format and emails in EML format. - [Mind Map Viewer](/extensions/mindmap-viewer/) - Displays Markdown (.MD) or .MARKDOWN files as mind maps. - [MSG Viewer](/extensions/msg-viewer/) - Opens emails in MSG format. - [PDF Viewer](/extensions/pdf-viewer/) - Previews documents in PDF format. - [RTF Viewer](/extensions/rtf-viewer/) - Views rich text files in RTF format. - [Text Reader](/extensions/text-viewer/) - Previews plain text files, Markdown files, and various source code formats. - [Document Viewer](/extensions/document-viewer/) - Previews Word documents in DOCX format. - [Slides Viewer](/extensions/slides-viewer/) - Opens Reveal.js presentations. - [Spreadsheet Viewer](/extensions/spreadsheet-viewer/) - Previews spreadsheets in ODS, XLSX, and CSV formats. - [ZIP Viewer](/extensions/archive-viewer/) - Previews archives in ZIP format. - [3D Viewer](/extensions/3d-viewer/) - Previews 3D models in GLB, STL, and OBJ formats. - [Font Viewer](/extensions/font-viewer/) - Previews fonts in TTF, OTF, and WOFF formats. TagSpaces is built with extensibility in mind, allowing new file viewers to be easily developed and integrated into the application. > **Source Code Browser and Editor:** TagSpaces includes a built-in text editor that supports source code highlighting for many common programming languages. Coupled with the [JSON editor](/extensions/json-editor/), it serves as a convenient tool for navigating source code repositories and performing basic code edits. However, it is not intended to replace your IDE but rather to give you a quick overview of code files. ## Assigning File Viewers to File Extensions You can assign different viewer extensions to specific file extensions via the settings menu. ![settings tab file types](/media/settings/settings-tab-file-types.svg) ## Printing Files Most viewer extensions in TagSpaces support printing thanks to the built-in print functionality. In order to print a file you have to open in the file properties and from there you should click on the round FAB button in the bottom right part of the screen. From there you can choose the `Print` menu entry, which will open the print dialog of your operating system. :::tip **Exporting to PDF** Some operating systems like macOS support directly printing to PDF files. This can be seen in the previous screenshot. ::: --- ## Web Clipping - Collect Everything Online To provide an easy way to collect web content such as web pages, articles, PDF documents, bookmarks, places, and screenshots, we have created the TagSpaces Web Clipper browser extension. Unlike other web clipping software, our extension saves content locally on the user's hard drive as plain files, offering full control over the saved files. The extension is available for [Chrome](https://chrome.google.com/webstore/detail/tagspaces-web-clipper/ldalmgifdlgpiiadeccbcjojljeanhjk), [Firefox](https://addons.mozilla.org/en-US/firefox/addon/tagspaces/), and [Microsoft Edge](https://microsoftedge.microsoft.com/addons/detail/tagspaces-web-clipper/dinjgbhjngaockabnagbonbfinanjpdn). Here is an older video on [Youtube](https://youtu.be/lUVoa8tAr6U) demonstrating the capabilities of the web clipper. ## Basic Features Before creating any file, the user can change the file's title and add tags to its name. This information can be entered in sections (1) and (2) of the extension's interface. :::tip The basic functionalities described in the following sections are completely decoupled from the TagSpaces desktop application and can be used with any other application that supports HTML, MHTML, PNG, PDF, or URL files. ::: ### Save Content as HTML The `Save Editable Page` button saves the current webpage as a single file, including embedded images and styling, in HTML format. There are two modes available: - **Simplified Mode:** Automatically extracts the webpage's main content without clutter like ads or navigation, useful for clipping articles (uses [Mozilla's Readability](https://github.com/mozilla/readability) library). - **Full Mode:** Saves all original text and image content of the webpage. HTML files can be opened with any web browser. TagSpaces also has a built-in [viewer](/extensions/html-viewer/) and [editor](/extensions/html-editor/) for HTML files, allowing users to add comments or highlight important information. :::info The javascript code in the crate HTML-file is removed in order to prevent unwanted behavior on opening the file with other programs. ::: ### Save Content as MHTML Available only on Chromium-based browsers like Chrome and Edge, the `Save Complete Page` button saves the webpage in MHTML format, preserving the original design as much as possible. On some browsers, MHTML saving is not enabled by default. Learn how to activate it [here](#enabling-the-saving-of-webpages-as-mhtml). MHTML files are natively supported by Chrome, Edge, and Internet Explorer. TagSpaces includes an integrated [MHTML viewer](/extensions/mhtml-viewer/). ### Save Content as PDF On Firefox, the `Save Complete Page` button saves the webpage as a PDF file. ### Save Current Selection If you select text and images on the webpage, the `Clip Selection` button saves the selection as an HTML file, embedding images as data URLs directly into the file. ### Save a Screenshot The `Take Screenshot` button saves a screenshot of the visible area of the webpage as a PNG file. ### Save Bookmark The `Create Bookmark` button creates a URL file containing the current webpage's URL, useful for saving only the link rather than the entire page. ### Download PDF If the current webpage is a PDF, the extension offers to save it directly. ## Advanced Features The TagSpaces Web Clipper also includes several advanced features: - **Timestamp and Source URL:** The extension embeds the clipping timestamp and source URL in the HTML file. This information is used later for navigation back to the original webpage when previewing in TagSpaces. - **Screenshot Integration:** A screenshot of the visible part of the webpage is embedded in the created HTML and URL files. This screenshot is used as a thumbnail and helps archive the webpage as it appeared at the time of clipping. This makes TagSpaces an effective visual bookmarking tool. - **Geo Coordinates Extraction:** For URLs from mapping services like OpenStreetMap or Google Maps, the extension extracts geo coordinates and converts them to a geo tag, embedded in the file name. - **Plus Codes Support:** The geo tag can be converted to [Open Location Code](https://github.com/google/open-location-code) or Plus Codes, which provide a simpler and more readable representation of geo coordinates (used in Google Maps). - **Automated Tagging:** When saving a screenshot, the domain of the webpage, current date, and the "screenshot" tag are automatically added to the file, making search and organization easier within TagSpaces and other applications. The browser extension seamlessly integrates with the TagSpaces desktop application, allowing for local collection and organization of web data. ## Adjustments for Chrome-based Browsers ### Enabling Webpage Saving as MHTML Follow these steps to enable MHTML saving in Chrome and Chromium browsers: 1. Open Chrome/Chromium. 2. Navigate to `chrome://flags`. 3. Search for "Save Page as MHTML." 4. Click "Enable." 5. Restart your browser. ![Screenshot showing how enable MHTML saving in Chrome](/media/webclipper/enable-mhtml-saving-chrome.png) > **Note**: After activation, you will no longer be able to save websites as HTML files. ### Adding Keyboard Shortcuts to the Web Clipper At the bottom of Chrome's extension management page, you'll find a "Keyboard shortcuts" link (highlighted in red in the screenshot below). This opens a dialog where you can set a direct keyboard shortcut for the extension's popup area. ![Open the Chrome extension shortcut configuration](/media/webclipper/chrome-shortcuts-config.png) I set `ctrl+s` as my shortcut, replacing Chrome's default "Save As" functionality, but you can choose any key combination. ![Setting ctrl+s as keyboard shortcut for the web clipper](/media/webclipper/chrome-set-extension-shortcut.png) ### Specify Download Folder for Web Clippings To be prompted where to save each file, activate the "Ask where to save each file before downloading" option in Chrome's advanced settings. ![Enable asking where to save files in Chrome](/media/webclipper/chrome-ask-where-to-save.png) ### Pin the Web Clipper Make the Web Clipper easily accessible by pinning it in the extensions area of your browser. Learn how from the video below. --- ## Overview(2) # Workspaces _Workspaces_ are a new way to organize your **locations** and **tag groups** in TagSpaces. They allow you to separate different contexts—such as work, personal projects, or hobbies—into their own dedicated spaces, making it easier to stay focused and organized. --- ## Why Use Workspaces? - **Keep projects separate** – Switch between different areas of your life without mixing files or tags. - **Better navigation** – Only see the locations and tags relevant to the active workspace. - **Flexible organization** – Create as many workspaces as you need (e.g., Work, Personal, Research, Photography). - **Focused search results** – If you are in the context of a given workspace the global search functionality will give you only results from the locations assigned to the current workspace. --- ## Managing Workspaces ### Creating a New workspace 1. Open the advanced settings tab and scroll down. 2. Click on **“Create workspace”** to add a new workspace. 3. In the opened dialog, you have to enter a short name for your workspace (e.g., WPG1, 🍭). The short name can be an abbreviation or an emoji and will be displayed after the name of the locations and tag group to which this workspace will be assigned. 4. Enter a full name for your workspace (e.g., “Work Projects 1”). 5. Click the Ok button to finish the creation. --- ### Switching Between Workspaces - Use the **workspaces dropdown** in the sidebar to switch between available workspaces. - When you switch, the UI updates to show only the locations and tag groups that belong to the selected workspace. --- ### Editing or Deleting a Workspace - Open the **workspace settings dialog**. - From here, you can rename, reassign, or delete a workspace. --- ## Workspaces and Tag Groups Each workspace can have its own **tag groups**, keeping your tags organized by context. For example: - In a **Work** workspace: `clientA`, `invoice`, `meeting`. - In a **Personal** workspace: `travel`, `recipes`, `health`. Switching workspaces also switches which tag groups are visible. If there are no tag groups assigned to the current workspace, all tag group will be displayed. You can assign a workspace to a tag group in the properties of a given tag group. In the **edit tag group** dialog, you will find a dropdown, with which you can assign the current tag group to a workspace. The **plus button** in this dropdown will the workspace creation dialog. The **minus button** will disconnect the workspace from the tag group. --- ## Workspaces and Locations You can assign **locations** (folders or drives) to specific workspaces. This ensures you’ll only see the relevant locations when working in a given workspace. In order to do this, you have to open the properties of a given location, from the location's context menu. In the **More properties** area, you will find a dropdown, with which you can assign the current location to a workspace. The **plus button** in this dropdown will the workspace creation dialog. The **minus button** will disconnect the workspace from the location. --- ## Tips & Best Practices - Use workspaces to **separate professional and personal content**. - Create dedicated workspaces for **large projects** with their own tag structure. - If you handle sensitive data, a separate workspace can help keep it isolated. --- ## Limitations - Locations and tag groups can belong to only **one workspace at a time**. - Workspaces are stored locally—if you use multiple devices, you’ll need to configure them individually. --- ## Related Topics - [Managing Locations](/ui/locations.md) - [Using Tag Groups](/ui/taglibrary.md) - [Organizing Files with Tags](/tagging.md)