aqda 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
aqda-0.3.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Timo Seidl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
aqda-0.3.1/PKG-INFO ADDED
@@ -0,0 +1,308 @@
1
+ Metadata-Version: 2.4
2
+ Name: aqda
3
+ Version: 0.3.1
4
+ Summary: AQDA — Augmented Qualitative Data Analysis. Local-first QDA with AI.
5
+ Author: Timo Seidl
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/tseidl/aqda
8
+ Project-URL: Repository, https://github.com/tseidl/aqda
9
+ Project-URL: Issues, https://github.com/tseidl/aqda/issues
10
+ Keywords: qualitative-research,qda,coding,social-science,refi-qda
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: fastapi>=0.110
21
+ Requires-Dist: uvicorn[standard]>=0.27
22
+ Requires-Dist: python-multipart>=0.0.9
23
+ Requires-Dist: aiosqlite>=0.20
24
+ Requires-Dist: pdfplumber>=0.11
25
+ Requires-Dist: httpx>=0.27
26
+ Provides-Extra: audio
27
+ Requires-Dist: faster-whisper>=1.0; extra == "audio"
28
+ Provides-Extra: dev
29
+ Requires-Dist: ruff>=0.4; extra == "dev"
30
+ Requires-Dist: pytest>=8.0; extra == "dev"
31
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
32
+ Dynamic: license-file
33
+
34
+ # AQDA — Augmented Qualitative Data Analysis
35
+
36
+ **A free, open-source tool for qualitative researchers. AI-powered, local-first, privacy-respecting.**
37
+
38
+ AQDA gives you a modern coding interface with local AI assistance — without cloud subscriptions, without your data ever leaving your machine. It runs as a local web app in your browser.
39
+
40
+ ![Python](https://img.shields.io/badge/python-3.10+-blue)
41
+ ![License](https://img.shields.io/badge/license-MIT-green)
42
+
43
+ ---
44
+
45
+ ## What Can AQDA Do?
46
+
47
+ ### Core Qualitative Coding
48
+
49
+ - **Text coding** — Select text, apply codes, build your codebook. Click on any coded passage to see applied codes or remove them.
50
+ - **Hierarchical codes** — Organize codes in parent-child trees with colors and descriptions. Drag and drop in the sidebar to re-parent or reorder.
51
+ - **Image & audio support** — Import images (JPG, PNG, GIF, WebP) and audio files (MP3, WAV, M4A) with optional local transcription via Whisper.
52
+ - **Memos** — Write analytical notes at the project, document, or code level. Anchor a memo to a specific passage and jump back to it, and reference codes or other memos inline by typing `@` — click a reference to jump straight to it.
53
+ - **Document variables & tags** — Add metadata (author, date, source) to documents, auto-extracted from filenames on import. Give a document a short tag (e.g. `INT`) shown next to it in the sidebar.
54
+ - **Coder identity** — Set your name in Settings; each coding records who made it, so collaborators show up as distinct coders in REFI-QDA exports.
55
+ - **Segments browser** — Browse all coded segments across documents. Click to jump to the passage in context, or delete directly from the list.
56
+ - **Export** — REFI-QDA (.qdpx) for MAXQDA/ATLAS.ti/NVivo, codebook (.qdc), CSV, JSON.
57
+
58
+ ### AI-Powered Augmentation
59
+
60
+ AQDA uses [Ollama](https://ollama.com) to run AI models locally on your computer. No internet connection required, no data shared with anyone.
61
+
62
+ | Feature | What it does |
63
+ |---------|-------------|
64
+ | **Topic Search** | Find passages across your documents that match a topic or theme you describe |
65
+ | **Code Suggest** | Given a code, find uncoded passages that might belong to it (from its definition and coded examples); review each and **Apply** or **Dismiss** it |
66
+ | **Consistency Check** | Flag coded segments that seem like outliers within a code — like inter-rater reliability with yourself over time |
67
+ | **Hierarchy Suggest** | After inductive coding, get suggestions for grouping your codes into parent categories |
68
+ | **Code Definition Generator** | Applied a code many times but haven't written a definition yet? Generate one from the actual coded passages |
69
+
70
+ When you click on an AI result, AQDA jumps to the passage in the document and highlights it, so you can immediately see the context and decide whether to code it.
71
+
72
+ Topic Search and Code Suggest cover text, PDF, and transcribed audio. Mark any document as **Reference** from its header (e.g. pre-coded examples or training material) to keep it out of AI results.
73
+
74
+ These tools are designed as a **methodological interlocutor** — they interrogate your coding rather than generate it. The researcher always has the final word.
75
+
76
+ ### Two Types of AI Models
77
+
78
+ AQDA uses two types of models for different purposes:
79
+
80
+ | Model type | What it does | Used by | Recommended model |
81
+ |-----------|-------------|---------|-------------------|
82
+ | **Embedding model** | Converts text into numerical representations so similar passages can be found | Topic Search, Code Suggest, Consistency Check | `nomic-embed-text` (fast, 274 MB) |
83
+ | **LLM (language model)** | Reads text and generates structured output (definitions, groupings) | Hierarchy Suggest, Define Code, Text Analysis | `qwen3.5:9b` (6 GB) |
84
+
85
+ You need one of each. They are configured in **Settings**.
86
+
87
+ ---
88
+
89
+ ## Getting Started
90
+
91
+ ### What You Need
92
+
93
+ - **Python 3.10 or newer**
94
+ - **pipx** (installs Python apps in isolated environments)
95
+ - **Chrome, Firefox, or Brave** — Safari has known issues with large file imports and downloads
96
+ - **Ollama** (optional, for AI features) — [ollama.com/download](https://ollama.com/download)
97
+
98
+ ### Install
99
+
100
+ Open a terminal and run:
101
+
102
+ ```bash
103
+ pipx install git+https://github.com/tseidl/aqda.git
104
+ ```
105
+
106
+ Already installed? Refresh AQDA to the current version with:
107
+
108
+ ```bash
109
+ pipx reinstall aqda
110
+ ```
111
+
112
+ Then start AQDA:
113
+
114
+ ```bash
115
+ aqda
116
+ ```
117
+
118
+ This opens your browser at `http://127.0.0.1:8765`. To stop, click **Close AQDA** in the
119
+ app. Pressing `Ctrl+C` once in the terminal is the equivalent safe shutdown.
120
+
121
+
122
+ <details>
123
+ <summary><strong>Don't have Python or pipx?</strong></summary>
124
+
125
+ **Mac:**
126
+ ```bash
127
+ # Install Homebrew (skip if you already have it)
128
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
129
+ ```
130
+ After Homebrew installs, it prints commands to add it to your PATH — copy and run those lines, then:
131
+ ```bash
132
+ brew install python pipx
133
+ pipx ensurepath
134
+ ```
135
+ Close and reopen Terminal, then install AQDA.
136
+
137
+ **Windows:**
138
+
139
+ Download Python from [python.org](https://www.python.org/downloads/) — **check "Add python.exe to PATH"** during installation. Then:
140
+ ```bash
141
+ pip install pipx
142
+ pipx ensurepath
143
+ ```
144
+ Close and reopen Command Prompt, then install AQDA.
145
+ </details>
146
+
147
+ <details>
148
+ <summary><strong>Getting "command not found" after install?</strong></summary>
149
+
150
+ Run `pipx ensurepath`, then **close and reopen your terminal**. This adds pipx's install directory to your PATH.
151
+ </details>
152
+
153
+ ### Setting Up AI Features (Optional)
154
+
155
+ 1. [Download and install Ollama](https://ollama.com/download)
156
+ 2. Open a terminal and pull the models:
157
+ ```bash
158
+ ollama pull nomic-embed-text # for similarity search
159
+ ollama pull qwen3.5:9b # for analysis and definitions
160
+ ```
161
+ 3. In AQDA, go to **Settings** and select your models under "Embedding Model" and "LLM Model"
162
+ 4. Open the **AI panel** (sparkle icon in the left sidebar)
163
+
164
+ All AI processing happens on your machine. Nothing is sent to any server.
165
+
166
+ ### Audio Transcription (Optional)
167
+
168
+ To transcribe audio files locally using Whisper:
169
+
170
+ ```bash
171
+ pipx inject aqda "aqda[audio]"
172
+ ```
173
+
174
+ Then import an audio file (MP3, WAV, M4A) and click the transcribe button.
175
+
176
+ ### Auto-Extract Metadata from Filenames (Optional)
177
+
178
+ If your files follow a naming convention, AQDA can automatically extract variables on import. In **Settings → Filename Variable Parsing**, set a regex pattern with named groups.
179
+
180
+ For example, files like `2025-03-10_guardian_from-border-crackdown.txt`:
181
+
182
+ ```
183
+ (?P<date>\d{4}-\d{2}-\d{2})_(?P<source>[^_]+)_(?P<title>.+)
184
+ ```
185
+
186
+ This extracts `date`, `source`, and `title` as document variables automatically when you import.
187
+
188
+ ### Updating
189
+
190
+ ```bash
191
+ pipx install --force git+https://github.com/tseidl/aqda.git
192
+ ```
193
+
194
+ ### Uninstalling
195
+
196
+ ```bash
197
+ pipx uninstall aqda
198
+ ```
199
+
200
+ This removes the app but keeps your data in `~/.aqda/`. To remove everything, also delete that folder.
201
+
202
+ ---
203
+
204
+ ## Your Data
205
+
206
+ AQDA saves every change immediately. There is no Save button. Its private working database
207
+ lives at `~/.aqda/aqda.db`; normal users never need to open or move this file.
208
+
209
+ - **Automatic backups** — AQDA keeps seven verified daily backups in `~/.aqda/backups/`
210
+ and creates an extra backup before migrations or replacing a project from a collaborator
211
+ - **Move or archive a project** with an `.aqda` snapshot from the Export menu
212
+ - **Deleted projects** go to a trash bin and can be restored
213
+
214
+ Do not put the live `aqda.db` in Google Drive, Dropbox, OneDrive, or a network folder.
215
+ AQDA's collaboration feature below provides the same convenient shared-folder experience
216
+ without exposing a live SQLite database to cloud-sync races.
217
+
218
+ To restore a full backup, close AQDA, keep the current `aqda.db` as an extra copy, and copy
219
+ the chosen backup into its place as `aqda.db`.
220
+
221
+ ### Collaboration — Google Drive, Dropbox, or a Shared Folder
222
+
223
+ Collaboration is designed to feel like opening the same document from a shared folder.
224
+ AQDA quietly uses a safe local working copy and syncs complete, closed snapshots in the
225
+ background. The local working copy lives with all your other projects inside the hidden
226
+ `~/.aqda/aqda.db` database; it is not another file you have to open or manage. You never
227
+ need to save manually.
228
+
229
+ **Set up a project:**
230
+
231
+ 1. Make a folder for that project or team inside Google Drive, Dropbox, OneDrive, your
232
+ university cloud, or another synced location.
233
+ 2. Open the project in AQDA and click **Collaborate**.
234
+ 3. Choose a previously saved location, or click **Choose another shared folder…** and select
235
+ the folder from step 1.
236
+ 4. On the other researcher's computer, add that same folder under
237
+ **Settings → Collaboration**.
238
+ 5. The project appears under **Shared projects available**; click **Open project** once.
239
+
240
+ AQDA remembers multiple collaboration locations. A project with one co-author can use a
241
+ Google Drive folder, another can use a university-cloud folder, and a third can use Dropbox;
242
+ clicking **Collaborate** lets you choose the appropriate location for each project. Each
243
+ project connects to one location at a time.
244
+
245
+ After that, both researchers open the project normally from AQDA's project list. Changes
246
+ save locally immediately and complete snapshots are published to the shared folder after a
247
+ short delay. Incoming changes appear automatically. Before replacing local project data,
248
+ AQDA creates and verifies a full safety backup.
249
+
250
+ If two people happen to work at the same time—or one computer was offline—AQDA detects the
251
+ two histories and keeps neither person's work from overwriting the other. The original shared
252
+ project remains your branch. AQDA creates exactly one clearly named **Collaborator reference**
253
+ project for each other branch and updates that same reference as new work arrives; it does not
254
+ make another copy or shared folder on every sync.
255
+
256
+ Treat the collaborator reference as a comparison copy, not a new place to code. To resolve it:
257
+
258
+ 1. Compare the two projects and agree which branch everyone will continue from.
259
+ 2. On a computer where the current shared project is the chosen branch, open the collaborator
260
+ reference and click **Keep my current shared version**. The reference moves to Trash.
261
+ 3. On a computer where the collaborator reference is the chosen branch, open it and click
262
+ **Use this version for collaboration**. AQDA creates a full backup, switches the shared
263
+ project, and keeps the previous local branch as a clearly named local archive.
264
+
265
+ This is an explicit choice rather than an automatic merge: qualitative coding decisions from
266
+ two branches cannot safely be guessed together.
267
+
268
+ Under the hood, the collaboration folder contains one `.aqda-project` folder with a complete
269
+ snapshot file for each participating computer. These are managed by AQDA; collaborators should
270
+ not rename or edit them manually. **Stop sharing** removes this computer's snapshot while keeping
271
+ its local project intact; starting collaboration again reuses the same managed project folder.
272
+
273
+ **Stopping AQDA:** use the **Close AQDA** button, or press Ctrl+C once in the terminal. Both
274
+ perform a graceful final sync. Closing only the browser tab leaves the local AQDA server
275
+ running, which is harmless; reopen `http://127.0.0.1:8765` to return. If the computer stops
276
+ unexpectedly, the hidden local copy is retained and syncs on the next launch.
277
+
278
+ > **Not supported:** automatically merging two independently edited versions into one.
279
+
280
+ For one-person local work, nothing changes: create a project, work normally, and close AQDA.
281
+ Everything autosaves; no files or caches need to be managed.
282
+
283
+ ---
284
+
285
+ ## Export Formats
286
+
287
+ | Format | Use case |
288
+ |--------|----------|
289
+ | `.aqda` | Save a standalone copy to send or archive — full AQDA round-trip import/export |
290
+ | `.qdpx` | REFI-QDA text exchange — import into MAXQDA, ATLAS.ti, NVivo |
291
+ | `.qdc` | Codebook XML — share code hierarchies between projects |
292
+ | `.csv` | Coded segments as a table — for further analysis in R, Excel, etc. |
293
+ | `.json` | Analysis data and document variables — for R, Python, or custom processing |
294
+
295
+ QDPX currently exports text and audio transcripts as text sources. Original audio and image
296
+ media are not embedded in the QDPX package; use `.aqda` when an exact AQDA round-trip is needed.
297
+
298
+ ---
299
+
300
+ ## License
301
+
302
+ MIT
303
+
304
+ ## Acknowledgments
305
+
306
+ Built with substantial assistance from [Claude Code](https://claude.ai/code) (Claude Opus 4.6 by [Anthropic](https://anthropic.com)). Architecture, backend, frontend, and AI integration were developed collaboratively through human-AI pair programming.
307
+
308
+ Inspired by [QualCoder](https://github.com/ccbogel/QualCoder) and the qualitative research community's need for modern, accessible, AI-augmented analysis tools.
aqda-0.3.1/README.md ADDED
@@ -0,0 +1,275 @@
1
+ # AQDA — Augmented Qualitative Data Analysis
2
+
3
+ **A free, open-source tool for qualitative researchers. AI-powered, local-first, privacy-respecting.**
4
+
5
+ AQDA gives you a modern coding interface with local AI assistance — without cloud subscriptions, without your data ever leaving your machine. It runs as a local web app in your browser.
6
+
7
+ ![Python](https://img.shields.io/badge/python-3.10+-blue)
8
+ ![License](https://img.shields.io/badge/license-MIT-green)
9
+
10
+ ---
11
+
12
+ ## What Can AQDA Do?
13
+
14
+ ### Core Qualitative Coding
15
+
16
+ - **Text coding** — Select text, apply codes, build your codebook. Click on any coded passage to see applied codes or remove them.
17
+ - **Hierarchical codes** — Organize codes in parent-child trees with colors and descriptions. Drag and drop in the sidebar to re-parent or reorder.
18
+ - **Image & audio support** — Import images (JPG, PNG, GIF, WebP) and audio files (MP3, WAV, M4A) with optional local transcription via Whisper.
19
+ - **Memos** — Write analytical notes at the project, document, or code level. Anchor a memo to a specific passage and jump back to it, and reference codes or other memos inline by typing `@` — click a reference to jump straight to it.
20
+ - **Document variables & tags** — Add metadata (author, date, source) to documents, auto-extracted from filenames on import. Give a document a short tag (e.g. `INT`) shown next to it in the sidebar.
21
+ - **Coder identity** — Set your name in Settings; each coding records who made it, so collaborators show up as distinct coders in REFI-QDA exports.
22
+ - **Segments browser** — Browse all coded segments across documents. Click to jump to the passage in context, or delete directly from the list.
23
+ - **Export** — REFI-QDA (.qdpx) for MAXQDA/ATLAS.ti/NVivo, codebook (.qdc), CSV, JSON.
24
+
25
+ ### AI-Powered Augmentation
26
+
27
+ AQDA uses [Ollama](https://ollama.com) to run AI models locally on your computer. No internet connection required, no data shared with anyone.
28
+
29
+ | Feature | What it does |
30
+ |---------|-------------|
31
+ | **Topic Search** | Find passages across your documents that match a topic or theme you describe |
32
+ | **Code Suggest** | Given a code, find uncoded passages that might belong to it (from its definition and coded examples); review each and **Apply** or **Dismiss** it |
33
+ | **Consistency Check** | Flag coded segments that seem like outliers within a code — like inter-rater reliability with yourself over time |
34
+ | **Hierarchy Suggest** | After inductive coding, get suggestions for grouping your codes into parent categories |
35
+ | **Code Definition Generator** | Applied a code many times but haven't written a definition yet? Generate one from the actual coded passages |
36
+
37
+ When you click on an AI result, AQDA jumps to the passage in the document and highlights it, so you can immediately see the context and decide whether to code it.
38
+
39
+ Topic Search and Code Suggest cover text, PDF, and transcribed audio. Mark any document as **Reference** from its header (e.g. pre-coded examples or training material) to keep it out of AI results.
40
+
41
+ These tools are designed as a **methodological interlocutor** — they interrogate your coding rather than generate it. The researcher always has the final word.
42
+
43
+ ### Two Types of AI Models
44
+
45
+ AQDA uses two types of models for different purposes:
46
+
47
+ | Model type | What it does | Used by | Recommended model |
48
+ |-----------|-------------|---------|-------------------|
49
+ | **Embedding model** | Converts text into numerical representations so similar passages can be found | Topic Search, Code Suggest, Consistency Check | `nomic-embed-text` (fast, 274 MB) |
50
+ | **LLM (language model)** | Reads text and generates structured output (definitions, groupings) | Hierarchy Suggest, Define Code, Text Analysis | `qwen3.5:9b` (6 GB) |
51
+
52
+ You need one of each. They are configured in **Settings**.
53
+
54
+ ---
55
+
56
+ ## Getting Started
57
+
58
+ ### What You Need
59
+
60
+ - **Python 3.10 or newer**
61
+ - **pipx** (installs Python apps in isolated environments)
62
+ - **Chrome, Firefox, or Brave** — Safari has known issues with large file imports and downloads
63
+ - **Ollama** (optional, for AI features) — [ollama.com/download](https://ollama.com/download)
64
+
65
+ ### Install
66
+
67
+ Open a terminal and run:
68
+
69
+ ```bash
70
+ pipx install git+https://github.com/tseidl/aqda.git
71
+ ```
72
+
73
+ Already installed? Refresh AQDA to the current version with:
74
+
75
+ ```bash
76
+ pipx reinstall aqda
77
+ ```
78
+
79
+ Then start AQDA:
80
+
81
+ ```bash
82
+ aqda
83
+ ```
84
+
85
+ This opens your browser at `http://127.0.0.1:8765`. To stop, click **Close AQDA** in the
86
+ app. Pressing `Ctrl+C` once in the terminal is the equivalent safe shutdown.
87
+
88
+
89
+ <details>
90
+ <summary><strong>Don't have Python or pipx?</strong></summary>
91
+
92
+ **Mac:**
93
+ ```bash
94
+ # Install Homebrew (skip if you already have it)
95
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
96
+ ```
97
+ After Homebrew installs, it prints commands to add it to your PATH — copy and run those lines, then:
98
+ ```bash
99
+ brew install python pipx
100
+ pipx ensurepath
101
+ ```
102
+ Close and reopen Terminal, then install AQDA.
103
+
104
+ **Windows:**
105
+
106
+ Download Python from [python.org](https://www.python.org/downloads/) — **check "Add python.exe to PATH"** during installation. Then:
107
+ ```bash
108
+ pip install pipx
109
+ pipx ensurepath
110
+ ```
111
+ Close and reopen Command Prompt, then install AQDA.
112
+ </details>
113
+
114
+ <details>
115
+ <summary><strong>Getting "command not found" after install?</strong></summary>
116
+
117
+ Run `pipx ensurepath`, then **close and reopen your terminal**. This adds pipx's install directory to your PATH.
118
+ </details>
119
+
120
+ ### Setting Up AI Features (Optional)
121
+
122
+ 1. [Download and install Ollama](https://ollama.com/download)
123
+ 2. Open a terminal and pull the models:
124
+ ```bash
125
+ ollama pull nomic-embed-text # for similarity search
126
+ ollama pull qwen3.5:9b # for analysis and definitions
127
+ ```
128
+ 3. In AQDA, go to **Settings** and select your models under "Embedding Model" and "LLM Model"
129
+ 4. Open the **AI panel** (sparkle icon in the left sidebar)
130
+
131
+ All AI processing happens on your machine. Nothing is sent to any server.
132
+
133
+ ### Audio Transcription (Optional)
134
+
135
+ To transcribe audio files locally using Whisper:
136
+
137
+ ```bash
138
+ pipx inject aqda "aqda[audio]"
139
+ ```
140
+
141
+ Then import an audio file (MP3, WAV, M4A) and click the transcribe button.
142
+
143
+ ### Auto-Extract Metadata from Filenames (Optional)
144
+
145
+ If your files follow a naming convention, AQDA can automatically extract variables on import. In **Settings → Filename Variable Parsing**, set a regex pattern with named groups.
146
+
147
+ For example, files like `2025-03-10_guardian_from-border-crackdown.txt`:
148
+
149
+ ```
150
+ (?P<date>\d{4}-\d{2}-\d{2})_(?P<source>[^_]+)_(?P<title>.+)
151
+ ```
152
+
153
+ This extracts `date`, `source`, and `title` as document variables automatically when you import.
154
+
155
+ ### Updating
156
+
157
+ ```bash
158
+ pipx install --force git+https://github.com/tseidl/aqda.git
159
+ ```
160
+
161
+ ### Uninstalling
162
+
163
+ ```bash
164
+ pipx uninstall aqda
165
+ ```
166
+
167
+ This removes the app but keeps your data in `~/.aqda/`. To remove everything, also delete that folder.
168
+
169
+ ---
170
+
171
+ ## Your Data
172
+
173
+ AQDA saves every change immediately. There is no Save button. Its private working database
174
+ lives at `~/.aqda/aqda.db`; normal users never need to open or move this file.
175
+
176
+ - **Automatic backups** — AQDA keeps seven verified daily backups in `~/.aqda/backups/`
177
+ and creates an extra backup before migrations or replacing a project from a collaborator
178
+ - **Move or archive a project** with an `.aqda` snapshot from the Export menu
179
+ - **Deleted projects** go to a trash bin and can be restored
180
+
181
+ Do not put the live `aqda.db` in Google Drive, Dropbox, OneDrive, or a network folder.
182
+ AQDA's collaboration feature below provides the same convenient shared-folder experience
183
+ without exposing a live SQLite database to cloud-sync races.
184
+
185
+ To restore a full backup, close AQDA, keep the current `aqda.db` as an extra copy, and copy
186
+ the chosen backup into its place as `aqda.db`.
187
+
188
+ ### Collaboration — Google Drive, Dropbox, or a Shared Folder
189
+
190
+ Collaboration is designed to feel like opening the same document from a shared folder.
191
+ AQDA quietly uses a safe local working copy and syncs complete, closed snapshots in the
192
+ background. The local working copy lives with all your other projects inside the hidden
193
+ `~/.aqda/aqda.db` database; it is not another file you have to open or manage. You never
194
+ need to save manually.
195
+
196
+ **Set up a project:**
197
+
198
+ 1. Make a folder for that project or team inside Google Drive, Dropbox, OneDrive, your
199
+ university cloud, or another synced location.
200
+ 2. Open the project in AQDA and click **Collaborate**.
201
+ 3. Choose a previously saved location, or click **Choose another shared folder…** and select
202
+ the folder from step 1.
203
+ 4. On the other researcher's computer, add that same folder under
204
+ **Settings → Collaboration**.
205
+ 5. The project appears under **Shared projects available**; click **Open project** once.
206
+
207
+ AQDA remembers multiple collaboration locations. A project with one co-author can use a
208
+ Google Drive folder, another can use a university-cloud folder, and a third can use Dropbox;
209
+ clicking **Collaborate** lets you choose the appropriate location for each project. Each
210
+ project connects to one location at a time.
211
+
212
+ After that, both researchers open the project normally from AQDA's project list. Changes
213
+ save locally immediately and complete snapshots are published to the shared folder after a
214
+ short delay. Incoming changes appear automatically. Before replacing local project data,
215
+ AQDA creates and verifies a full safety backup.
216
+
217
+ If two people happen to work at the same time—or one computer was offline—AQDA detects the
218
+ two histories and keeps neither person's work from overwriting the other. The original shared
219
+ project remains your branch. AQDA creates exactly one clearly named **Collaborator reference**
220
+ project for each other branch and updates that same reference as new work arrives; it does not
221
+ make another copy or shared folder on every sync.
222
+
223
+ Treat the collaborator reference as a comparison copy, not a new place to code. To resolve it:
224
+
225
+ 1. Compare the two projects and agree which branch everyone will continue from.
226
+ 2. On a computer where the current shared project is the chosen branch, open the collaborator
227
+ reference and click **Keep my current shared version**. The reference moves to Trash.
228
+ 3. On a computer where the collaborator reference is the chosen branch, open it and click
229
+ **Use this version for collaboration**. AQDA creates a full backup, switches the shared
230
+ project, and keeps the previous local branch as a clearly named local archive.
231
+
232
+ This is an explicit choice rather than an automatic merge: qualitative coding decisions from
233
+ two branches cannot safely be guessed together.
234
+
235
+ Under the hood, the collaboration folder contains one `.aqda-project` folder with a complete
236
+ snapshot file for each participating computer. These are managed by AQDA; collaborators should
237
+ not rename or edit them manually. **Stop sharing** removes this computer's snapshot while keeping
238
+ its local project intact; starting collaboration again reuses the same managed project folder.
239
+
240
+ **Stopping AQDA:** use the **Close AQDA** button, or press Ctrl+C once in the terminal. Both
241
+ perform a graceful final sync. Closing only the browser tab leaves the local AQDA server
242
+ running, which is harmless; reopen `http://127.0.0.1:8765` to return. If the computer stops
243
+ unexpectedly, the hidden local copy is retained and syncs on the next launch.
244
+
245
+ > **Not supported:** automatically merging two independently edited versions into one.
246
+
247
+ For one-person local work, nothing changes: create a project, work normally, and close AQDA.
248
+ Everything autosaves; no files or caches need to be managed.
249
+
250
+ ---
251
+
252
+ ## Export Formats
253
+
254
+ | Format | Use case |
255
+ |--------|----------|
256
+ | `.aqda` | Save a standalone copy to send or archive — full AQDA round-trip import/export |
257
+ | `.qdpx` | REFI-QDA text exchange — import into MAXQDA, ATLAS.ti, NVivo |
258
+ | `.qdc` | Codebook XML — share code hierarchies between projects |
259
+ | `.csv` | Coded segments as a table — for further analysis in R, Excel, etc. |
260
+ | `.json` | Analysis data and document variables — for R, Python, or custom processing |
261
+
262
+ QDPX currently exports text and audio transcripts as text sources. Original audio and image
263
+ media are not embedded in the QDPX package; use `.aqda` when an exact AQDA round-trip is needed.
264
+
265
+ ---
266
+
267
+ ## License
268
+
269
+ MIT
270
+
271
+ ## Acknowledgments
272
+
273
+ Built with substantial assistance from [Claude Code](https://claude.ai/code) (Claude Opus 4.6 by [Anthropic](https://anthropic.com)). Architecture, backend, frontend, and AI integration were developed collaboratively through human-AI pair programming.
274
+
275
+ Inspired by [QualCoder](https://github.com/ccbogel/QualCoder) and the qualitative research community's need for modern, accessible, AI-augmented analysis tools.
@@ -0,0 +1,3 @@
1
+ """AQDA - Open-source qualitative data analysis tool."""
2
+
3
+ __version__ = "0.3.1"
@@ -0,0 +1,59 @@
1
+ """Entry point for running AQDA as a module or via the console script."""
2
+
3
+ import argparse
4
+ import threading
5
+ import webbrowser
6
+
7
+ import uvicorn
8
+
9
+ from aqda import __version__
10
+
11
+ DEFAULT_HOST = "127.0.0.1"
12
+ DEFAULT_PORT = 8765
13
+
14
+
15
+ # Build the argument parser for the `aqda` console script.
16
+ def build_parser():
17
+ parser = argparse.ArgumentParser(
18
+ prog="aqda",
19
+ description="AQDA — Augmented Qualitative Data Analysis. "
20
+ "Starts the local web app and opens it in your browser.",
21
+ )
22
+ parser.add_argument("--version", action="version", version=f"aqda {__version__}")
23
+ parser.add_argument(
24
+ "--host", default=DEFAULT_HOST, help=f"Interface to bind (default: {DEFAULT_HOST})"
25
+ )
26
+ parser.add_argument(
27
+ "--port", type=int, default=DEFAULT_PORT, help=f"Port to bind (default: {DEFAULT_PORT})"
28
+ )
29
+ parser.add_argument(
30
+ "--no-browser", action="store_true", help="Do not open a browser window on startup"
31
+ )
32
+ return parser
33
+
34
+
35
+ def main():
36
+ args = build_parser().parse_args()
37
+
38
+ # Open browser after a short delay to let the server start
39
+ def open_browser():
40
+ import time
41
+
42
+ time.sleep(1.5)
43
+ webbrowser.open(f"http://{args.host}:{args.port}")
44
+
45
+ if not args.no_browser:
46
+ threading.Thread(target=open_browser, daemon=True).start()
47
+
48
+ print(f"\n AQDA is running at http://{args.host}:{args.port}\n")
49
+ from aqda.app import app
50
+
51
+ config = uvicorn.Config(app, host=args.host, port=args.port, log_level="warning")
52
+ server = uvicorn.Server(config)
53
+ app.state.uvicorn_server = server
54
+ # uvicorn exits with status 3 itself if the port is already in use.
55
+ server.run()
56
+
57
+
58
+ if __name__ == "__main__":
59
+ main()