{"id":17026404,"url":"https://github.com/chrisgrieser/obsidian-quadro","last_synced_at":"2025-04-09T16:17:54.246Z","repository":{"id":210692401,"uuid":"727197421","full_name":"chrisgrieser/obsidian-quadro","owner":"chrisgrieser","description":"Obsidian Plugin for social-scientific Qualitative Data Analysis (QDA). An open alternative to MAXQDA and atlas.ti, using Markdown to store data and research codes.","archived":false,"fork":false,"pushed_at":"2025-03-30T09:15:07.000Z","size":1198,"stargazers_count":83,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-09T16:17:41.442Z","etag":null,"topics":["grounded-theory","obsidian-plugin","qualitative-content-analysis","qualitative-data-analysis"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chrisgrieser.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":"https://www.paypal.me/ChrisGrieser","ko_fi":"pseudometa"}},"created_at":"2023-12-04T11:38:00.000Z","updated_at":"2025-04-04T08:28:48.000Z","dependencies_parsed_at":"2024-03-12T12:03:04.222Z","dependency_job_id":"1e91a425-97f5-4aee-bf5c-49be558ef345","html_url":"https://github.com/chrisgrieser/obsidian-quadro","commit_stats":null,"previous_names":["chrisgrieser/obsidian-qualitative-data-analysis","chrisgrieser/obsidian-quadro"],"tags_count":177,"template":false,"template_full_name":"chrisgrieser/pseudometa-obsidian-plugin-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgrieser%2Fobsidian-quadro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgrieser%2Fobsidian-quadro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgrieser%2Fobsidian-quadro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgrieser%2Fobsidian-quadro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chrisgrieser","download_url":"https://codeload.github.com/chrisgrieser/obsidian-quadro/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248065282,"owners_count":21041872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["grounded-theory","obsidian-plugin","qualitative-content-analysis","qualitative-data-analysis"],"created_at":"2024-10-14T07:32:33.801Z","updated_at":"2025-04-09T16:17:54.221Z","avatar_url":"https://github.com/chrisgrieser.png","language":"TypeScript","funding_links":["https://www.paypal.me/ChrisGrieser","https://ko-fi.com/pseudometa","https://ko-fi.com/Y8Y86SQ91'"],"categories":[],"sub_categories":[],"readme":"# Quadro\n![GitHub download count](https://img.shields.io/github/downloads/chrisgrieser/obsidian-quadro/total?label=GitHub%20Downloads\u0026style=plastic)\n![Obsidian store download count](https://img.shields.io/badge/dynamic/json?logo=obsidian\u0026color=%23483699\u0026label=Obsidian%20Downloads\u0026query=%24%5B%22quadro%22%5D.downloads\u0026url=https%3A%2F%2Fraw.githubusercontent.com%2Fobsidianmd%2Fobsidian-releases%2Fmaster%2Fcommunity-plugin-stats.json\u0026style=plastic)\n![Last release](https://img.shields.io/github/v/release/chrisgrieser/obsidian-quadro?label=Latest%20Release\u0026style=plastic)\n\n_**Qua**litative **D**ata analysis **R**ealized in **O**bsidian_\n\nObsidian plugin for social-scientific Qualitative Data Analysis (QDA). An open\nalternative to [MAXQDA](https://www.maxqda.com/) and\n[atlas.ti](https://atlasti.com/), using Markdown to store data and research\ncodes.\n\nQuadro supports both, coding in the tradition of Grounded Theory, and data\nextraction following the principles of Qualitative Content Analysis (as outlined\nby [Gläser and Laudel](https://doi.org/10.17169/fqs-20.3.3386)).\n\n## Table of Contents\n\n\u003c!-- toc --\u003e\n\n- [Introduction](#introduction)\n\t* [For academics not familiar with Obsidian](#for-academics-not-familiar-with-obsidian)\n\t* [For Obsidian users not familiar with QDA](#for-obsidian-users-not-familiar-with-qda)\n\t* [Brief methodological comparison with other QDA software](#brief-methodological-comparison-with-other-qda-software)\n- [Usage](#usage)\n\t* [Getting started](#getting-started)\n\t\t+ [Basics for academics new to Obsidian](#basics-for-academics-new-to-obsidian)\n\t\t+ [Example vault for Quadro](#example-vault-for-quadro)\n\t\t+ [Experienced Obsidian users](#experienced-obsidian-users)\n\t\t+ [Using a separate vault](#using-a-separate-vault)\n\t\t+ [Migrating from an existing research project with other QDA software](#migrating-from-an-existing-research-project-with-other-qda-software)\n\t* [Modification of Obsidian core behavior](#modification-of-obsidian-core-behavior)\n\t* [Coding](#coding)\n\t\t+ [How coding works in Quadro](#how-coding-works-in-quadro)\n\t\t+ [Coding capabilities](#coding-capabilities)\n\t* [Extraction](#extraction)\n\t\t+ [How extraction works in Quadro](#how-extraction-works-in-quadro)\n\t\t+ [Aggregate extractions](#aggregate-extractions)\n\t\t+ [Extraction capabilities](#extraction-capabilities)\n\t* [Auxiliary commands](#auxiliary-commands)\n\t\t+ [Open random Data Files](#open-random-data-files)\n\t\t+ [Progress tracking \u0026 theoretical saturation](#progress-tracking--theoretical-saturation)\n- [Configuration](#configuration)\n\t* [Buttons](#buttons)\n\t* [Hotkeys](#hotkeys)\n\t* [Plugin behavior](#plugin-behavior)\n- [Installation \u0026 update](#installation--update)\n- [Development](#development)\n\t* [Contribute](#contribute)\n\t* [CSS classes](#css-classes)\n- [Credits](#credits)\n\t* [Acknowledgments](#acknowledgments)\n\t* [Recommended citation of this project](#recommended-citation-of-this-project)\n\t* [About the developer](#about-the-developer)\n\n\u003c!-- tocstop --\u003e\n\n## Introduction\n\n### For academics not familiar with Obsidian\nThis plugin utilizes the rich text-processing capabilities of\n[Obsidian](https://obsidian.md/) to provide a lightweight application for\nqualitative data analysis.\n\nAll data is stored as [Markdown](https://www.markdownguide.org/) files.\n**Markdown** is a human-readable, non-proprietary, and commonly used open\nstandard for plain text files. This means:\n- There is no lock-in / dependency to a particular app, the data can be\n  analyzed in any app supporting Markdown. (In fact, the data is stored in\n  plaintext and can thus even be opened with and read with `Notepad.exe` or\n  `TextEdit.app`.)\n- The research data is therefore future-proof, fulfilling the requirement of\n  long-term archiving of qualitative data. It is guaranteed that the data can\n  still be read even in 50 years, a guarantee that does not exist for research\n  conducted with proprietary research software such as `MAXQDA` or `atlas.ti`.\n- The data is interoperable with other applications, meaning it can easily be\n  combined with other text analysis tools such as\n  [AntConc](https://www.laurenceanthony.net/software/antconc/).\n- The Markdown files are stored offline by default, meeting key requirements for\n  research ethics and protection of research data.\n\nBeing an Obsidian plugin, the Qualitative Data Analysis is embedded in the\nextensive functionality and plugin ecosystem of Obsidian:\n- The data analysis can employ the feature-set of Obsidian, which already has a\n  strong focus on linked files. For instance, the [Graph\n  View](https://help.obsidian.md/Plugins/Graph+view) can be used to create a\n  visual network of codes, and [Outgoing\n  Links](https://help.obsidian.md/Plugins/Outgoing+links) provides an overview\n  of all data files a code is assigned to.\n- The qualitative analysis is easily extended with a [comprehensive ecosystem of\n  more than 1000 plugins](https://obsidian.md/plugins), for example\n  [Projects](https://obsidian.md/plugins?id=obsidian-projects) for advanced data\n  aggregation, or [Relay](https://github.com/no-instructions/relay) for\n  live-collaboration like in `Google Docs`.\n- Obsidian has been [stress tested and confirmed to be able to handle 20 000+ files](https://www.reddit.com/r/ObsidianMD/comments/zrzqq0/testing_the_scalability_of_obsidian_with_large/).\n- All this allows the researcher to customize the analysis to the particular\n  needs of their research. Case-specific adaption of research methods\n  is a key demand of qualitative research (which strictly speaking is not\n  truly fulfilled when using standardized, proprietary research software).\n- Obsidian, as well as _Quadro_, both [have mobile support (Android and iOS)](https://obsidian.md/mobile).\n- Using Obsidian allows you to employ a keyboard-driven workflow with minimal\n  usage of the mouse.\n\nObsidian is [free to use for academic purposes](https://obsidian.md/license),\nand _Quadro_ is also free to use.\n- Especially for students writing their theses, this saves a lot of unnecessary\n  hassle with licenses.\n- Unlicensed use of research software can lead to [journal articles being\n  retracted](https://retractionwatch.com/2024/11/08/complaint-from-engineering-software-company-prompts-two-retractions/).\n  Using free or open source tools like _Quadro_ avoids this issue entirely.\n\nIf there is a more tech-savvy researcher in the research team, the advantages of\n_Quadro_ go even further:\n- Being Open Source, this plugin can be modified and customized to fit their\n  needs. (It is written is TypeScript / JavaScript, a particularly accessible\n  and commonly used programming language.)\n- By storing the data in Markdown files, all research data can be fully\n  version-controlled with `git`.\n\n### For Obsidian users not familiar with QDA\nIn Qualitative Data Analysis, \"coding\" is a form of fine-grained tagging of text\nsegments, and \"extraction\" is a transforming prose text into structured data.\n\n_Coding_ is implemented in _Quadro_ via \"bidirectional\" links between Data Files\nand Code Files by inserting wikilinks in _both_ files. (Obsidian itself does\nhave backlinks, but those are unidirectional links, since the implicit backlink\nis only inferred and not stored anywhere in the Markdown file.).\n\nIt makes use of Obsidian's\n[note-embedding](https://help.obsidian.md/Linking+notes+and+files/Embed+files#Embed+a+note+in+another+note)\nfunctionality to keep track of coded text segments.\n- Codes are implemented as `[[wikilinks]]` instead of `#tags`, as the former\n  allows for more flexibility, such as having separate file per code.\n- The distinct feature of this plugin is that its commands _always_ make edits\n  to two files (the data and the code file) _at the same time_, which is\n  necessary to adequately handle the workflow common to coding in QDA.\n\n_Extraction_ is implemented by creating separate Extract Files for each\nextraction, using [YAML\nfrontmatter](https://docs.zettlr.com/en/core/yaml-frontmatter/) to store the\ndata in a structured form. Quadro uses a simplistic templating mechanism to\nsupport the creation of those Extraction Files.\n\n### Brief methodological comparison with other QDA software\n**Advantages**\n- **Interoperability**: Can be freely combined with other QDA software.\n- **Flexibility**: You can use codes, extractions, or freely combine both.\n- **Customizability**: Implicit assumptions of QDA software, such as the initial\n  order in which codes are presented in the code selection modal, can be\n  customized to deal with different kinds of coder biases.\n- **Extensibility**: _Quadro_ can be easily extended via the Obsidian plugin\n  ecosystem. As opposed to other research software, extending the functionality\n  in most cases does not require technical expertise coding experience.\n\n**Disadvantages**\n- The **unit of coding** is restricted to paragraphs and to a degree segments\n  of a paragraph. Coding of individual words is not supported.\n- Due to the nature of Markdown markup, assigning multiple codes to **partially\n  overlapping paragraph segments** is not supported. This restriction only\n  applies to partial overlaps, assigning multiple codes to the same paragraph or\n  segment works, of course.\n\n## Usage\n\n### Getting started\n\n#### Basics for academics new to Obsidian\n- You should familiarize yourself with\n  [Markdown](https://help.obsidian.md/Getting+started/Glossary#Markdown), a\n  simple standard for human-readable text files, such as `**bold text**` for\n  **bold text**.\n- A [\"vault\"](https://help.obsidian.md/Getting+started/Glossary#Vault) is a\n  local folder on your device that Obsidian uses as project folder. Obsidian\n  configurations are on a per-vault-basis, so you can have separate\n  configurations for your note-taking and for your data analysis.\n\n#### Example vault for Quadro\nThere is a [pre-configured example\nvault](https://github.com/chrisgrieser/obsidian-quadro) to be used with\n_Quadro_. Apart from some pre-installed plugins for QDA, it includes some mock\ndata with exemplary codes and extractions, and showcases of extraction\ncapabilities, to demonstrate the capabilities of _Quadro_.\n\n1. [Download the vault](https://github.com/chrisgrieser/quadro-example-vault/releases/latest/download/quadro-example-vault.zip).\n2. Open the directory `quadro-example-vault` as an Obsidian vault. ([If you are\n   new to Obsidian, see the Obsidian Documentation on how to do\n   that.](https://help.obsidian.md/Getting+started/Create+a+vault#Open+existing+folder))\n\n#### Experienced Obsidian users\nIf you are experienced with Obsidian, you can also directly install the plugin,\nthough checking out the example vault is nonetheless helpful to get a grasp on\nthe capabilities of _Quadro_.\n\n#### Using a separate vault\nIt is recommended to create a separate vault for data analysis and\ninstall the plugin there, for several reasons:\n- QDA does not follow the \"common logic of note-taking,\" thus often requiring a\n  different set of plugins and settings from your regular vault.\n- Separate vaults mean that suggestions, such as for properties, are also\n  separated.\n- To make Obsidian easier to use for qualitative research, _Quadro_ also does\n  some (minor) modifications to the core layout of Obsidian, for instance wider\n  property keys.\n- For archival purposes, the research data is already separated.\n- For collaborative work in a research team, the data is stored in separately\n  from personal notes.\n\n#### Migrating from an existing research project with other QDA software\nUnfortunately, this is not supported. Main reason being that commercial QDA\nsoftware use proprietary formats, the exact reason why researchers should\nuse research software utilizing open formats to begin with.\n\nIf your research data is\nsaved in [Markdown, Obsidian is able to import\nthem](https://help.obsidian.md/import/markdown) though. Importing from [various\nother note-taking apps like Notion, Evernote, OneNote, Google Keep, Apple Notes,\nBear, or Roam](https://help.obsidian.md/import) is supported as well.\n\nIt is, however, possible to export the results done with _Quadro_, to\ncollaborate with other researchers. You can either export individual files as\nPDF, or [export aggregated results as CSV](#extraction-capabilities).\n\n### Modification of Obsidian core behavior\nTo work correctly, _Quadro_ modifies some behavior of Obsidian core:\n- If a Code File or Extraction File is deleted, _Quadro_ will remove all\n  references to it to avoid leaving dead links.\n- Since _Quadro_ heavily relies on [block\n  references](https://help.obsidian.md/Linking+notes+and+files/Internal+links.md#Link+to+a+block+in+a+note)\n  and [embedded\n  blocks](https://help.obsidian.md/Linking+notes+and+files/Embed+files.md#Embed+a+note+in+another+note),\n  their styling is adapted.\n\nAs mentioned before it is recommended to use a separate vault for data analysis\nwith _Quadro_.\n\n### Coding\n\n#### How coding works in Quadro\nThere are two basic types of files for the analysis, Data Files and Code Files,\nwhich are both stored as [Markdown files](https://www.markdownguide.org/).\n\n**Data Files**\nThe empirical material as text files. They can be stored anywhere in the vault\nas `.md` files. (A separate sub-folder named `Data` is recommended though.) As\n_Quadro_ assigns codes to whole paragraphs, these data files should\nbe split up into smaller segments.\n\nWhen a code is assigned, a link to the corresponding Code File and a unique\nID are appended to the paragraph:\n\n```md\nFilename: ./Data/Interview 1.md\n\nLorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint\nconsectetur cupidatat. [[MyCode]] ^id-240302-124012\n```\n\n**Code Files**\nAll Markdown files in the folder `{vault-root}/Codes` are considered code\nfiles. (The folder is configurable.)\n\nWhen a code is assigned, a link back to the original location in the Data File\nis appended to the code file. The link has the format\n`[[{filename-datafile}#^{id-of-paragraph}]]`, with the `id` being a timestamp.[^1]\n\n```md\nFilepath: ./Codes/MyCode.md\n\n![[Interview 1#^id-240302-124012]]\n```\n\nAs the link is a so-called [embedded\nlink](https://help.obsidian.md/Linking+notes+and+files/Embed+files#Embed+a+note+in+another+note),\nObsidian renders the respective paragraph of the Data File inside the Code\nFile:\n\n![Embedded block link in reading \u0026 source mode](./docs/embedded-blocklink_reading-and-source-mode.png)\n\nThe underlying folder structure for coding looks like this:\n\n```txt\n.\n├── 📂 Data\n│   ├── 📄 Interview 1.md\n│   ├── 📄 Field Notes 1.md\n│   └── …\n└── 📂 Coding\n    ├── 📄 code 1.md\n    ├── 📄 code 2.md\n    └── 📂 Group 1\n         ├── 📄 code 3.md\n         ├── 📄 code 4.md\n         └── …\n```\n\n\u003e [!NOTE]\n\u003e The main caveat of this approach is that the assignment of codes is mostly\n\u003e restricted to the paragraph level. Assigning codes to only segments of a\n\u003e paragraph is limited to adding highlights to the respective section.\n\u003e Assignment of codes to individual words and coded segments with overlap is\n\u003e not supported.\n\n#### Coding capabilities\n\u003c!-- LTeX: enabled=false --\u003e\n\n| Action                                    | Description                                                                                                                                                                                                                            |             Sidebar button             | Default hotkey | Capability provider                                                                                              |\n| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------: | :------------: | ---------------------------------------------------------------------------------------------------------------- |\n| Assign code                               | Assign a code to the current paragraph, any selected text is highlighted. (overlapping highlights not supported though). \u003cbr\u003e\u003cbr\u003eSelect `Create new code` or press `shift ⏎` to create a new code file and assign it to the paragraph. |   ![Icon](./docs/icons/circle-plus.svg)    | `mod+shift+a`  | Quadro                                                                                                           |\n| Rename code                               | All references to the Code File are automatically updated. (You can also rename by right-clicking a file or link and selecting \"Rename.\")                                                                                              |   ![Icon](./docs/icons/circle-slash.svg)   |                | [Obsidian Built-in][rename]                                                                                      |\n| Delete code from paragraph                | Removes a code from the current paragraph of a Data File or Code File. The reference is also removed from the corresponding other file.                                                                                                |   ![Icon](./docs/icons/circle-minus.svg)   | `mod+shift+d`  | Quadro                                                                                                           |\n| Delete Code File and all references to it | Moves the Code File to the trash, _and_ deletes all references to it.                                                                                                                                                                  |     ![Icon](./docs/icons/circle-x.svg)     |       —        | Quadro                                                                                                           |\n| Bulk-create new codes                     | Create multiple new codes at once (without assigning them to a paragraph).                                                                                                                                                             |  ![Icon](./docs/icons/circle-dashed.svg)   |       —        | Quadro                                                                                                           |\n| Merge codes                               | Merge the _current_ Code File into another Code File. All references from data files are updated to point to the merged file.                                                                                                          |    ![Icon](./docs/icons/circle-dot.svg)    |       —        | Quadro                                                                                                           |\n| Code grouping                             | Codes can be arranged in sub-folders via drag-and-drop in the File Explorer.                                                                                                                                                            |                   —                    |       —        | [Obsidian Built-in][move file]                                                                                   |\n| Show code overview                        | Creates an auto-updating overview of all codes in a nested list with code assignment counts.                                                                                                                                           |   ![Icon](./docs/icons/circle-equal.svg)   |       —        | Quadro                                                                                                           |\n| Axial coding                              | Using the Canvas plugins, you can freely arrange entities on a board, and connect them via lines and arrows, suitable for Axial Coding. \u003cbr\u003e\u003cbr\u003e[Further Documentation][core-canvas]                                                   | ![Icon](./docs/icons/layout-dashboard.svg) |       —        | [Obsidian Core Plugin: Canvas][core-canvas]\u003cbr\u003e\u003cbr\u003e[Obsidian Community Plugin: Semantic Canvas][semantic-canvas] |\n| Investigation of code co-occurrences      | In the Obsidian Search, use a query such as `line:([[MyCodeOne]] [[MyCodeTwo]])`. \u003cbr\u003e\u003cbr\u003e[Further Documentation][search]                                                                                                              |                   —                    | `mod+shift+f`  | [Obsidian Core Plugin: Search][search]                                                                           |\n| Visualization of code relationships       | In the Graph View, use a query like `path:Codes OR path:Data`, and assign Data and Codes to different groups. \u003cbr\u003e\u003cbr\u003e[Further Documentation][graph]                                                                                   |     ![Icon](./docs/icons/git-fork.svg)     |    `mod+g`     | [Obsidian Core Plugin: Graph View][graph]                                                                        |\n\n\u003c!-- LTeX: enabled=true --\u003e\n\n[rename]: https://help.obsidian.md/Files+and+folders/Manage+notes#Rename+a+note\n[graph]: https://help.obsidian.md/Plugins/Graph+view\n[search]: https://help.obsidian.md/Plugins/Search#Search+operators\n[move file]: https://help.obsidian.md/Plugins/File+explorer#Move+a+file+or+folder\n[core-canvas]: https://help.obsidian.md/Plugins/Canvas\n[semantic-canvas]: https://github.com/aarongilly/obsidian-semantic-canvas-plugin?tab=readme-ov-file#obsidian-semantic-canvas-plugin\n\n- `mod` refers the `ctrl` on Windows and to `cmd` on macOS.\n- When there is a file `Codes/Template.md`, its frontmatter is used as template\n  for any newly created code.\n- Splitting Code Files is not yet supported. Doing so with any other\n  method (such as another plugin) is likely going to result in broken references.\n- ⚠️ Renaming or moving Code/Data Files should be done from within Obsidian.\n  Using the Windows Explorer or macOS Finder does not trigger the automatic\n  updating of references, meaning a loss of information.\n\n### Extraction\nQuadro implements extraction following the principles of [Qualitative Content\nAnalysis as outlined by Gläser and\nLaudel](https://doi.org/10.17169/fqs-20.3.3386).\n\n#### How extraction works in Quadro\nExtraction is implemented similarly to coding, using two basic filetypes, Data\nFiles and Extraction Files.\n\n**Data Files**\nThe empirical material as text files. They can be stored anywhere in the vault\nas `.md` files.\n\nWhen making an extraction, a link to the corresponding Extraction File and a\nunique ID are appended to the paragraph, just like with coding:\n\n```md\nFilename: ./Data/Interview 2.md\n\nLorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint\nconsectetur cupidatat. [[Career Visions/1]] ^id-240302-124012\n```\n\n**Extraction Files**\nExtraction is implemented via Markdown metadata ([YAML frontmatter](https://docs.zettlr.com/en/core/yaml-frontmatter/)),\nwhich is supported via [Obsidian Properties](https://help.obsidian.md/Editing+and+formatting/Properties).\n\nWhen making an extraction, you are presented with a choice of your extraction\ntypes. Upon selection, a new file is created in the folder that groups\nextractions, that is `{vault-root}/Extractions/{Extraction Group}/`. As\nsuch, each file corresponds to a single extraction, with its parent folder\nindicating what type of extraction it is.\n\nYou can then fill out the fields of newly created file. The\n`extraction-source` key contains a link back to the paragraph in the Data File\nwhere you initiated the extraction. In the rendered view, the file contains a\n`Properties` header that can conveniently be filled out:\n\n![Showcase Extraction](./docs/showcase-extraction.png)\n\nThe underlying plaintext view of the file looks like this:\n\n```md\nFilepath: ./Extractions/Career Visions/Career Visions 001.md\n\n---\noccupation: \"painter\"\ncareer stage: \"novice\"\nyear of experience: 4\nextraction-date: 2024-03-02T12:40:12\nextraction-source: \"[[Field Notes 3#^id-240302-124012]]\"\n---\n\n**Paragraph extracted from:** ![[Field Notes 3#^id-240302-124012]]\n```\n\n**Extraction Templates (Extraction Types)**\nThe available extraction types are determined by the sub-folders of\n`{vault-root}/Extractions/`. The fields that are created for filling in\ninformation are determined by the `Template.md` file located in that sub-folder.\nFor the example above, the Extraction Template looks like this:\nThe corresponding template for the extraction type is located in the same\nfolder, but has the filename `Template.md`.\n\n```md\nFilepath: ./Extractions/Career Visions/Template.md\n\n---\noccupation: \ncareer stage: \nyear of experience: \n---\n```\n\nAll in all, the underlying folder structure for extractions looks like this:\n\n```txt\n.\n├── 📂 Data\n│   ├── 📄 Interview 1.md\n│   ├── 📄 Field Notes 1.md\n│   └── …\n└── 📂 Extractions\n    ├── 📂 Career Obstacles\n    │    ├── 📄 Template.md\n    │    ├── 📄 Career Obstacles 001.md\n    │    ├── 📄 Career Obstacles 002.md\n    │    └── …\n    └── 📂 Career Visions\n         ├── 📄 Template.md\n         ├── 📄 Career Visions 001.md\n         └── …\n```\n\n#### Aggregate extractions\nThere are various Obsidian plugins that allow you to get a spreadsheet-like\noverview of all extractions.\n\nThe recommended one is the [Projects\nPlugin](https://obsidian.md/plugins?id=obsidian-projects), due to its\nflexibility, and it's long-term design philosophy.\n\nTo aggregate extractions, with the `Projects Plugin`, open the command palette\nwith `cmd/ctrl+p`, search for the `Projects: Create New Project` command, and\nenter as `Path` the extraction type you would like to aggregate, for example\n`Extractions/Career Visions`.\n\n#### Extraction capabilities\n\n| Action                                | Description                                                                                                                                                                                                                                                                                             |            Sidebar button                 | Default hotkey | Capability provider                                      |\n| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-----------------------------------:     | :------------: | -------------------------------------------------------- |\n| Extract from paragraph                | Creates an Extraction File from Extraction Template.                                                                                                                                                                                                                                                    |   ![Icon](./docs/icons/square-plus.svg)       | `mod+shift+e`  | Quadro                                                   |\n| Add paragraph to last Extraction File | Adds a reference to the last modified Extraction file to the current paragraph. Useful when information is spread across to paragraphs.                                                                                                                                                                 |   ![Icon](./docs/icons/square-asterisk.svg)   | `mod+shift+l`  | Quadro                                                   |\n| Merge extractions                     | Merge the _current_ Extraction File into another Extraction File. All references from data files are updated to point to the merged file.                                                                                                                                                               |     ![Icon](./docs/icons/square-dot.svg)      |       —        | Quadro                                                   |\n| Create new extraction type            | Creates a new Extraction Type (= a new sub-folder in \"Extractions,\" alongside a new Extraction Template).                                                                                                                                                                                               |   ![Icon](./docs/icons/box-select.svg)        |       —        | Quadro                                                   |\n| Show Extraction type overview         | Creates an auto-updating overview of an Extraction Type and their values.                                                                                                                                                                                                                               |  ![Icon](./docs/icons/square-equal.svg)       |       —        | Quadro                                                   |\n| Co-occurrent extraction dimensions    | Find extractions where two dimensions have a specific value, by using a query such as `[\"cause of the issue\": fragmentation] [\"type of compatibility\":backward]` in the Obsidian Search. \u003cbr\u003e\u003cbr\u003e[Further Documentation][search]                                                                        |                   —                       | `mod+shift+f`  | [Obsidian Core Plugin: Search][search]                   |\n| Rename dimension globally             | Renaming a property field within a file only affects the property for that file. To rename a property globally, use the Command Palette (`mod+p`), and search for `Properties View: Show all Properties`. A list of properties pops up in the sidebar, where you can rename properties via right-click. |                   —                       |       —        | [Obsidian Core Plugin: Properties View][properties view] |\n| Export all extractions as `.csv`      | All extractions for all extraction types are exported as `.csv`.                                                                                                                                                                                                                                        | ![Icon](./docs/icons/square-arrow-up.svg)     |       —        | Quadro                                                   |\n\n[properties view]: https://help.obsidian.md/Plugins/Properties+view\n\n- `mod` refers the `ctrl` on Windows and to `cmd` on macOS.\n- For overviews and `.csv` exports, the included properties are\n  determined by the properties of the template files (`Template.md`).\n- ⚠️ Renaming or moving Extraction/Data Files should be done from within\n  Obsidian. Using the Windows Explorer or macOS Finder does not trigger the\n  automatic updating of references, meaning a loss of information.\n\n### Auxiliary commands\n\n#### Open random Data Files\nDepending on methodological considerations, it can make sense to analyze Data\nfiles in random order.\n\n| Action                           | Description                                                                   |              Sidebar button            | Default hotkey |\n| -------------------------------- | ----------------------------------------------------------------------------- | :------------------------------------: | :------------: |\n| Open random unread Data File     | Open a random file in the vault that has the property `read` set to `false`   |   ![Icon](./docs/icons/shuffle.svg)    | `mod+shift+n`  |\n\n#### Progress tracking \u0026 theoretical saturation\n_Quadro_ also offers some basic progress tracking capabilities. Most coding and\nextraction actions are counted in a JSON file `progress.json`. Furthermore, the\ncommand `Mark current Data File as read` also increments the count of read Data\nFiles in the `progress.json` file.\n\n| Action                           | Description                                                                               |                Sidebar button                 | Default hotkey |\n| -------------------------------- | ----------------------------------------------------------------------------------------- | :-------------------------------------------: | :------------: |\n| Mark current Data File as read   | Sets a property `read` for the current file to `true` and increments the `progress.json`. |     ![Icon](./docs/icons/file-check.svg)      | `mod+shift+r`  |\n| Show data analysis progress file | Reveals the `progress.json` file in the system explorer.                                  | ![Icon](./docs/icons/flag-triangle-right.svg) |                |\n\nThe progress tracking is not only useful for accountability and planning, but\nalso has **methodological value**. For instance, you could operationalize\n**theoretical saturation** for a coding-based investigation by examining the\nratio of newly created codes to paragraphs being assigned to existing codes. Or\nyou could investigate the **theoretical saturation** of an extraction-based\nproject by looking at the ratio of newly created extractions to paragraphs only\nbeing assigned to existing extractions.\n\n## Configuration\n\n### Buttons\nTo remove or re-arrange buttons, go to the Obsidian settings: `Appearance` →\n`Ribbon Menu` → `Manage`.\n\n### Hotkeys\nEvery hotkey can be customized by searching for the name of the respective\naction in the Obsidian settings under `Hotkeys`.\n\n### Plugin behavior\nThe plugin behavior can be customized in the `Quadro` tab of the Obsidian\nsettings. Aside from folder locations, there are a few settings which change the\nway codes and extractions are presented. Note that these are not technical or\npersonal decisions, but **methodological decisions** as they may change your choice\nof codes and extraction values.\n\n## Installation \u0026 update\n- **Requirements:** The oldest Obsidian version _Quadro_ supports is **1.5.8**.\n  Recent versions of _Quadro_ require at least Obsidian **version 1.7.4**.\n- **Installation:** [Install in Obsidian](https://obsidian.md/plugins?id=quadro)\n- **Update:** In Obsidian, go to `Settings` → `Community plugins` → `Check for\n  updates` → `Update all`.\n- **Bug reports \u0026 feature requests:** [GitHub issue\n  tracker](https://github.com/chrisgrieser/obsidian-quadro/issues).\n- **Questions \u0026 general discussion** [GitHub discussion\n  forum](https://github.com/chrisgrieser/obsidian-quadro/discussions).\n\n## Development\n\n### Contribute\n\n```bash\ngit clone \"git@github.com:chrisgrieser/obsidian-quadro.git\"\njust init\n```\n\n```bash\njust format    # run all formatters\njust build     # builds the plugin\njust check-all # runs the pre-commit hook (without committing)\n```\n\n\u003e [!NOTE]\n\u003e This repo uses a pre-commit hook, which prevents commits that do not pass all\n\u003e the checks.\n\n### CSS classes\nEvery single modal, prompt, settings-tab, or button added by this plugin has\nthe class `.quadro`, so theme designers can easily change the appearance of this\nplugin.\n\n\u003c!-- vale Google.FirstPerson = NO --\u003e\n## Credits\n\n### Acknowledgments\nThanks to [Ryan Murphy](https://fulcra.design/About/) who gave me the idea for this\nproject with a [blog post of\nhis](https://fulcra.design/Posts/An-Integrated-Qualitative-Analysis-Environment-with-Obsidian/).\n\n### Recommended citation of this project\nPlease cite this software project as (APA):\n\n```txt\nGrieser, C. (2024). Quadro – Qualitative Data Analysis Realized in Obsidian [Computer software]. \nhttps://github.com/chrisgrieser/obsidian-qualitative-data-analysis\n```\n\n### About the developer\nI am a sociologist studying the social mechanisms underlying the\ndigital economy. For my PhD project, I investigate the governance of the app\neconomy and how software ecosystems manage the tension between innovation and\ncompatibility. If you are interested in this subject, feel free to get in touch.\n\n- [Academic Website](https://chris-grieser.de/)\n- [ResearchGate](https://www.researchgate.net/profile/Christopher-Grieser)\n- [Mastodon](https://pkm.social/@pseudometa)\n- [LinkedIn](https://www.linkedin.com/in/christopher-grieser-ba693b17a/)\n\n_For bug reports and features requests, please use the [GitHub issue tracker](https://github.com/chrisgrieser/obsidian-quadro/issues)._\n\n\u003ca href='https://ko-fi.com/Y8Y86SQ91' target='_blank'\u003e \u003cimg height='36'\nstyle='border:0px;height:36px;' src='https://cdn.ko-fi.com/cdn/kofi1.png?v=3'\nborder='0' alt='Buy Me a Coffee at ko-fi.com'/\u003e\u003c/a\u003e\n\n[^1]: Note that the timestamp is assigned the _first time_ the paragraph is\n\tassigned a code. The timestamp is not updated when the paragraph you remove\n\tthe code or assign another code, since the paragraph ID needs to be\n\timmutable to ensure reliable references to it. Think of the timestamp as\n\t\"first time the paragraph a code has been assigned\".\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisgrieser%2Fobsidian-quadro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchrisgrieser%2Fobsidian-quadro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisgrieser%2Fobsidian-quadro/lists"}